标准答案

  1. transform 和 opacity 通常不会改变元素在文档流中的尺寸和布局位置。
  2. 浏览器可以把这类元素放到合成层,在合成阶段处理位移、缩放、旋转或透明度,减少布局和绘制压力。
  3. top、left 改变的是定位元素的布局位置,每一帧修改它们更容易触发布局计算或绘制,动画帧率更容易抖动。
  4. 做位移动画优先用 transform: translate,做淡入淡出优先用 opacity。
  5. will-change 可以提前提示浏览器,但只给即将动画的少量元素使用,动画结束后最好移除,避免过多合成层占内存。

题目解析

这题是重排重绘的延伸。回答时不要绝对说 transform 一定不卡,它只是更容易避开布局和绘制瓶颈。

如果元素很大、滤镜复杂、半透明叠加很多,即使走合成也可能有 GPU 和内存压力。

代码示例

用 transform 做位移动画,避免每帧修改 top。

CSS
.toast {
  transform: translateY(16px);
  opacity: 0;
  transition: transform 180ms ease, opacity 180ms ease;
}

.toast.is-visible {
  transform: translateY(0);
  opacity: 1;
}

常见误区

  • 所有动画都用 top、left 做位移。
  • 认为 will-change 可以全局加,结果创建过多合成层。
  • 只关注属性选择,不关注动画元素大小和同时动画数量。

作者信息