是,transition-delay对每个属性独立生效;必须与transition-property、transition-duration按顺序一一对应,显式声明各属性的延迟值,不可仅用单个transition-delay作用于all或多个属性。

transition-delay 对每个属性是独立生效的
很多人以为写 transition: all 0.3s ease 0.2s 就能让所有属性都延迟 0.2 秒启动,其实这个 0.2s 是全局 delay,但 all 会把大量隐式可动画属性(比如 box-shadow、font-size)也卷进来,其中部分根本没变,浏览器可能直接跳过,导致节奏失控。真正可控的方式是显式列出属性,并为每个配单独的 delay。
多值写法中,transition-delay 和前面的 transition-property、transition-duration 按顺序一一对应。例如:
transition-property: opacity, transform; transition-duration: 0.3s, 0.4s; transition-delay: 0s, 0.15s;
这样 opacity 立即开始,transform 延迟 0.15s 启动——互不干扰。
- 不能只写一个
transition-delay: 0.15s期望它作用于所有属性,必须按属性数量提供对应个数的 delay 值 - 如果某属性没写 delay,默认就是
0s,不会继承前一个值 - 负 delay(如
-0.1s)允许“提前启动”,浏览器会从触发时刻往前插值渲染
多级菜单推入动画为什么 delay 不起作用
给子菜单加了 transition-delay: 0.15s 却还是“啪”一下弹出,大概率是因为用了 display: none 切换状态。这个属性会让元素彻底退出渲染树,transition 根本无法捕获变化起点,delay 自然无效。
立即学习“前端免费学习笔记(深入)”;
必须用三件套替代 display:
-
visibility: hidden(保持布局占位) -
opacity: 0(控制视觉可见性) -
pointer-events: none(禁用交互)
展开时统一改为 visibility: visible; opacity: 1; pointer-events: auto,transition 才能识别状态变更并应用 delay。
另外注意:transition-delay 不继承,也不自动累加。二级菜单设了 0.15s,三级菜单仍按 0s 启动,除非你显式写 transition-delay: 0.3s 或用 CSS 变量计算:
.sidebar-menu { --delay-step: 0.12s; }
.sidebar-menu > li > .submenu { transition: opacity 0.3s ease, transform 0.3s ease calc(var(--delay-step) * 1); }
.sidebar-menu > li > .submenu > li > .submenu { transition: opacity 0.3s ease, transform 0.3s ease calc(var(--delay-step) * 2); }用 transition-delay 做列表项阶梯入场?别踩这个坑
transition-delay 适合响应式动画(比如 hover、class 切换),但不适合页面加载时自动逐项播放的阶梯入场。因为它是事件驱动的:只有状态变化才触发一次,后续刷新或重渲染就没了。
真正要做列表项“第 1 项 0.1s 后动、第 2 项 0.2s 后动……”,得用 @keyframes + animation,配合 :nth-child() 设置 animation-delay:
.item { animation: fadeUp 0.4s ease-in forwards; }
.item:nth-child(1) { animation-delay: 0.1s; }
.item:nth-child(2) { animation-delay: 0.2s; }
.item:nth-child(3) { animation-delay: 0.3s; }关键点:
- 起始状态必须是
transform: translateY(20px); opacity: 0,且父容器加overflow: hidden,否则项与项之间视觉重叠,“阶梯感”被糊掉 - 单次动画时长建议 ≥ 总延迟时长 × 0.8,否则末尾几项几乎没动画过程
- 移动端低端 WebView 中
ease-in偶有卡顿,可降级为ease
多个 transition 规则叠加时,谁说了算
CSS 层叠规则下,后声明的完整 transition 声明会完全覆盖前面的——不是合并,是替换。比如:
.box { transition: opacity 0.2s; }
.box:hover { transition: transform 0.3s 0.1s; }结果是 :hover 时只有 transform 动,opacity 过渡被丢弃。这不是“追加”,是“覆盖”。
想保留多个属性过渡,必须在 hover 规则里显式重写全部需要的属性:
.box:hover { transition: opacity 0.2s, transform 0.3s 0.1s; }或者改用 JS 控制 class 切换节奏,或直接上 @keyframes。纯 CSS 下没有“增量添加 transition”的机制。
最易被忽略的是:transition 的生效前提是属性值确实发生了变化,且该属性支持过渡。像 height 从 0 到 auto 就不会动,得用 max-height 替代;margin 在某些布局下也可能被浏览器优化掉。动手前先确认目标属性是否真在变、是否可动画。


















