CSS will-change用得溜,页面滚动不卡顿!
💓 博客主页:瑕疵的CSDN主页
📝 Gitee主页:瑕疵的gitee主页
⏩ 文章专栏:《热点资讯》
CSS will-change用得溜,页面滚动不卡顿!
目录
上周在移动端项目里,滚动列表卡成PPT。用户一滑,页面就卡住,像在拖动一坨泥。测试时Chrome DevTools的FPS直接掉到10,看着就心梗。
问题来了:为啥好好的滚动会卡?
浏览器渲染时,每次滚动都触发重排重绘。尤其当元素有transform或opacity,浏览器得重新计算布局——这玩意儿在低端手机上就是慢性自杀。
根源:浏览器渲染流水线太“懒”。
默认情况下,浏览器不会提前优化滚动元素。它会等到滚动发生时才处理,结果就是卡顿。will-change就是给浏览器打个招呼:“这个元素要动,提前准备好!” 它提前创建合成层,让滚动变成GPU加速的流畅动画。
正确用法:
先看错误写法(滚动必卡):
/* 错误:没用will-change,滚动时浏览器临时计算布局 */.list-item{transform:translateX(10px);/* 滚动时触发重排 */transition:transform0.3s;}再看正确写法(丝滑如丝绸):
/* 正确:用will-change提前声明 */.list-item{will-change:transform;/* 关键!告诉浏览器要动 */transform:translateX(10px);/* 真正的动画 */transition:transform0.3s;}避坑总结(血泪教训):
- 别乱加:只对滚动时会动的元素用。比如给
<div class="scroll-item">加,别给body加——我试过,内存直接爆,手机变砖。 - 用完要收:动画结束后记得移除。加
will-change: auto,避免无用图层占用内存。.list-item.active{
will-change:transform;
}
.list-item.inactive{
will-change:auto;/* 动画结束回收资源 */
}
- 测试看Layers:Chrome DevTools → More Tools → Layers。确认图层已创建,别白忙活。
- 移动端优先:PC端可能不明显,但手机用户绝对要命。
实际项目里,我给滚动列表的每个item加了will-change: transform,滚动流畅度直接从20FPS飙到60FPS。之前同事傻乎乎地用opacity做动画,结果滚动卡成PPT——现在他懂了,will-change不是万能药,是精准的手术刀。
最后说句大实话:别等用户投诉卡顿了才改。写代码前先问自己:“这个元素滚动时真会动吗?”
动就加will-change,不动就别折腾。
用对地方,滚动才不卡。
下次再卡,别骂浏览器,先看CSS。
