为何设置will-change: left后动画left属性未触发重绘?
为什么修改left属性的动画没触发重绘?
当你给元素添加will-change: left后,浏览器会为这个元素创建一个独立的合成图层。
对于绝对定位的元素来说,修改left属性本质是调整它在合成图层中的位置——这个操作会被浏览器直接优化到合成(Composite)阶段完成,完全不需要触发重绘(甚至不需要布局计算)。
你之前的认知需要补充:并非只有transform和opacity能在合成阶段处理动画。当元素拥有独立图层时,修改它的位置属性(比如left/top/right/bottom,针对绝对/固定定位元素),浏览器可以直接移动整个图层来实现动画,图层的像素内容没有任何变化,自然不会触发重绘,所以Paint flashing不会出现闪烁效果。
你可以做个验证:
- 打开Chrome DevTools的Layers面板,能看到#b确实处于独立图层中;
- 去掉
will-change: left后再运行动画,Paint flashing就会出现重绘闪烁,因为此时元素没有独立图层,修改left会触发重绘流程。
内容的提问来源于stack exchange,提问作者Yao Tao
相关产品推荐
相关产品推荐

