用 box-shadow 配合 :hover 是最直接有效的方式,关键在于悬停时提高 rgba() 透明度、微增垂直偏移、保持低模糊值(如 0 4px 8px rgba(0,0,0,0.35)),并始终在常态声明 transition: box-shadow 0.3s ease。

用 box-shadow 配合 :hover 是最直接有效的方式
不需要 JS,纯 CSS 就能实现。关键不是“加阴影”,而是“加深”——也就是让阴影更浓、偏移更小、模糊更弱,视觉上才显得更“压近”图片。默认状态用浅而扩散的阴影,悬停时改用深色、短偏移、低模糊值的阴影即可。
常见错误是只调大 box-shadow 的模糊值(比如从 5px 改成 20px),结果阴影变“虚”了,反而显得更远、更轻。真正加深感来自:更高的 rgba() 黑色透明度、更小的 offset(甚至设为 0 0)、更低的 blur(如 8px 而非 16px)。
示例写法:
img {
box-shadow: 0 2px 8px rgba(0,0,0,0.15);
transition: box-shadow 0.3s ease;
}
img:hover {
box-shadow: 0 4px 8px rgba(0,0,0,0.35);
}
必须加 transition,否则效果生硬且不符合直觉
没有过渡动画时,阴影会瞬间跳变,人眼会感知为“闪烁”或“卡顿”,尤其在快速进出时。这不是 bug,是缺少动效导致的体验断裂。
-
transition要写在默认状态(非:hover),否则首次悬停无动画 - 推荐用
box-shadow单独过渡:transition: box-shadow 0.3s ease;,避免影响其他属性 - 时间控制在
0.2s–0.4s之间最自然;太短像没动,太长像延迟 - 缓动函数选
ease或ease-out,别用linear(太机械)
图片需有明确的 display 和定位上下文
如果图片是内联元素(display: inline,默认行为),box-shadow 会受行高、基线等干扰,阴影可能被截断或错位。必须显式设置布局模式:
- 常用方案:
display: block;或display: inline-block; - 若图片在 Flex/Grid 容器中,确保父容器没设
overflow: hidden,否则阴影被裁剪 - 慎用
position: relative单独加,除非你真需要堆叠上下文(z-index);多数情况不需要 - 如果阴影仍不显示,检查是否被父级
overflow: hidden截断,或图片外层有border-radius但没配overflow: hidden
移动端触摸设备的兼容性要点
iOS Safari 和部分安卓浏览器对 :hover 支持有限——首次点击才触发 :hover,且不会自动恢复。这不是 bug,是规范行为。如果需要更一致的反馈:
- 可加
@media (hover: hover) and (pointer: fine)媒体查询,仅对鼠标设备启用:hover - 或改用
:active搭配 JS 的touchstart/touchend模拟(但复杂度上升) - 更务实的做法:接受移动端无悬停效果,或用
opacity微调作为降级(比如悬停时变暗 5%,成本低、兼容好)
真正容易被忽略的是:阴影加深效果依赖对比度和背景色。如果页面背景本身就是深灰或黑色,再加深阴影几乎不可见——得同步调亮图片或改用内阴影(inset)或边框强化。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











