使用translate3d在CSS中平滑设置大图像动画
下面的问题是关于在大型图像上使用GPU加速渲染来解决jank的问题 我在用translate3d制作大图像、使用合成器线程绘制时遇到问题。 我已将问题简化为以下问题:使用translate3d在CSS中平滑设置大图像动画,translate3d,Translate3d,下面的问题是关于在大型图像上使用GPU加速渲染来解决jank的问题 我在用translate3d制作大图像、使用合成器线程绘制时遇到问题。 我已将问题简化为以下问题: div{ 位置:相对位置; 宽度:1500px; 溢出:隐藏; 边框:1px实心; 高度:800px; } img{ 宽度:100%; 位置:绝对位置; 顶部:0px; -webkit动画:SJBGFore1 10s无限线性; } @-webkit关键帧SJBGFERE1{ 0%{-webkit转换:转换(0%,0em);} 1
div{
位置:相对位置;
宽度:1500px;
溢出:隐藏;
边框:1px实心;
高度:800px;
}
img{
宽度:100%;
位置:绝对位置;
顶部:0px;
-webkit动画:SJBGFore1 10s无限线性;
}
@-webkit关键帧SJBGFERE1{
0%{-webkit转换:转换(0%,0em);}
100%{-webkit转换:translate(-100%,0em);}
}
使用Firefox开发者版,我可以看到Firefox何时在合成器线程上运行动画。当图像有几百个像素宽时,它可以根据需要工作。但是,图像需要相当大,因为它是一个动画背景图像
发现较小的图像合成正确,我尝试将动画图像拆分为7个块,按顺序进行动画:
Firefox DE现在在合成器线程上运行它们。万岁
<html>
<head>
<style>
div {
position:relative;
width:400px;
overflow:hidden;
border:1px solid;
height:800px;
}
img {
width:100%;
position:absolute;
top:0px;
}
img:nth-of-type(1){-webkit-animation: SJBGFore1 10s infinite linear;}
@-webkit-keyframes SJBGFore1 {
0% {-webkit-transform: translate3d(0%, 0em, 0em);}
10% {-webkit-transform: translate3d(-100%, 0em, 0em);}
100% {-webkit-transform: translate3d(-100%, 0em, 0em);}
}
img:nth-of-type(2){-webkit-animation: SJBGFore2 10s infinite linear;}
@-webkit-keyframes SJBGFore2 {
0% {-webkit-transform: translate3d(100%, 0em, 0em);}
10% {-webkit-transform: translate3d(0%, 0em, 0em);}
20% {-webkit-transform: translate3d(-100%, 0em, 0em);}
100% {-webkit-transform: translate3d(-100%, 0em, 0em);}
}
img:nth-of-type(3){-webkit-animation: SJBGFore3 10s infinite linear;}
@-webkit-keyframes SJBGFore3 {
0% {-webkit-transform: translate3d(100%, 0em, 0em);}
10% {-webkit-transform: translate3d(100%, 0em, 0em);}
20% {-webkit-transform: translate3d(0%, 0em, 0em);}
30% {-webkit-transform: translate3d(-100%, 0em, 0em);}
100% {-webkit-transform: translate3d(-100%, 0em, 0em);}
}
img:nth-of-type(4){-webkit-animation: SJBGFore4 10s infinite linear;}
@-webkit-keyframes SJBGFore4 {
0% {-webkit-transform: translate3d(100%, 0em, 0em);}
20% {-webkit-transform: translate3d(100%, 0em, 0em);}
30% {-webkit-transform: translate3d(0%, 0em, 0em);}
40% {-webkit-transform: translate3d(-100%, 0em, 0em);}
100% {-webkit-transform: translate3d(-100%, 0em, 0em);}
}
img:nth-of-type(5){-webkit-animation: SJBGFore5 10s infinite linear;}
@-webkit-keyframes SJBGFore5 {
0% {-webkit-transform: translate3d(100%, 0em, 0em);}
30% {-webkit-transform: translate3d(100%, 0em, 0em);}
40% {-webkit-transform: translate3d(0%, 0em, 0em);}
50% {-webkit-transform: translate3d(-100%, 0em, 0em);}
100% {-webkit-transform: translate3d(-100%, 0em, 0em);}
}
img:nth-of-type(6){-webkit-animation: SJBGFore6 10s infinite linear;}
@-webkit-keyframes SJBGFore6 {
0% {-webkit-transform: translate3d(100%, 0em, 0em);}
40% {-webkit-transform: translate3d(100%, 0em, 0em);}
50% {-webkit-transform: translate3d(0%, 0em, 0em);}
60% {-webkit-transform: translate3d(-100%, 0em, 0em);}
100% {-webkit-transform: translate3d(-100%, 0em, 0em);}
}
img:nth-of-type(7){-webkit-animation: SJBGFore7 10s infinite ease-out;}
@-webkit-keyframes SJBGFore7 {
0% {-webkit-transform: translate3d(100%, 0em, 0em);}
50% {-webkit-transform: translate3d(100%, 0em, 0em);}
60% {-webkit-transform: translate3d(0%, 0em, 0em);}
70% {-webkit-transform: translate3d(0%, 0em, 0em);}
100% {-webkit-transform: translate3d(0%, 0em, 0em);}
}
</style>
</head>
<body><div>
<img src="http://www.storyjam.co.uk/fiddleresources/ground1.svg">
<img src="http://www.storyjam.co.uk/fiddleresources/ground2.svg">
<img src="http://www.storyjam.co.uk/fiddleresources/ground3.svg">
<img src="http://www.storyjam.co.uk/fiddleresources/ground4.svg">
<img src="http://www.storyjam.co.uk/fiddleresources/ground5.svg">
<img src="http://www.storyjam.co.uk/fiddleresources/ground6.svg">
<img src="http://www.storyjam.co.uk/fiddleresources/ground7.svg">
</div></body>
</html>
div{
位置:相对位置;
宽度:400px;
溢出:隐藏;
边框:1px实心;
高度:800px;
}
img{
宽度:100%;
位置:绝对位置;
顶部:0px;
}
img:n类型(1){-webkit动画:SJBGFore1 10s无限线性;}
@-webkit关键帧SJBGFERE1{
0%{-webkit转换:translate3d(0%,0em,0em);}
10%{-webkit转换:translate3d(-100%,0em,0em);}
100%{-webkit转换:translate3d(-100%,0em,0em);}
}
img:n类型(2){-webkit动画:SJBGFore2 10s无限线性;}
@-webkit关键帧SJBGFERE2{
0%{-webkit转换:translate3d(100%,0em,0em);}
10%{-webkit转换:translate3d(0%,0em,0em);}
20%{-webkit转换:translate3d(-100%,0em,0em);}
100%{-webkit转换:translate3d(-100%,0em,0em);}
}
img:n类型(3){-webkit动画:SJBGFore3 10s无限线性;}
@-webkit关键帧SJBGFore3{
0%{-webkit转换:translate3d(100%,0em,0em);}
10%{-webkit转换:translate3d(100%,0em,0em);}
20%{-webkit转换:translate3d(0%,0em,0em);}
30%{-webkit转换:translate3d(-100%,0em,0em);}
100%{-webkit转换:translate3d(-100%,0em,0em);}
}
img:n类型(4){-webkit动画:SJBGFore4 10s无限线性;}
@-webkit关键帧SJBGFore4{
0%{-webkit转换:translate3d(100%,0em,0em);}
20%{-webkit转换:translate3d(100%,0em,0em);}
30%{-webkit转换:translate3d(0%,0em,0em);}
40%{-webkit转换:translate3d(-100%,0em,0em);}
100%{-webkit转换:translate3d(-100%,0em,0em);}
}
img:n类型(5){-webkit动画:SJBGFore5 10s无限线性;}
@-webkit关键帧SJBGFore5{
0%{-webkit转换:translate3d(100%,0em,0em);}
30%{-webkit转换:translate3d(100%,0em,0em);}
40%{-webkit转换:translate3d(0%,0em,0em);}
50%{-webkit转换:translate3d(-100%,0em,0em);}
100%{-webkit转换:translate3d(-100%,0em,0em);}
}
img:n类型(6){-webkit动画:SJBGFore6 10s无限线性;}
@-webkit关键帧SJBGFore6{
0%{-webkit转换:translate3d(100%,0em,0em);}
40%{-webkit转换:translate3d(100%,0em,0em);}
50%{-webkit转换:translate3d(0%,0em,0em);}
60%{-webkit转换:translate3d(-100%,0em,0em);}
100%{-webkit转换:translate3d(-100%,0em,0em);}
}
img:n类型(7){-webkit动画:SJBGFore7 10s无限放松;}
@-webkit关键帧SJBGFore7{
0%{-webkit转换:translate3d(100%,0em,0em);}
50%{-webkit转换:translate3d(100%,0em,0em);}
60%{-webkit转换:translate3d(0%,0em,0em);}
70%{-webkit转换:translate3d(0%,0em,0em);}
100%{-webkit转换:translate3d(0%,0em,0em);}
}
然而,我无法在Chrome中复制改进后的性能。无论我做什么,我都会得到很多janky帧,每个帧中都有一系列的事件,这会导致整个lotta jank:
(重新计算样式->更新图层树->更新图层树->复合图层)
令人困惑的是:Chrome正在进行“合成层”操作,这表明它使用的是GPU加速。在这种情况下,为什么它必须重新计算样式,为什么它要更新图层树,为什么我会得到如此讨厌的jank
我尝试过的事情:
<html>
<head>
<style>
div {
position:relative;
width:400px;
overflow:hidden;
border:1px solid;
height:800px;
}
img {
width:100%;
position:absolute;
top:0px;
}
img:nth-of-type(1){-webkit-animation: SJBGFore1 10s infinite linear;}
@-webkit-keyframes SJBGFore1 {
0% {-webkit-transform: translate3d(0%, 0em, 0em);}
10% {-webkit-transform: translate3d(-100%, 0em, 0em);}
100% {-webkit-transform: translate3d(-100%, 0em, 0em);}
}
img:nth-of-type(2){-webkit-animation: SJBGFore2 10s infinite linear;}
@-webkit-keyframes SJBGFore2 {
0% {-webkit-transform: translate3d(100%, 0em, 0em);}
10% {-webkit-transform: translate3d(0%, 0em, 0em);}
20% {-webkit-transform: translate3d(-100%, 0em, 0em);}
100% {-webkit-transform: translate3d(-100%, 0em, 0em);}
}
img:nth-of-type(3){-webkit-animation: SJBGFore3 10s infinite linear;}
@-webkit-keyframes SJBGFore3 {
0% {-webkit-transform: translate3d(100%, 0em, 0em);}
10% {-webkit-transform: translate3d(100%, 0em, 0em);}
20% {-webkit-transform: translate3d(0%, 0em, 0em);}
30% {-webkit-transform: translate3d(-100%, 0em, 0em);}
100% {-webkit-transform: translate3d(-100%, 0em, 0em);}
}
img:nth-of-type(4){-webkit-animation: SJBGFore4 10s infinite linear;}
@-webkit-keyframes SJBGFore4 {
0% {-webkit-transform: translate3d(100%, 0em, 0em);}
20% {-webkit-transform: translate3d(100%, 0em, 0em);}
30% {-webkit-transform: translate3d(0%, 0em, 0em);}
40% {-webkit-transform: translate3d(-100%, 0em, 0em);}
100% {-webkit-transform: translate3d(-100%, 0em, 0em);}
}
img:nth-of-type(5){-webkit-animation: SJBGFore5 10s infinite linear;}
@-webkit-keyframes SJBGFore5 {
0% {-webkit-transform: translate3d(100%, 0em, 0em);}
30% {-webkit-transform: translate3d(100%, 0em, 0em);}
40% {-webkit-transform: translate3d(0%, 0em, 0em);}
50% {-webkit-transform: translate3d(-100%, 0em, 0em);}
100% {-webkit-transform: translate3d(-100%, 0em, 0em);}
}
img:nth-of-type(6){-webkit-animation: SJBGFore6 10s infinite linear;}
@-webkit-keyframes SJBGFore6 {
0% {-webkit-transform: translate3d(100%, 0em, 0em);}
40% {-webkit-transform: translate3d(100%, 0em, 0em);}
50% {-webkit-transform: translate3d(0%, 0em, 0em);}
60% {-webkit-transform: translate3d(-100%, 0em, 0em);}
100% {-webkit-transform: translate3d(-100%, 0em, 0em);}
}
img:nth-of-type(7){-webkit-animation: SJBGFore7 10s infinite ease-out;}
@-webkit-keyframes SJBGFore7 {
0% {-webkit-transform: translate3d(100%, 0em, 0em);}
50% {-webkit-transform: translate3d(100%, 0em, 0em);}
60% {-webkit-transform: translate3d(0%, 0em, 0em);}
70% {-webkit-transform: translate3d(0%, 0em, 0em);}
100% {-webkit-transform: translate3d(0%, 0em, 0em);}
}
</style>
</head>
<body><div>
<img src="http://www.storyjam.co.uk/fiddleresources/ground1.svg">
<img src="http://www.storyjam.co.uk/fiddleresources/ground2.svg">
<img src="http://www.storyjam.co.uk/fiddleresources/ground3.svg">
<img src="http://www.storyjam.co.uk/fiddleresources/ground4.svg">
<img src="http://www.storyjam.co.uk/fiddleresources/ground5.svg">
<img src="http://www.storyjam.co.uk/fiddleresources/ground6.svg">
<img src="http://www.storyjam.co.uk/fiddleresources/ground7.svg">
</div></body>
</html>