不能。当同一css属性同时被transition和@keyframes控制时,动画优先级更高,会完全接管该属性,导致transition在动画运行期间失效,且不补间中间状态。

transition 和 @keyframes 能否同时作用于同一属性
不能。当同一个 CSS 属性(比如 transform 或 opacity)既被 transition 声明,又被 @keyframes 动画控制时,动画会完全接管该属性——transition 在动画运行期间失效,且不会“补间”动画未覆盖的中间状态。
常见错误现象:transition: transform 0.3s 写了,但触发 animation 后发现入场没有缓动、或 hover 离开时过渡突然中断。这是因为动画一启动,浏览器就停用了 transition 对该属性的监听。
- 动画优先级高于 transition(CSS 动画属于“层叠顺序”中更高一级的声明)
-
transition只响应“属性值的显式变化”,比如 JS 改 class、用户 hover;而@keyframes是主动驱动值变化,不触发 transition 的起始/结束检测 - 想让 hover 进场用 transition、离场用 animation?不行——只要 animation 正在控制该属性,transition 就不生效
如何让过渡与动画“协同工作”而非冲突
核心思路是:用不同属性分工,或用不同时机分层控制。不是硬凑在同一个属性上。
- 用
transform做位移/缩放动画(@keyframes),用opacity或filter做渐变过渡(transition)——属性不重叠,互不干扰 - 动画只负责“主体运动”,transition 负责“状态切换后的微调”,比如动画结束后加个
transition: box-shadow 0.2s响应 focus 状态 - 用 JS 控制时机:动画结束(监听
animationend)后再添加带transition的 class,实现“动画完→过渡接续”
示例:一个按钮点击后先弹跳(@keyframes bounce),松开后缓慢变暗(transition: opacity 0.4s):
立即学习“前端免费学习笔记(深入)”;
.btn {
animation: bounce 0.6s;
}
.btn.animated-done {
opacity: 0.7;
transition: opacity 0.4s;
}
JS 中:
btn.addEventListener('animationend', () => {
btn.classList.add('animated-done');
});
transition-delay 和 animation-delay 的行为差异
两者都支持延迟,但触发逻辑完全不同,混用容易误判节奏。
-
transition-delay:只在属性值**开始变化的那一刻**才计时,如果值没变(比如 hover 没触发、class 没切),延迟永远不会启动 -
animation-delay:只要动画被声明(哪怕 class 刚加上、还没渲染),浏览器就会立即开始计时,到点就播,不管 DOM 是否 ready - 若同时设了
transition-delay: 0.2s和animation-delay: 0.2s,实际看到的“延迟感”可能相差很大——前者可能根本没触发,后者铁定 200ms 后动
真正需要复杂效果时,该选哪个
别强行拼 transition + @keyframes。直接用 @keyframes 更可控。
- 需要多段节奏(快进→慢出→暂停→回弹)?transition 最多两态,
@keyframes可写 10%、60%、100% 多关键帧 - 要循环、反向、填充模式(
animation-fill-mode: forwards)?transition 不支持 - 性能敏感场景(如滚动中触发动画)?
transform+opacity的@keyframes可上 GPU,而某些 transition 组合(如height)会强制 layout
transition 的价值在于“用户交互响应”,比如 hover、focus、:checked;@keyframes 的价值在于“精确编排”。把它们当工具箱里不同的扳手,而不是非要拧在同一颗螺丝上。
最常被忽略的一点:很多人以为加了 transition 就能“平滑”,结果发现动画卡顿——其实是因为 transition 默认用 ease,而人眼对非线性缓动更敏感;真要顺滑,得配 transition-timing-function: cubic-bezier(0.25, 0.46, 0.45, 0.94) 或直接交给 keyframes 控制每帧曲线。










