CSS效果实现选型:双层box-shadow还是后方叠加双矩形?
多层偏移后置色块效果实现方案选择

两种方案都能实现图中的效果,核心差异在适用场景,可根据实际需求选择:
方案1:双box-shadow实现
这是静态效果下的首选方案:
- 不需要新增任何DOM节点,仅修改目标元素的CSS即可实现,代码最精简
- 色块会自动跟随元素尺寸变化,不需要额外做适配
- 调整偏移量、颜色只需要修改
box-shadow属性值,维护成本极低 - 局限性:阴影是元素的渲染附属效果,无法给两层后置色块单独加动画、交互或者特殊样式(比如渐变、边框、旋转效果)
实现代码参考:
.target-card { width: 320px; height: 200px; background: #ffffff; /* 两层实色阴影,按书写顺序从近到远排列 */ box-shadow: 7px 7px 0 #54c0eb, 14px 14px 0 #ffd166; }
方案2:后置独立矩形实现
如果有自定义动效/样式需求选这个方案,优先用::before、::after伪元素实现,不需要加冗余真实DOM节点:
- 两层后置色块是独立渲染层,可以单独设置渐变、纹理、边框、旋转/缩放动画,甚至绑定交互事件(用真实DOM节点时支持)
- 局限性:如果用伪元素会占用元素的两个伪元素槽位,需要手动设置色块和主元素尺寸同步(一般设
width:100%;height:100%即可自动跟随)
实现代码参考(伪元素版本):
.target-card { width: 320px; height: 200px; background: #ffffff; position: relative; z-index: 1; } .target-card::before, .target-card::after { content: ""; position: absolute; inset: 0; z-index: -1; } .target-card::before { background: #54c0eb; translate: 7px 7px; } .target-card::after { background: #ffd166; translate: 14px 14px; }
最终选择建议
- 仅做静态展示效果,无特殊样式、交互需求:直接用
box-shadow,开发维护成本最低 - 需要给后置色块加独立动画、特殊样式、交互:用伪元素实现后置矩形,灵活度最高
内容的提问来源于stack exchange,提问作者Andrea Monroy
相关产品推荐
相关产品推荐

