使用jQuery动画改变宽度时出现奇怪的“抖动”效果(仅在Chrome中!)

7

我正在使用jQuery对一个li元素的宽度进行动画处理,代码非常简单。我使用hover()作为事件处理程序,并使用.animate()来实现宽度动画效果。以下是我的代码。

$('li').each(function() {
    //store the original width of the element in a variable
    var oldWidth = $(this).width();
    $(this).hover(
        function() {
            //when the mouse enters the element, animate width to 900px
            $(this).animate({width: '900px'}, 600, 'linear')
        },
    function() {
            //when the mouse leaves, animate back to the original width
            $(this).animate({width: oldWidth}, 350, 'linear')
        }
   );
}); 

这段代码非常简单,而且效果很好,但在Chrome中有一个非常奇怪的问题。当元素进入和退出时,li元素会“摇晃”,就像它们非常寒冷并在颤抖。您可以在此处查看实际行为:http://missmd.org/(编辑:现已修复错误)。
我以前使用jQuery动画了很多东西,从未看到过这种行为。是否有任何解释为什么会发生这种情况以及如何避免它?我想知道是否因为我将元素浮动到右侧并进行向左动画。这个漏洞令人疯狂,并且在很大程度上削弱了整体表现(至少对我来说是这样)。其他人之前见过吗? 编辑澄清:实际上不是li元素本身在“颤抖”,而是其中的文本在动画运行时稍微向左右晃动,非常明显。我感到困惑。

编辑2:稍微调整了一下 CSS,现在我只能在Chrome(21.0.1180.60 beta-m)中重现这种效果。在Firefox中,它按预期工作。在IE中也很好用。非常讽刺的是,Chrome(通常在这方面做得很好)现在给我带来了麻烦。拔掉头发,检查理智

这是我的HTML代码,以帮助解决问题。我们已经在ChrisFrancis的jsFiddle中重现了这个问题。

<nav>
    <ul class="nav">
        <li class="one">
            <a href="homeandnews/">
                <span class="title">Home and News</span>
                <br/>
                <span class="subtitle">Learn more about me and read general updates!</span>
            </a>
        </li>
    </ul>
<nav>

我完全被难住了。这可能也是Chrome/V8 JS引擎中的一个bug,我们无法做任何事情。


2
我没有看到这种行为。也许当我尝试的时候是比较温暖的? - chrisfrancis27
1
虽然我无法重现这个问题,但听起来像是像素舍入错误。但我只在元素的一个边缘向一个方向进行动画,并通过相反的方式对其进行补偿以调整内容位置时才看到过这种情况发生... - chrisfrancis27
1
我在这里组合了一个测试案例,其中包含两个示例 - 其中一个示例中的动画持续时间相差1毫秒,这将导致一些抖动像素的混乱,而第二个示例的持续时间是相同的,理论上不应该有抖动。你能在你的Chrome浏览器上测试一下吗? - chrisfrancis27
1
这是Chrome的一个bug!!!success.jpg他们在某些地方搞砸了。看来我并不是疯了。那么,有人想提交bug报告吗?还是由我来提交?ChrisFrancis,我想你应该先来。 - wnajar
1
哈哈,好的我在做了。我会尝试创建一个可重现的测试用例,类似于您的网站 - 我的 JSFiddle 在新更新中实际上使用更好的有意的像素舍入错误... :/ - chrisfrancis27
显示剩余10条评论
5个回答

5
我也在研究这个问题,然后发现这段代码:-webkit-backface-visibility: hidden; 能解决我的问题。我在使用CSS3对SVG进行旋转时出现了奇怪的抖动。
更多信息可以在这里找到:CSS3 transform rotate causing 1px shift in Chrome 希望能对您有所帮助。

这个做法很好,谢谢!在应用了过渡效果的 box-shadow hover 效果之后,出现了水平残留线(伪影)。 - Max

4
我改变了你的css:ul.nav li a,加上float: right,这样就解决了抖动问题。
无论如何,如果有帮助的话,当我在另一个高度为auto的div中动画调整高度时,也遇到了同样的问题。将高度改为固定宽度解决了这个问题。
希望能有所帮助。

2
这似乎是Chrome版本21.0.1180.60中的一个错误,其他版本也可能存在。这里的代码没有问题,我想我们只能采取解决方法或现在提交错误报告。 唉。

1
好的,我已经提交了一个Chromium的bug报告 - 如果你感兴趣,可以在这里跟踪它! :) - chrisfrancis27
太棒了!我一定会追踪它。 - wnajar
1
哇,感谢您填写错误报告,这是一个大问题,:(我的一些动画表现得很奇怪 :( - Daniel Esteban Hernandez
+1,之前运行良好的一个动画,在包括 Webkit 的“兄弟”Safari 在内的其他浏览器中仍然正常工作,现在出现了奇怪的颤抖效果。 - José Fernandes

1

当父级标签应用了CSS过渡效果时,SVG抖动问题与此类似。我尝试随机应用所有可能的方法,最终这个修复方法帮助了我:

svg {
  transform: translate3d(0, 0, 0);
}

这对我有用。我有 <img src="mysvg.svg">,将 transform: translate3d(0, 0, 0); 应用于它可以解决抖动问题。 - GTCrais

0

当我尝试在一个 div 中动画另一个 div 时,出现了一些问题。我注意到,如果这个 div 或元素具有 CSS 属性 display:inline-block,就会出现这种情况。将该元素浮动可以解决问题,但在我的情况下需要使用 inline-block

我注意到该元素还具有 vertical-align:middle 的 CSS 属性。将其更改为 vertical-align:text-bottom 可以解决问题。在 Chrome v23 中不再出现抖动效果(可能在更新版本中仍存在此 bug)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接