我正在尝试使用 CSS 3D 转换使我的背景图像更加生动,这个想法是采用众所周知的“登录页面全屏背景图像,带有带有屏幕截图的笔记本电脑(在咖啡店中)”并使其更具动态性:只是一个屏幕截图,放置一个带有实际实时 HTML 页面的 iframe,并使其完全适合背景图像中的拍摄项目(例如笔记本电脑屏幕)。
这有两个挑战:
- 仅根据屏幕尺寸计算背景图像中点位置的能力
- 能够进行与背景图像中的笔记本电脑屏幕相匹配的 3D 旋转
这是背景定义的方式:
.splash {
text-align: center;
background-position: 50% 20%;
background-size: cover;
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
background-image: url(/assets/themes/twitter/bootstrap/img/scala_tutorials_screenshot2.jpg);
}
背景图片尺寸为:1280 X 850
我设法以某种方式克服了其中一些要求,但以一种非常暴力的方式,
- 固定百分比的左侧位置有效,可能是因为它的宽度大于它的高度
- 顶部位置是最难的:我测量了从笔记本电脑屏幕顶部到浏览器窗口顶部边缘的距离(它是绝对的“顶部”值)并记录了屏幕的宽度和高度。并附带一个 2 变量公式(使用 excel、线性回归趋势线和一些基本数学)
公式代码:
var w = window.innerWidth;
var h = window.innerHeight;
var a = 0.0000146552*h - 0.0245612;
var b = 0.177328 * h + 9.0294;
console.log("formula: " + a + " * w + " + b);
var top = Math.round(a * w + b);
vidEl.style.top = top + "px";
vidEl.style.height = Math.round((vidEl.offsetWidth / 1.438689132444542)) + "px";
但是,此解决方案存在多个问题
- 它不适用于所有屏幕分辨率,背景的缩放比例与某些分辨率不同,(尤其是在 4:3 比例下)背景不会像公式预期的那样增长/缩小
- 如果假设我有一个不同的屏幕截图,那么再次执行此操作真的很乏味,解决方案真的不通用
- 即使我知道图像中笔记本电脑屏幕的 4 个点的确切坐标,我也无法在 CSS 中简单地在其上放置一个 div,我必须尝试使用
rotateX
,rotateY
和rotateZ
(andperspective-origin
) 才能匹配,并且匹配不准确 - 由于一些透视起源的怪癖,我需要补偿更大的屏幕,这会导致一些丑陋的代码,如下所示:
调整黑客(是的,我知道它很丑,并且可能可以减少它/以某种方式与上述公式合并)
if(w >= 1200) {
if(w < 1400) {
element.style.top = "-10px";
} else if (w < 1600) {
element.style.top = "-13px";
} else if (w < 1700) {
element.style.top = "-15px";
} else if (w < 1800) {
element.style.top = "-17px";
} else {
element.style.top = "-19px";
}
} else {
element.className = "";
}
示例: 您可以看到我到目前为止所做的 需要屏幕宽度超过 1200 像素
问题:
有没有办法有一个通用公式,即对于背景图像中的任何给定原始位置(例如屏幕角的 4 个点),给定背景图像的原始大小、
background-position
定义、屏幕宽度和高度来找到新的坐标匹配背景图片?我不想对
rotateX
Y 和 Z 进行猜测,而是能够自动计算 X、Y 和 Z 旋转值,这将旋转 DIV 以准确覆盖给定的一组 4 个 2D 坐标(例如笔记本电脑屏幕)