我有一个父元素和一个子元素。在窗口调整大小事件中,子元素的宽度和高度设置为父元素的offsetWidth和offsetHeight,但是在每隔一次调整大小时,Firefox上的宽度和高度都是12px,Edge上是15px。
下面是代码,当你调整页面大小时,右边有一个白色的间隙:
const parent = document.getElementById("parent");
const child = document.getElementById("child");
const matchDimensions = () => {
child.style.width = parent.offsetWidth + "px";
child.style.height = parent.offsetHeight + "px";
};
matchDimensions();
window.addEventListener("resize", matchDimensions);
html, body, #parent {
width: 100%;
height: 100%;
margin: 0;
}
#child {
background: red;
}
<div id="parent">
<div id="child"></div>
</div>
奇怪的是,只有当我缩小页面时,它才会发生,而当我扩大它时,它就不会发生。此外,删除margin: 0
可以阻止这种情况发生,但我需要它,以便让父级填充整个页面。
我之所以使用JS来匹配子对象和父对象,是因为实际上子对象是一个画布,它不会自动调整大小,而只使用CSS。
4条答案
按热度按时间fd3cxomn1#
参考我的评论,我更新了你的Javascript代码来计算滚动条的宽度,将结果添加到child中。样式。宽度等去掉差距。
vktxenjb2#
可能浏览器有一些默认的样式设置,因为它会随着视口的大小而改变行为。
您可以尝试使用css reset(一个例子)或normalize来看看是否可以解决这个问题。
wr98u20j3#
这里的问题很可能是由浏览器如何处理子像素渲染引起的,这可能会导致元素大小的微小波动。要解决这个问题,请使用数学。round()函数将宽度和高度值四舍五入到最接近的整数。以下是如何更改matchDimensions()函数来实现这一点:
JavaScript:
这应该有助于消除Firefox和Edge中出现的右侧白色间隙。此外,如果需要保留父元素的边距,可以添加框大小规则,以便在计算元素的总宽度和高度时包括边距:
CSS:
通过这些修改,子元素应该动态调整大小以匹配父元素的尺寸,而不会出现任何间隙或像素偏移问题。
pod7payv4#
我想我弄明白了。简单的解决方法是将
overflow: hidden
添加到父节点,这实际上是有意义的。由于子元素有固定的宽度,当页面调整大小时,首先要改变的是父元素,但是由于固定的宽度,子元素不能移动,因此它溢出到主体之外,这增加了一个滚动条。然后,事件被滚动条触发,因为父级的宽度现在小得多,子级继承了它,这阻止了它溢出,因此滚动条消失了。显然,这发生得非常快,这就是为什么它不明显。这也解释了为什么它只发生在收缩窗口而不是扩展窗口的时候,因为扩展窗口不会导致溢出。