阴影平滑过渡需确保初始box-shadow非none、transition明确写在默认状态且仅针对box-shadow、父容器无overflow:hidden裁剪;浮起感靠垂直偏移增大、负扩散收缩、透明度微调及同步transform: translateY(-2px)协同实现。

直接用 box-shadow 配合 transition 就能做出平滑阴影过渡,但多数人卡在阴影“跳变”或“不生效”上——根本原因不是属性没写对,而是初始值、触发条件、父容器限制三者没对齐。
为什么 hover 时阴影突然炸开或没反应
常见现象是悬停瞬间阴影变大但边缘生硬,或完全没变化。本质是:初始 box-shadow 值太弱(比如全透明 rgba(0,0,0,0)),浏览器无法插值;或写了 transition: all 却漏了单位,导致整条声明被忽略。
- 初始阴影不能为
none或空值,必须是有效声明,例如box-shadow: 0 2px 6px 0 rgba(0,0,0,0.1) -
transition必须明确指定属性和时间,写成transition: box-shadow 0.2s ease,别用all - 确保卡片本身没被父容器的
overflow: hidden裁掉阴影区域——检查直接父级元素 - 移动端真机测试时,
:hover只对可聚焦元素(如)或加了tabindex="0"的有效如何让阴影过渡看起来像“浮起”而不是“闪现”
单纯加大模糊半径(
blur-radius)会让阴影发虚,真正抬升感来自垂直偏移、扩散收缩、透明度三者的协同变化。- 起始值推荐:
box-shadow: 0 2px 6px 0 rgba(0,0,0,0.1)(零扩散、轻度下压) - 悬停目标值:
box-shadow: 0 4px 12px -2px rgba(0,0,0,0.15)(-2px 收束扩散,强化轮廓贴合) - 必须同步加
transform: translateY(-2px),比top性能更好,且不会触发重排 - 动画节奏用
cubic-bezier(0.25, 0.8, 0.25, 1)比默认ease更有弹性
多层阴影叠加时的顺序和兼容性坑
双层
box-shadow(比如高光+投影)能模拟真实光源,但顺序错一丁点,按钮就从“立体”变“塌陷”。- 书写顺序即渲染顺序:高光必须在前,投影在后,例如
box-shadow: 0 -2px 0 2px #fff, 0 3px 6px rgba(0,0,0,0.15) - Safari 对负
spread-radius(如-2px)支持不稳定,建议降级为0并靠增大v-offset和blur弥补 - 深色背景上避免纯黑阴影,改用
rgba(255,255,255,0.05);浅色背景上rgba(0,0,0,0.08)~0.12更安全 - 如果卡片含
border-radius且内部有绝对定位子元素,确保父容器没设transform(如translateZ(0)),否则可能意外裁剪阴影
最易被忽略的是:阴影过渡是否在所有设备上都可感知。真机上
:hover持续时间极短,数值稍大(比如0.3s)就变成“刚动就结束了”。建议桌面端用0.2s,移动端直接降到0.15s并加will-change: transform(仅 hover 时)保帧率。 - 起始值推荐:
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











