最直接给uni-app图片加阴影需用box-shadow属性并套一层view容器,因image组件本身不支持;rpx单位适配多端但app老版本可能不稳定,nvue下几乎不支持,marker图标等原生组件无法通过css加阴影。

uni-app 图片阴影用 box-shadow 最直接
给普通图片(比如 <image></image> 或包裹它的 <view></view>)加阴影,就用 CSS 的 box-shadow,别绕弯子。uni-app 所有平台(H5、小程序、App)都支持这个属性,但要注意:<image></image> 组件本身不支持直接设 box-shadow(部分小程序平台会失效),所以得套一层 <view></view> 容器。
- 写法示例:
.img-container { box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.15); } -
0是水平偏移(不左右偏),4rpx是向下偏移量,12rpx是模糊半径,rgba(0,0,0,0.15)是半透黑阴影 - rpx 单位比 px 更适配多端,但 App 端某些老版本对 rpx 在
box-shadow中解析不稳定,可改用px并配合@media条件判断 - 避免在
<image></image>上直接写style="box-shadow: ..."—— 小程序里常不生效,必须用 class 或外层容器
map 组件的 marker 图标不能动态加阴影
如果你是在 <map></map> 里用 markers 数组渲染自定义图标,那别指望用 CSS 给它加 box-shadow —— 这个图标本质是原生地图视图上的贴图,CSS 样式完全不作用于它。
- 官方只认
iconPath、width、height这几个字段,不支持传入带阴影的样式 - 真要阴影效果,只能提前把阴影画进图标资源里:用 PS 或代码生成一张带投影的 PNG,再作为
iconPath引入 - GIF 动画同理 —— 不能靠 CSS 控制帧或动效,必须是已做好的动图文件
- 注意尺寸:iOS 和 Android 对 marker 图标大小限制不同,加阴影后整体宽高别超平台上限(通常 ≤ 128px)
nvue 页面里 box-shadow 兼容性差
nvue(原生渲染模式)下 box-shadow 支持很有限,尤其 Android 旧机型和 iOS 某些版本会直接不显示,不是写法问题,是底层渲染引擎没实现。
- 别在 nvue 里依赖
box-shadow做关键视觉表达,比如卡片浮层、按钮悬停态 - 替代方案:用两个重叠的
<view></view>,底层稍大、浅灰背景模拟阴影;或用 Canvas 绘制带模糊的矩形(但性能开销明显) - 如果必须用,只在 H5 或较新微信小程序中启用,通过
uni.getSystemInfoSync().platform判断平台后条件编译 - 别尝试
inset内阴影 —— nvue 几乎全平台不支持
TabBar 高斯模糊 ≠ 图片阴影,别混用
有人搜“uni-app 阴影”顺手看到 TabBar 的 blurEffect,以为能拿来给图片加毛玻璃感 —— 不行。那是系统级的视图模糊,只作用于 TabBar 区域本身,和页面内任意元素无关。
-
blurEffect是pages.json里 tabBar 的配置项,影响的是底部 tab 栏的背景,不是内容区 - 想让某张图片看起来“浮在模糊背景上”,得自己用两层结构:底层用
<view></view>+backdrop-filter: blur(10px)(仅 H5 支持),上层放图片 - 小程序里
backdrop-filter不可用,只能用半透明遮罩 + 模糊图作为背景图来模拟 - 记住:TabBar 模糊开启后,页面实际高度变大(
--window-bottom增加),若图片定位用了固定 bottom 值,可能被遮住
box-shadow,而是得随时判断当前运行环境 —— 小程序、H5、App、nvue、不同端系统版本,同一段 CSS 表现可能完全不同。最稳妥的做法:优先用容器包裹 + rpx 单位 + 条件编译兜底,而不是堆砌 hack。











