You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现无重叠阴影?胶囊元素覆盖圆形时阴影互不影响

我来帮你搞定这个问题!先梳理下核心痛点:当胶囊元素(pill)悬停移动覆盖圆形元素(circle)时,两个元素的阴影会叠加变深,而你想要阴影互不干扰、保持各自的透明效果;另外你之前用transition做动画没生效,咱们也一起解决。

问题根源&解决方案

1. 先搞定transition无效的问题

你之前用transition没效果,是因为没给pill设置初始的right值——CSS没法从默认的auto过渡到具体数值(58px)。只需要给pill加上初始right: 0,再用transition替代@keyframes,动画就能平滑运行了。

2. 解决阴影叠加的问题

默认的box-shadow是元素的"固有阴影",哪怕元素被覆盖,阴影依然会完整显示,导致重叠部分颜色变深。改用filter: drop-shadow()就能解决:它会根据元素的可见轮廓生成阴影,当元素被遮挡时,被盖住的部分阴影会自动隐藏,不会和其他元素的阴影叠加,完美满足你"阴影互不影响"的需求。

修改后的完整代码

CSS 部分

body { 
  background-color: aqua; 
} 

#circle1, #circle2 { 
  position: relative; 
  float: left; 
  height: 50px; 
  width: 50px; 
  border-radius: 25px; 
  margin-left: 8px; 
  /* 用drop-shadow替代box-shadow,避免阴影叠加 */
  filter: drop-shadow(0 4px 8px rgba(0, 0, 0, 0.2)) drop-shadow(0 6px 20px rgba(0, 0, 0, 0.19));
  z-index: 0; 
  background-color: white; 
} 

#pill1, #pill2 { 
  position: relative; 
  float: left; 
  height: 50px; 
  width: 100px; 
  border-radius: 25px; 
  margin-left: 8px; 
  filter: drop-shadow(0 4px 8px rgba(0, 0, 0, 0.2)) drop-shadow(0 6px 20px rgba(0, 0, 0, 0.19));
  z-index: 1; 
  background-color: white; 
  right: 0; /* 设置初始right值,让transition生效 */
  transition: right 0.5s linear; /* 改用transition实现平滑动画 */
} 

#pill2 { 
  filter: drop-shadow(0 4px 8px rgba(180, 180, 180, 1)) drop-shadow(0 6px 20px rgba(200, 200, 200, 1));
} 

#circle2 { 
  filter: drop-shadow(0 4px 8px rgba(180, 180, 180, 1)) drop-shadow(0 6px 20px rgba(200, 200, 200, 1));
} 

#pill1:hover, #pill2:hover { 
  right: 58px; 
}

HTML 部分

<div id="circle1"></div> 
<div id="pill1"></div> 
<div id="circle2"></div> 
<div id="pill2"></div>

兼容旧版浏览器的备选方案

如果需要兼容IE这类不支持drop-shadow的浏览器,可以用JS控制阴影显示:

const pill1 = document.getElementById('pill1');
const circle1 = document.getElementById('circle1');
const pill2 = document.getElementById('pill2');
const circle2 = document.getElementById('circle2');

// 悬停时隐藏对应圆形的阴影
pill1.addEventListener('mouseenter', () => circle1.classList.add('hide-shadow'));
pill1.addEventListener('mouseleave', () => circle1.classList.remove('hide-shadow'));
pill2.addEventListener('mouseenter', () => circle2.classList.add('hide-shadow'));
pill2.addEventListener('mouseleave', () => circle2.classList.remove('hide-shadow'));

再给CSS加个类:

.hide-shadow {
  box-shadow: none !important;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:50:52