
当为元素设置 hover 动画时,若只在 :hover 状态下声明 transition,则离开 hover 时将无过渡效果——因为浏览器无法对“无 transition 定义”的初始状态执行动画回退。正确做法是将 transition 声明在元素的默认(常态)样式中。
在 CSS 动画开发中,一个高频却易被忽视的陷阱是:动画正向播放正常,但反向(如鼠标移出时)却突兀跳变、毫无过渡。这正是本例中 div#slides 高度从 850px 回缩至 250px 时“无动画”的根本原因。
问题核心在于 transition 的声明位置错误。原代码将 transition: all 1s ease-in-out 0.5s 写在了 div#slides:hover 选择器内:
div#slides:hover {
height: 850px;
transition: all 1s ease-in-out 0.5s; /* ❌ 错误:仅 hover 时生效 */
}这意味着:
- 鼠标悬停时,浏览器识别到 height 变化 + transition 规则 → 正向动画触发;
- 但鼠标移出后,元素回归默认样式(height: 250px),而默认样式中未声明 transition → 浏览器认为“无需过渡”,直接硬切回原始值。
✅ 正确解法:将 transition 移至常态选择器 div#slides 中,确保进出双向均受控:
立即学习“前端免费学习笔记(深入)”;
div#slides {
display: flex;
width: 600px;
height: 250px;
overflow: hidden;
position: absolute;
transition: height 1s ease-in-out; /* ✅ 正确:定义在常态 */
}
div#slides:hover {
height: 850px; /* 仅变更属性值,动画由常态 transition 驱动 */
}? 关键原理:CSS transition 是状态间插值的桥梁。它必须存在于起始态(常态)或结束态(伪类)中——但规范要求:只有起始态定义了 transition,浏览器才能计算从起始到结束、再从结束回到起始的完整缓动路径。若仅在结束态定义,返回时相当于“从无过渡态跳回有过渡态”,自然失效。
此外,建议遵循以下最佳实践以提升健壮性:
- 精确声明过渡属性:避免 transition: all,改用 transition: height 1s ease-in-out,防止意外触发其他属性动画;
- 统一时序函数:ease-in-out 比 ease 更平滑,适合展开/收起类交互;
- 避免 position: absolute 与 flex 布局混用导致的流式错位(本例中 #slides 的绝对定位可能影响 #quadro_tudo 的 flex 对齐,建议根据实际布局需求评估是否需改为 relative 或调整父容器结构)。
最后,验证修复效果:鼠标悬停时高度平滑展开,移出时同样以 1 秒缓动收起——双向动画一致、专业且符合用户预期。










