如何实现filter: drop-shadow属性的彩虹水平渐变投影效果?
实现方案
该需求可通过CSS遮罩特性实现,filter: drop-shadow 本身不支持直接传入渐变作为阴影颜色,我们可以通过伪元素叠加的方式在不修改原有DOM结构的前提下,得到匹配PNG透明轮廓的彩虹渐变投影。
核心实现逻辑
- 给图片的父容器设置
position: relative,作为伪元素的定位基准 - 用
::before伪元素生成和图片尺寸一致的水平彩虹渐变层,位置偏移到你需要的阴影坐标 - 给渐变层加上
filter: blur()模拟阴影的模糊效果,参数和你之前drop-shadow的模糊值保持一致即可 - 给渐变层加上
mask-image并绑定你的PNG资源地址,渐变层只会显示和原图非透明区域一致的轮廓,完全匹配PNG的形状 - 把渐变层的
z-index调整到图片下方,即可得到最终效果
/* 图片父容器样式 */ .img-wrapper { position: relative; display: inline-block; } /* 彩虹投影层 */ .img-wrapper::before { content: ""; position: absolute; /* 阴影偏移量,对应你之前drop-shadow的x、y偏移 */ left: 4px; top: 4px; width: 100%; height: 100%; /* 水平彩虹渐变,可自行调整色标、渐变角度 */ background: linear-gradient(90deg, red, orange, yellow, green, blue, indigo, violet); /* 模糊半径对应drop-shadow的模糊参数 */ filter: blur(8px); /* 匹配原图轮廓,url替换为你的PNG资源地址 */ -webkit-mask-image: url(your-image.png); mask-image: url(your-image.png); -webkit-mask-size: 100% 100%; mask-size: 100% 100%; z-index: -1; } /* 原图片样式 */ .img-wrapper img { display: block; width: 100%; height: auto; }
注意事项
- 如果需要调整阴影的不透明度,可以给渐变层加
opacity属性控制 - 若项目需要兼容老旧浏览器,可提前检测
mask属性的支持性,降级为普通单色drop-shadow即可 - 该方案支持任意形状的透明PNG、SVG素材,投影轮廓完全和素材保持一致,不会出现
box-shadow的矩形阴影问题
内容的提问来源于stack exchange,提问作者user17127452
相关产品推荐
相关产品推荐

