
[英]Position element over image element but the image changes size with the window
[英]Position element over background image. But the BG img changes size with the window. CSS
我有一个背景图像,该图像的大小更改为窗口大小,并且我需要在其上放置一个元素,以使其相对于背景图像始终位于同一位置。
怎么样!?
的CSS
background:url("http://placehold.it/100x100") no-repeat center center fixed;
-webkit-background-size:"cover";
-moz-background-size:"cover";
-o-background-size:"cover";
background-size:"cover";
背景图像覆盖了整个背景,并随窗口而改变了大小,但是通过覆盖一些图像来保持比例。
编辑-2016
我使用纯CSS的解决方案是将元素放置在中间,然后使用calc函数正确偏移它。 然后相应地调整大小,我使用vmin值:
$offset-top: ...;
$offset-left: ...;
.element {
top: 50%;
left: 50%;
transform: translate(calc(-50% + #{$offset-top}), calc(-50% + #{$offset-top}));
width: 50vim;
height: 50vim;
}
您所要求的根本不是一件小事,它基本上涉及弄清楚background-size:cover
工作原理,然后使用JavaScript定位元素。 由于background-size:cover
的性质,请注意图像如何流出x轴或y轴,这是CSS无法完成的。
这是我对问题的解决方案,在加载和调整大小时,它会计算图像的比例和x或y偏移量,并在相关位置绘制指针。
的HTML
<div id="pointer"></div>
的CSS
body {
background:url(https://www.google.com.au/images/srpr/logo4w.png) no-repeat center center fixed;
-webkit-background-size:cover;
-moz-background-size:cover;
-o-background-size:cover;
background-size:cover;
}
#pointer {
margin-left:-10px;
margin-top:-10px;
width:20px;
height:20px;
background-color:#F00;
position:fixed;
}
JS
var image = { width: 550, height: 190 };
var target = { x: 184, y: 88 };
var pointer = $('#pointer');
$(document).ready(updatePointer);
$(window).resize(updatePointer);
function updatePointer() {
var windowWidth = $(window).width();
var windowHeight = $(window).height();
// Get largest dimension increase
var xScale = windowWidth / image.width;
var yScale = windowHeight / image.height;
var scale;
var yOffset = 0;
var xOffset = 0;
if (xScale > yScale) {
// The image fits perfectly in x axis, stretched in y
scale = xScale;
yOffset = (windowHeight - (image.height * scale)) / 2;
} else {
// The image fits perfectly in y axis, stretched in x
scale = yScale;
xOffset = (windowWidth - (image.width * scale)) / 2;
}
pointer.css('top', (target.y) * scale + yOffset);
pointer.css('left', (target.x) * scale + xOffset);
}
我将不得不猜测您的标记,但是假设您在背景图像中有一些容器,而其他也需要居中的图像位于其中,如下所示:
<div class="holdBGimg">
<img src="image.jpg">
</div>
您可以执行以下操作:
.holdBGimg {
position: relative;
}
.holdBGimg img {
width: 100px;
height: 100px;
position: absolute;
top: 50%;
left: 50%;
margin-top: -50px;
margin-left: -50px;
}
通过从相对边距中减去一半的测量值来补偿高度和宽度的偏移量。
如果您希望对其进行扩展,则解决方案可能更多:
.holdBGimg {
position: relative;
}
.holdBGimg img {
width: 20%;
height: 20%;
position: absolute;
top: 40%;
left: 40%;
}
这完全取决于您要居中的图像的大小。
添加居中容器:
#container {
position: fixed;
width: 0;
height: 0;
top: 50%;
left: 50%;
overflow: visible;
}
然后添加position: relative
里面的position: relative
元素。
相对(可缩放,响应,在此处插入嗡嗡声)单位(%)。
响应式设计需要大量工作。 您必须根据窗口大小测试要对齐的图像区域,然后根据窗口大小将这些值与元素放置位置匹配。 但是封面与图像本身的长宽比不符,与宽度或高度都匹配。 因此,根据窗口的长宽比,它会弄乱您的布局。
您可以尝试使用jQuery和javascript获取窗口的尺寸,然后jquery将图像的尺寸与此匹配,并更改元素的尺寸。 很多编码工作,在页面加载上都很困难,但是我们必须做出牺牲,不是吗?
我会为您要放置在背景上的道具创建一个位置数组。 在完整尺寸的背景图片中使用x和y位置...
var propPositions = [
{ name: "StoveBurner1", x: 23, y: 566 },
{ name: "StoveBurner2", x: 676, y: 456 },
{ name: "TableChair1", x: 765, y: 35 },
...
];
您还需要保持全尺寸的背景尺寸,以便可以在尺寸变化时使用它来计算比例因子。
var fullBackgroundSize = { width: 1920, height: 1080 };
当图像尺寸改变时,计算缩放比例,然后缩放数组中每个元素的x和y位置...
for (var i = 0; i < propPositions.length; i++)
{
propPositions[i].x *= scalingFactor;
propPositions[i].y *= scalingFactor;
}
无论图像大小如何,这都可以使您精确定位所有道具。
这也使您可以按名称查找职位,这将使您能够执行...
placeObject(pot1, "StoveBurner1");
placeObject(pot2, "StoveBurner2");
placeObject(SittingPerson, "TableChair1");
这样,唯一可以计算位置并将对象移动到这些位置的代码都在一个小函数中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.