【发布时间】:2021-09-03 22:21:28
【问题描述】:
我意识到带有关键帧的 CSS 动画真的很需要资源。
我已经消除了阴影,这在我的例子中提高了近 50% 的性能。我还听说我应该包含一个rotateZ(360deg) 来欺骗浏览器使用 GPU 加速。但即使应用了这些“技巧”,我的明星背景也确实非常需要资源。一旦你打开我的网站,CPU 和 GPU 的使用率就会急剧上升并保持在相当高的水平。
我想知道是否有更好的方法来执行我想要的动画而不浪费这么多 CPU 或 GPU 功率。
我想在我的网站上添加移动星星的背景。我对此的解决方案是为每个星星创建一个 div,给它一个大小、背景颜色和带有关键帧的 CSS 动画。不透明度、x 和 y 位置以及动画的速度是随机的。
关键帧如下:
@keyframes linear-translate {
0% {
left: -10%;
transform: rotateZ(360deg); /* rotateZ tricks the browser to use GPU acceleration for better performance */
}
100% {
left: 110%;
}
}
@keyframes linear-translate-initial {
0% {
transform: translateX(0) rotateZ(360deg);
}
100% {
left: 110%;
}
}
以下是其中一个 div 元素的示例(带有尾风 CSS 类):
<div class="absolute block bg-gray-200 rounded-full"
style="left: 1%; top: 8%; width: 3px; height: 3px; opacity: 0.381289;
animation: 90.0069s linear 0s 1 normal none running linear-translate-initial,
110.007s linear 90.0069s infinite normal none running linear-translate;"></div>
链接到带有工作示例的代码框: https://codesandbox.io/s/starbackgroundreacttailwindcss-wzers?file=/src/Starfield.tsx
对于为什么这些动画消耗如此多的能量以及如何提高它们的效率有什么想法吗?毕竟只是横向翻译...
更新:
我尝试按照 Marco 的建议将星星分层到不同速度的 div 元素中。 我的结果可以在这里找到:
https://codesandbox.io/s/layeredstarbackgroundreacttailwindcss-wj71q?file=/src/App.tsx:392-445
不幸的是,“改进”并不是那么好。 CPU 使用率有所下降,但 GPU 使用率急剧上升。
【问题讨论】:
-
你可能想看看Particles.js。因为使用
canvas是处理大量对象的最佳方法。
标签: html css css-animations keyframe