跳到正文
UIGrammer
EN 中文

反模式 · 动效 ·

动画直接改宽高

动画改宽高指直接过渡布局属性,每帧强制重排,在真实设备上必然掉帧。

症状

transition 或 keyframes 里出现了 width、height、top、left、margin、padding。

为什么会这样

height:auto 到一个固定值是写手风琴最直觉的方式,模型也首先想到它。在 DOM 小、机器快的环境里演示完全没问题。

规则

只动 transform 与 opacity。绝不过渡布局属性。

  1. 把 width/height 过渡换成 scaleX/scaleY 或基于 transform 的展开。
  2. 进场离场用 opacity 配 transform;避开 margin 与 padding 动画。
  3. 确实必须改尺寸时,先量一次,再动一个固定的 transform。

动画直接改宽高是什么?

width、height、top、left 都是布局属性:改变它们会让浏览器每帧重算布局。在一台中端手机上那就是肉眼可见的卡顿。transform、opacity 以及(谨慎使用)clip-path 是合成属性——浏览器不必重排就能移动它们。动这些;如果确实必须改变布局,就动 transform,让布局瞬间切换。

修复 Prompt

贴在你现有 Prompt 之后,把这类毛病从结果里剥掉。