作者:全栈老李
更新时间:2025 年 6 月
适合人群:前端初学者、进阶开发者
版权:本文由全栈老李原创,转载请注明出处。
最近在项目review时,发现不少同学写的CSS动画总是一卡一卡的,像极了老式DVD播放器卡碟的样子。今天全栈老李就来聊聊,如何让你的CSS动画像德芙巧克力广告那样——纵享丝滑。
浏览器渲染一帧画面要经历以下流程(全栈老李友情提示:这个流程记牢了面试能加分):
JavaScript → Style → Layout → Paint → Composite
当你在JS里改了DOM样式,浏览器就会重新计算样式(Style),如果修改了影响布局的属性(如width/height/left/top等),就会触发重排(Layout),接着是重绘(Paint),最后合成(Composite)。这个流程越靠后的步骤性能开销越大。
举个:你让一个div从左移到右,如果用left/top
属性,每帧都会触发重排+重绘;而用transform
,现代浏览器只需要在最后的合成阶段处理,性能差距能达到10倍以上!
这两个属性会被提升到单独的合成层,由GPU加速处理:
/* 全栈老李推荐写法 */
.box {
transition: transform 0.3s ease-out;
}
.box:hover {
transform: translateX(100px) scale(1.2); /* 同时应用位移和缩放 */
}
对比传统写法:
/* 性能较差的传统写法 */
.box {
position: relative;
left: 0;
transition: left 0.3s ease-out;
}
.box:hover {
left: 100px; /* 这会触发重排! */
}
实测数据:在100个元素同时动画的场景下,transform方案比left方案流畅3倍以上。
这是个常见但容易被忽视的性能杀手:
// 错误示范(全栈老李见过太多人这么写)
function resizeAll