为啥我的 CSS3 动画在 Google Chrome 中不流畅(但在其他浏览器上非常流畅)?
Posted
技术标签:
【中文标题】为啥我的 CSS3 动画在 Google Chrome 中不流畅(但在其他浏览器上非常流畅)?【英文标题】:Why isn't my CSS3 animation smooth in Google Chrome (but very smooth on other browsers)?为什么我的 CSS3 动画在 Google Chrome 中不流畅(但在其他浏览器上非常流畅)? 【发布时间】:2016-10-04 10:15:07 【问题描述】:我的环境(我得到滞后的地方):
Chrome 版本 50.0.2661.102(64 位)上的 Mac OSX El Capitan 10.11.2
CODEPEN:
http://codepen.io/vieron/pen/hnEev
动画:
情况:
我用谷歌搜索了很多,但没有找到任何适合我的东西。我知道以前有人问过这个问题。
当我用 Safari 和 Firefox 打开网站时,我的 Mac 上的 CSS3 动画很流畅,但用 Chrome 就不行!
奇怪的是,原来的 CodePen 在 Chrome 上是流畅的。
问题:
我的代码中的某些内容导致动画仅在 Chrome 上不稳定。它是什么,我该如何解决?
我看到了什么:
Chrome CSS 3 Transition Not Smooth我需要我的定位是相对的,以适应不同的屏幕尺寸。
CSS3 transition not smooth in Chrome
http://blog.teamtreehouse.com/create-smoother-animations-transitions-browser
https://www.binarymoon.co.uk/2014/02/fixing-css-transitions-in-google-chrome/
http://blog.teamtreehouse.com/create-smoother-animations-transitions-browser
代码:
<div class="marquee">
<ul>
<li>
<a href="https://developer.apple.com/swift/"><img class="marquee-itm" src="Vendors/Images/Apple_Swift_Logo.png" /></a>
<a href="https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/Introduction/Introduction.html"><img class="marquee-itm" src="Vendors/Images/Objective-c-logo.png" /></a>
<a href="https://developer.apple.com/swift/"><img class="marquee-itm" src="Vendors/Images/Apple_Swift_Logo.png" /></a>
<a href="https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/Introduction/Introduction.html"><img class="marquee-itm" src="Vendors/Images/Objective-c-logo.png" /></a>
<a href="https://developer.apple.com/swift/"><img class="marquee-itm" src="Vendors/Images/Apple_Swift_Logo.png" /></a>
<a href="https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/Introduction/Introduction.html"><img class="marquee-itm" src="Vendors/Images/Objective-c-logo.png" /></a>
<a href="https://developer.apple.com/swift/"><img class="marquee-itm" src="Vendors/Images/Apple_Swift_Logo.png" /></a>
<a href="https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/Introduction/Introduction.html"><img class="marquee-itm" src="Vendors/Images/Objective-c-logo.png" /></a>
</li>
<li>
<a href="https://developer.apple.com/swift/"><img class="marquee-itm" src="Vendors/Images/Apple_Swift_Logo.png" /></a>
<a href="https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/Introduction/Introduction.html"><img class="marquee-itm" src="Vendors/Images/Objective-c-logo.png" /></a>
<a href="https://developer.apple.com/swift/"><img class="marquee-itm" src="Vendors/Images/Apple_Swift_Logo.png" /></a>
<a href="https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/Introduction/Introduction.html"><img class="marquee-itm" src="Vendors/Images/Objective-c-logo.png" /></a>
<a href="https://developer.apple.com/swift/"><img class="marquee-itm" src="Vendors/Images/Apple_Swift_Logo.png" /></a>
<a href="https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/Introduction/Introduction.html"><img class="marquee-itm" src="Vendors/Images/Objective-c-logo.png" /></a>
<a href="https://developer.apple.com/swift/"><img class="marquee-itm" src="Vendors/Images/Apple_Swift_Logo.png" /></a>
<a href="https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/Introduction/Introduction.html"><img class="marquee-itm" src="Vendors/Images/Objective-c-logo.png" /></a>
</li>
<li>
<a href="https://developer.apple.com/swift/"><img class="marquee-itm" src="Vendors/Images/Apple_Swift_Logo.png" /></a>
<a href="https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/Introduction/Introduction.html"><img class="marquee-itm" src="Vendors/Images/Objective-c-logo.png" /></a>
<a href="https://developer.apple.com/swift/"><img class="marquee-itm" src="Vendors/Images/Apple_Swift_Logo.png" /></a>
<a href="https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/Introduction/Introduction.html"><img class="marquee-itm" src="Vendors/Images/Objective-c-logo.png" /></a>
<a href="https://developer.apple.com/swift/"><img class="marquee-itm" src="Vendors/Images/Apple_Swift_Logo.png" /></a>
<a href="https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/Introduction/Introduction.html"><img class="marquee-itm" src="Vendors/Images/Objective-c-logo.png" /></a>
<a href="https://developer.apple.com/swift/"><img class="marquee-itm" src="Vendors/Images/Apple_Swift_Logo.png" /></a>
<a href="https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/Introduction/Introduction.html"><img class="marquee-itm" src="Vendors/Images/Objective-c-logo.png" /></a>
</li>
</ul>
</div>
CSS
*
margin: 0;
padding: 0;
@-webkit-keyframes loop
0%
-moz-transform: translateX(0);
-ms-transform: translateX(0);
-webkit-transform: translateX(0);
transform: translateX(0);
100%
-moz-transform: translateX(-66.6%);
-ms-transform: translateX(-66.6%);
-webkit-transform: translateX(-66.6%);
transform: translateX(-66.6%);
@-moz-keyframes loop
0%
-moz-transform: translateX(0);
-ms-transform: translateX(0);
-webkit-transform: translateX(0);
transform: translateX(0);
100%
-moz-transform: translateX(-66.6%);
-ms-transform: translateX(-66.6%);
-webkit-transform: translateX(-66.6%);
transform: translateX(-66.6%);
@-ms-keyframes loop
0%
-moz-transform: translateX(0);
-ms-transform: translateX(0);
-webkit-transform: translateX(0);
transform: translateX(0);
100%
-moz-transform: translateX(-66.6%);
-ms-transform: translateX(-66.6%);
-webkit-transform: translateX(-66.6%);
transform: translateX(-66.6%);
@keyframes loop
0%
-moz-transform: translateX(0);
-ms-transform: translateX(0);
-webkit-transform: translateX(0);
transform: translateX(0);
100%
-moz-transform: translateX(-66.6%);
-ms-transform: translateX(-66.6%);
-webkit-transform: translateX(-66.6%);
transform: translateX(-66.6%);
.cssanimations .marquee
position: relative;
width: 90%;
margin: auto;
overflow: hidden;
.cssanimations .marquee > ul
list-style: none;
position: relative;
z-index: 1;
top: 0;
left: 0;
width: 300% !important;
height: 80px;
-webkit-animation-play-state: running;
-moz-animation-play-state: running;
-o-animation-play-state: running;
animation-play-state: running;
-moz-transform: translate3d(0, 0, 0);
-ms-transform: translate3d(0, 0, 0);
-webkit-transform: translate3d(0, 0, 0);
transform: translate3d(0, 0, 0);
-webkit-animation: loop 20s linear infinite;
-moz-animation: loop 20s linear infinite;
-o-animation: loop 20s linear infinite;
animation: loop 20s linear infinite;
.cssanimations .marquee > ul > li
white-space: normal;
position: relative;
text-align: justify;
text-justify: distribute-all-lines;
line-height: 0;
letter-spacing: -0.31em;
float: left;
width: 33.333333%;
overflow: hidden;
height: 80px;
.cssanimations .marquee > ul > li:before
content: '';
position: relative;
height: 100%;
width: 0;
.cssanimations .marquee > ul > li:before,
.cssanimations .marquee > ul > li > *
vertical-align: middle;
display: inline-block;
.cssanimations .marquee > ul > li:after
content: '.';
display: inline-block;
height: 0 !important;
width: 100%;
overflow: hidden !important;
visibility: hidden;
font-size: 0;
word-spacing: 100%;
.cssanimations .marquee > ul > li > *
display: inline-block;
vertical-align: middle;
text-align: left;
line-height: 1;
letter-spacing: 0;
.cssanimations .marquee > ul > li img
margin: 0 1.6%;
.marquee ul li a
display: inline-block;
height: 80%;
.marquee ul li a img
max-height: 100%;
HTML 中的 JS 链接
<script src="Vendors/js/modernizr.js" type="text/javascript"></script>
<script src='http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js'></script>
重要提示:
我唯一添加到 CodePen 的东西:
.marquee ul li a
display: inline-block;
height: 80%;
.marquee ul li a img
max-height: 100%;
删除它并不能解决问题。
编辑 1:
Google Chrome Profiler(选项 1):
Google Chrome Profiler(选项 2(快照)):
编辑 2:
CSS3 transition not smooth in Chrome
我似乎刚刚在我的动画中发现了一个奇怪的行为。每次我移出视线并通过滚动回到它时,它都会“变大”(变大)。
这种行为似乎是上述问题的答案中所描述的。但是像建议的那样指定固定宽度并不能解决滞后问题。
编辑 3:
谷歌时间线(删除gravity.js后):
编辑 4:
这很奇怪。在注释和取消注释某些行之后(基本上回到有滞后时的代码),动画性能变得更好。不如 Safari 或 Firefox 流畅,但仍然更流畅。
编辑 5:
我找到了“罪魁祸首”。
我在我的网站标题中使用了另一个 codepen:
https://codepen.io/saransh/pen/BKJun
<link href='http://fonts.googleapis.com/css?family=Lato:300,400,700' rel='stylesheet' type='text/css'>
#stars
#stars2
#stars3
#title
%span
PURE CSS
%br
%span
PARALLAX PIXEL STARS
删除它会使其他动画流畅。
无论如何:
这并不能解释为什么在 Firefox 和 Safari 中一切都很顺利,但在 Chrome 中却没有。
Chrome 的功能不是很强大吗?
我向 Chrome 提交了报告,希望他们会在这里回答,但不能保证。
如果有人能从谷歌/Chrome 上得到答案,我会奖励他/她。
更新 6:
在 Opera 浏览器上试过。完全一样的滞后!现在我们知道这是 BLINK 渲染引擎的问题!
【问题讨论】:
建议:添加一个重现问题的演示(包括标记)并删除[javascript]和[jquery]标签,除非它们与问题相关。 “奇怪的是,即使使用 Chrome,Codepen 也能流畅运行。” - 这表明实际网站和 Codepen 之间存在差异。继续将网站的部分内容添加到 codepen,直到您重现问题,并且您可能已经找到了原因。 我在 Mac 上,我在 codepen 中没有延迟 尝试使用transform: translate3d(0, 0, 0)
hack 并将其替换为 will-change: transform
或完全删除它,以防您使用 CSS 的其他部分创建太多层。
@AlessandroOrnano 没错。
【参考方案1】:
解决方案:
对不同的屏幕尺寸使用@media 的绝对定位。
解释:
它适用于所有其他浏览器,但不适用于 Chrome,因此无论您做什么都将专门针对 Chrome。
这为您提供了 3 个选项:
(1) 让 Google 修复 Chrome 或
(2) 使用适用于 Chrome 或
的解决方案(3) 接受 Chrome 会不流畅。
TL;DR:
你知道绝对定位会起作用。
【讨论】:
我不想使用绝对定位,但谢谢你的回答。【参考方案2】:我找到了“罪魁祸首”。
我在我的网站标题中使用了另一个 codepen:
https://codepen.io/saransh/pen/BKJun
<link href='http://fonts.googleapis.com/css?family=Lato:300,400,700' rel='stylesheet' type='text/css'>
#stars
#stars2
#stars3
#title
%span
PURE CSS
%br
%span
PARALLAX PIXEL STARS
删除它会使其他动画流畅。
无论如何:
这并不能解释为什么在 Firefox 和 Safari 中一切都很顺利,但在 Chrome 中却没有。
Chrome 的功能不是很强大吗?
我向 Chrome 提交了报告,希望他们会在这里回答,但不能保证。
如果有人能从谷歌/Chrome 上得到答案,我会奖励他/她。
更新 6:
在 Opera 浏览器上试过。完全一样的滞后!现在我们知道这是 BLINK 渲染引擎的问题!
【讨论】:
@JonSkeet 能否请您将此转发给 Chrome 团队(如果可以)?那真的很棒:D【参考方案3】:为了使动画效果更好,您可以使用 CSS 的 will-change
属性。此属性向浏览器提示元素将要更改。
https://developer.mozilla.org/en/docs/Web/CSS/will-change
您可以在此处阅读有关will-change
的更多信息。
【讨论】:
【参考方案4】:Chrome 在渲染时支持硬件加速,从而提高 css3 动画的性能。您可以通过应用 translateZ(0)
、rotateZ(360deg)
或类似的方法来 trigger hardware acceleration,从而欺骗 Chrome。
一旦您通过应用上述技巧使用硬件加速(或者如果您已经在使用它,但引用的代码示例不完整和/或第三方库正在为您处理它),您可以根据需要应用前缀来进一步提高性能:
backface-visibility: hidden;
perspective: 1000;
这也有助于解决当 GPU 被集成和/或受到限制(想想省电模式)以及其性能下降时的一些问题。这将解释 Macbook 上的视差性能问题! ¯\_(ツ)_/¯
【讨论】:
对我来说没有任何改变.. 但是 Safari 中的动画非常流畅:|【参考方案5】:我最近更新了我的 Nvidia GPU 驱动程序,Chrome 中的动画变得断断续续,即使硬件加速已打开。
对我有用的是重新激活硬件加速。
Google Chrome > Settings > Advanced > System > Use hardware acceleration when available
为了重新激活断开的链接,我关闭了硬件加速,重新启动了浏览器。在这里,我注意到动画和以前一样不稳定。然后我再次打开硬件加速,重新启动浏览器,硬件加速显然又被重新激活了,因为动画现在超级流畅。
我假设更新图形驱动程序破坏了 Chrome 与硬件加速的链接,只需要重新激活它。
【讨论】:
这对我有用。【参考方案6】:尝试禁用您的 Chrome 扩展程序(这对我来说是个问题)
去 Chrome\Manage Extensions 切换切换按钮禁用它们,如果它工作正常,然后尝试一一启用,以了解究竟是哪个导致了问题。
【讨论】:
以上是关于为啥我的 CSS3 动画在 Google Chrome 中不流畅(但在其他浏览器上非常流畅)?的主要内容,如果未能解决你的问题,请参考以下文章
Firefox 和 CSS3 动画 - 为啥我的文本会抖动?
为啥这个 CSS3 动画在 Safari 和 Chrome 中不起作用?