为什么我的CSS旋转加载动画在页面加载时会突然卡顿一下?
我在做一个简单的旋转加载组件,用CSS3动画实现图标旋转。但每次页面加载时,图标会先显示0.5秒的静态状态,然后才开始旋转。我尝试过把animation-delay设为0和调整will-change属性都没用,这是怎么回事?
<div class="loader">
<svg viewBox="0 0 32 32" width="40"><circle cx="16" cy="16" r="14" /></svg>
</div>
<style>
.loader {
animation: spin 1s linear infinite;
}
@keyframes spin {
100% { transform: rotate(360deg); }
}
</style>
在Chrome开发者工具里看到动画的FPS正常,但实际效果就是有明显卡顿。是不是需要给父元素加什么特殊样式?或者动画应该用requestAnimationFrame实现?
首先可以试试强制让浏览器提前计算好动画样式,在CSS里加个
transform: translateZ(0);或者will-change: transform;,告诉浏览器这个元素需要硬件加速。改完代码大概像这样:如果这招不行,还有一种更直接的办法,就是给动画加个负的
animation-delay,比如 -0.5s,这样可以让动画在页面还没完全加载完就开始运行,用户就不会看到卡顿了。代码可以这么写:另外,确保你的
.loader元素在页面加载时就已经存在,而不是动态插入的。如果是动态插入的,浏览器会重新计算样式,导致动画延迟。最后,如果你用了某些CSS预处理器或者框架,检查一下有没有多余的样式覆盖或者冲突,有时候问题出在意外的地方。
一般这样处理都能解决问题,要是还不行,再看看是不是其他脚本阻塞了页面渲染,那就得优化加载顺序了。