You need to enable JavaScript to run this app. 如何让drop-shadow滤镜的深色阴影仅投射在深色条纹,不在白底显示
优惠活动
大模型
产品
解决方案
定价
更多

如何让drop-shadow滤镜的深色阴影仅投射在深色条纹,不在白底显示

实现思路

现有方案的核心问题是:全局作用的drop-shadow滤镜会让投影无差别地渲染在元素下方的所有层级上,无法自动识别投影的承载面,自然会漏到最底层的白色基底上。此前尝试的混合模式方案存在逻辑偏差——黑色阴影在白色背景上对比度高会更显眼,在黑色横条上会和黑底融合,最终出现反向的显示效果。

要实现“阴影只在黑色横条上显示、白色区域完全无阴影”的效果,不需要依赖复杂的混合模式,仅通过独立阴影层+精准裁剪的方式,将阴影的显示范围严格限定在黑色横条区域内即可。

具体调整步骤

1. 重构DOM结构

将原PNG素材上的阴影效果拆分出独立的投影层,投影层的元素和原PNG素材一一对应,不携带任何素材实体的渲染逻辑,仅负责生成阴影效果,调整后的DOM结构为:

<div className="main-section-container">
  {/* 深色横条元素 */}
  <h3 className="main-section-title">About us</h3>

  {/* 原PNG容器:仅放置无阴影的素材本体,保持原有的前后交错层级 */}
  <div className="about-us-image-container">
    <img src={justiceBg} className="justice-bg" />
    <img src={justiceArm} className="justice-arm" />
    <img src={scaleBase} className="justice-scale-base" />
    <img src={scaleLeft} className="justice-scale-left" />
    <img src={scaleRight} className="justice-scale-right" />
  </div>

  {/* 新增:独立阴影层,元素和上述素材完全一一对应 */}
  <div className="about-us-shadow-layer">
    <img src={justiceBg} className="justice-bg" />
    <img src={justiceArm} className="justice-arm" />
    <img src={scaleBase} className="justice-scale-base" />
    <img src={scaleLeft} className="justice-scale-left" />
    <img src={scaleRight} className="justice-scale-right" />
  </div>
</div>

2. 调整SASS样式逻辑

  • 移除所有原PNG元素上的drop-shadow滤镜,减少冗余渲染
  • 给独立阴影层添加矩形裁剪规则,让阴影层的可见范围和黑色横条的位置、尺寸完全重合,超出横条范围的阴影部分全部裁切不可见
  • 按原有交错逻辑调整各层z-index,保证层级正确:
    • 黑色横条后方的素材在最下层
    • 黑色横条在中间层
    • 独立阴影层压在横条上方、前层素材下方
    • 黑色横条前方的素材在最上层
.main-section-container
  position: relative

// 深色横条
.main-section-title
  position: relative
  z-index: 1
  background: $black
  width: 100%

// 原PNG素材容器(无阴影)
.about-us-image-container
  position: absolute
  inset: 0
  z-index: 2
  pointer-events: none
.about-us-image-container > *
  position: absolute
  top: -35%
  right: 40%
  width: 100%
  min-height: 600px
  transform-origin: 26% 19%
  will-change: transform

// 原位于横条后方的素材(justice-arm)
.justice-arm
  position: absolute
  inset: 0
  z-index: 0 // 放在横条下层

// 新增独立阴影层
.about-us-shadow-layer
  position: absolute
  inset: 0
  z-index: 1.5 // 刚好在深色横条(z-index:1)和前层素材(z-index:2)之间
  pointer-events: none
  // 核心裁剪:锁定阴影显示范围与深色横条完全对齐
  // 可根据实际横条尺寸调整clip参数,保证裁剪区域和横条矩形完全重合
  clip-path: inset(0 0 calc(100% - 深色横条实际高度) 0)
.about-us-shadow-layer > *
  // 完全复用原素材的定位、尺寸规则,和素材本体完全对齐
  position: absolute
  top: -35%
  right: 40%
  width: 100%
  min-height: 600px
  transform-origin: 26% 19%
  will-change: transform
  // 将原drop-shadow效果移至该层实现
  filter: drop-shadow(10px 4px 4px rgba(0,0,0,0.75))
效果说明
  • 阴影层因为被裁剪为和黑色横条完全重合的矩形范围,横条外的白色基底区域不会残留任何阴影
  • 阴影层卡在横条和上层素材之间,所有素材投射在横条上的阴影会正常显示,包括位于横条后方的人形、天平部件的投影也会正常呈现
  • 不依赖混合模式,从根本上避免了之前阴影反向显示的问题
  • 后续如果素材位置、横条尺寸有动态调整,仅需要同步更新clip-path的裁剪参数,保证裁剪范围和横条对齐即可。

内容的提问来源于stack exchange,提问作者user8145466

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.04 14:06:09