直接给加动态阴影需设display: block或inline-block,因默认inline不支持box-shadow;box-shadow稳定兼容,drop-shadow()贴png边缘但不支持内阴影且旧版edge失效。

直接给 <img> 加动态阴影,核心就两条路:用 box-shadow 配合 :hover + transition,或用 filter: drop-shadow() 做更贴形的投影。前者稳定、可控、兼容好;后者对 PNG/SVG 更自然,但不支持内阴影、多层写法,且旧浏览器(IE、早期 Edge)会挂。
为什么 img:hover 的 box-shadow 没反应?
因为 <img> 默认是 display: inline,而 box-shadow 对纯行内元素无效。必须显式设为块级或行内块:
-
img { display: block; }或img { display: inline-block; } - 如果图片在文字流中需保持行内布局,优先选
inline-block - 别忘了加
transition: box-shadow 0.2s ease,否则 hover 时阴影会“啪”一下跳变
drop-shadow() 和 box-shadow 哪个更适合动效?
看场景:
- 要阴影严格贴 PNG 图像边缘(比如带透明毛边的头像),用
filter: drop-shadow(2px 2px 4px rgba(0,0,0,0.2))—— 它按 Alpha 通道描边,box-shadow只框矩形盒 - 但若图片被包在
border-radius+overflow: hidden的容器里(如卡片),drop-shadow()的阴影可能穿出圆角边界,这时反而是box-shadow更稳 -
drop-shadow()不支持inset,也不能写成drop-shadow() drop-shadow()多层,参数顺序也必须严格:x y blur color
怎么让阴影动起来不卡、不闪?
关键不是加多炫的动画,而是控制渲染开销:
- 避免在
hover中同时改transform和box-shadow—— 两者都触发重绘,容易掉帧;优先只动box-shadow,或只动transform: scale() - 模糊值别堆太高:
blur-radius超过20px在滚动/悬停时明显变慢,8px–16px是兼顾质感和性能的甜点区 - 深色背景上慎用
drop-shadow():某些 Safari 版本对高透明度黑+大模糊组合有光晕渲染 bug,表现为边缘发白一闪
真正难的不是写出来,而是判断什么时候该用 drop-shadow() 贴图轮廓,什么时候得退回 box-shadow 套容器——这取决于你的图片有没有透明边缘、容器有没有圆角裁剪、以及要不要支持 Edge 17 以下用户。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











