【发布时间】:2017-08-03 06:38:00
【问题描述】:
我有一个使用 margin: 0 auto 的居中 div 层,固定宽度为 width: 1000px,开始向下滚动时将变为 width: 100%,并带有一个过渡以使其看起来不错。
问题是,一些内容在过渡期间开始抖动和抖动。我说一些内容,因为例如图像抖动,而H1文本不会 这只发生在 Chrome 和 Edge 中。 (在 Windows 10 上测试)。
做了一些研究,我发现 Chrome 过去在不使用硬件加速时存在过渡问题,导致闪烁。据我了解,谷歌已经在 2 年前解决了这个问题。
我尝试了各种解决方法,尝试触发硬件加速,但没有任何效果。
从我目前了解到的情况来看,这种抖动/晃动问题仅发生在 div 层使用具有固定宽度的margin: 0 auto 居中,然后该元素转换为width: 100% 时。
一个奇怪的问题,在 JSFiddle 中重新创建演示代码时,我似乎无法始终在我的系统上重现它。
这里是 JSFiddle:https://jsfiddle.net/aobrien/vc4n8ecy/
只需向下滚动并注意 chrome 徽标是如何晃动的。您可能需要上下滚动才能注意到它,具体取决于您的屏幕尺寸。
注意:这似乎仅在您的屏幕宽度约为 1700 像素或更高时才可见,因此请确保您的浏览器处于全宽状态。将浏览器窗口缩放到 80% 也会触发此问题。
//jQuery to add sticky class when scrolling
$(window).scroll(function() {
if ($(this).scrollTop() > 1) {
$('.header').addClass("sticky");
} else {
$('.header').removeClass("sticky");
}
});
body {
height: 2000px;
}
.header {
background: #335C7D;
margin: 0 auto;
width: 1000px;
transition: width .6s ease;
height: 200px;
}
.sticky {
position: fixed;
width: 100%;
left: 0;
right: 0;
will-change: width;
}
.wrap {
width: 1000px;
margin: 0 auto;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="container">
<div class="header">
<div class="wrap">
<img src="https://i.stack.imgur.com/iaYsc.png" />
<h1> Hello World.</h1>
</div>
</div>
</div>
这似乎是实现带有过渡的全宽粘性菜单的非常简单直接的方法。
会不会是使用margin: 0 auto 和宽度变化,导致重新计算居中的 div 层出现问题?
到目前为止,我所有解决此问题或寻找解决方法的尝试都失败了。
【问题讨论】:
-
感谢您的反对,考虑到它是 chrome 的一个合法 CSS 错误,似乎没有人在任何地方提到它,甚至没有找到解决方法。
-
有时我想打那些无缘无故否决投票的人的脸。这是 chrome/css 中的一个真正的错误,尚未报告,互联网上零个人在谈论它。人们没有帮助找到解决方法,而是投了反对票。热爱这里的社区。span>
-
我现在遇到了一个类似的问题,即当我使用 javascript (stackoverflow.com/questions/60979458/…) 更改覆盖层的宽度时,会导致 Google Chrome 的屏幕抖动。
标签: css google-chrome css-transitions