material design 规范要求 transition-property 仅设 background-color、color、border-color、transform、opacity 和 box-shadow,禁用 width/height/top/left 等触发重排的属性,并必须搭配 cubic-bezier(0.0,0.0,0.2,1) 缓动函数。

transition-property 该设哪些属性才符合 Material Design 规范
Material Design 官方推荐的过渡动画只作用于特定属性,不是所有 CSS 属性都适合加 transition。乱设会导致动画卡顿、视觉不一致,甚至破坏组件语义。
MCW(material-components-web)明确限定以下属性为“可过渡”核心集:
-
background-color、color、border-color—— 用于按钮、卡片、输入框等状态色变化 -
transform(仅限scale、translate、rotate)—— 波纹(mdc-line-ripple)、FAB 悬浮按钮展开等依赖此 -
opacity—— 用于淡入淡出,如菜单遮罩层、提示框显示/隐藏 -
box-shadow—— 仅限mdc-elevation系统中定义的预设层级值(如elevation-2→elevation-6)
⚠️ 避免对 width、height、top/left(非 transform 位移)、font-size 等触发重排(reflow)的属性加 transition —— MCW 所有官方组件动画都绕开这些。
timing-function 必须用 $deceleration-curve-timing-function 吗
是的,只要想严格符合 Material Design 规范,就必须用 MCW 提供的标准缓动函数:$deceleration-curve-timing-function(即 cubic-bezier(0.0, 0.0, 0.2, 1)),而不是 ease 或 ease-in-out。
这个贝塞尔曲线专为“减速结束”设计,模拟物理惯性,让动画收尾干净利落 —— 这是 Material 动画语言的标志性特征。MCW 的所有内置动画(如 mdc-line-ripple、mdc-button ripple)都基于它。
实际写法示例:
button {
transition: background-color 0.2s <code>cubic-bezier(0.0, 0.0, 0.2, 1)</code>,
transform 0.2s <code>cubic-bezier(0.0, 0.0, 0.2, 1)</code>;
}
注意:不要写成 transition-timing-function: ease 单独声明 —— 多属性 transition 时,timing-function 必须与 property 显式配对,否则会 fallback 到浏览器默认。
为什么 mdc-line-ripple 的波纹缩放要用 scaleX 而不是 width
因为 scaleX 是 transform 属性,GPU 可加速,且不触发 layout;而 width 会强制重排,导致动画掉帧,尤其在低端设备上明显卡顿。
mdc-line-ripple 的实现就是典型例子:
- 基础线用
::before固定宽度 +border-bottom - 波纹用
::after,初始transform: scaleX(0),激活时变为scaleX(1) - 全程只动 transform 和 opacity —— 符合高性能动画黄金法则
如果你自己仿写波纹效果,千万别用 width: 0 → width: 100%,哪怕看起来一样,性能和规范性都已偏离 Material 原则。
主题切换时 transition 不生效?检查 :root 是否被覆盖
MCW 主题靠 CSS 自定义属性(--mdc-theme-primary 等)驱动,但这些变量本身**不可直接 transition**。你看到的“主题渐变”,其实是靠间接影响可过渡属性(如 background-color)实现的。
常见失效原因:
- 在
:root上改变量后,没同步更新对应组件的background-color值 —— 变量变了,但样式没重算 - 用了
!important覆盖了原本带 transition 的规则 - JS 直接写内联 style(
element.style.backgroundColor),绕过了 CSS cascade 和 transition 机制
正确做法:确保主题变量变更后,组件通过 CSS 计算(如 background-color: var(--mdc-theme-primary))取值,并且该规则本身带有 transition 声明。
真正难的不是写几行 transition,而是理解 Material Design 动画的本质:它不是炫技,而是用精确的 timing、受限的属性、硬件加速的变换,把交互反馈压缩到 200–300ms 内完成。一旦脱离这套约束,就只是“看起来像”,不是“Material”。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











