使重叠的非悬停元素变暗

Posted

技术标签:

【中文标题】使重叠的非悬停元素变暗【英文标题】:Dim non-hover elements that overlap 【发布时间】:2021-04-20 08:41:18 【问题描述】:

从example 开始,我正在尝试使 html 页面的非悬停元素变暗(即降低不透明度)。

以下代码仅适用于非重叠元素。但是,如果页面包含在背景中重叠的元素,并且我不希望在悬停时对其产生任何影响(例如下面的绿色正方形),那么感兴趣的“可悬停”元素(例如下面的红色圆圈和蓝色矩形)是当它们不悬停时变暗,但当光标仍在背景形状上时。

换句话说:

。绿色方块:不可“悬停”(悬停时不应有任何影响)

。红圈:“可悬停”(即在悬停时使所有其他元素变暗,即蓝色矩形和绿色正方形)

。蓝色矩形:“可悬停”(即在悬停时使所有其他元素变暗,即红色圆圈和绿色正方形)

当悬停在绿色方块上时,如何跳过调暗所有元素?

.parent:hover .child 
  opacity: 0.2;
  transition: all .3s;


.parent .child:hover 
  opacity: 1;
  transition: all .3s;
<svg  >
  <g class="parent">
    <rect x="0" y="0"   fill="green"/>
      
    <g class="child">
      <circle cx="30" cy="45" r="25" fill="red"/>
    </g>
    
    <g class="child">
      <rect x="60" y="80"   fill="blue"/>
    </g>
  
  </g>
</svg>

【问题讨论】:

【参考方案1】:

你唯一的希望(我认为)是使用指针事件:无。

但这会避免任何指针与元素的交互

.parent:hover .child 
  opacity: 0.2;
  transition: all .3s;


.parent .child:hover 
  opacity: 1;
  transition: all .3s;


.nohover 
  pointer-events: none;
<svg  >
  <g class="parent">
    <rect class="nohover" x="0" y="0"   fill="green"/>
      
    <g class="child">
      <circle cx="30" cy="45" r="25" fill="red"/>
    </g>
    
    <g class="child">
      <rect x="60" y="80"   fill="blue"/>
    </g>
  
  </g>
</svg>

【讨论】:

谢谢 vals。这也解决了问题。【参考方案2】:

最简单的选择是将填充的矩形移到 .parent 之外,此时现有 CSS 将按预期工作,因为 .parents 不透明度不会应用于绿色背景。

.parent:hover .child 
  opacity: 0.2;
  transition: all .3s;


.parent .child:hover 
  opacity: 1;
  transition: all .3s;
<svg  >

  <rect x="0" y="0"   fill="green"/>
  
  <g class="parent">
    
    <g class="child">
      <circle cx="30" cy="45" r="25" fill="red"/>
    </g>
    
    <g class="child">
      <rect x="60" y="80"   fill="blue"/>
    </g>
  
  </g>
</svg>

【讨论】:

感谢星展银行。您的解决方案似乎是最简单的。【参考方案3】:

试试这样:

.parent:hover .child 
  opacity: 0.2;
  transition: all .3s;


.parent:hover rect:hover ~.child,
.parent .child:hover 
  opacity: 1;
  transition: all .3s;
<svg  >
  <g class="parent">
    <rect x="0" y="0"   fill="green"/>
      
    <g class="child">
      <circle cx="30" cy="45" r="25" fill="red"/>
    </g>
    
    <g class="child">
      <rect x="60" y="80"   fill="blue"/>
    </g>
  
  </g>
</svg>

由于rect 元素位于.child 元素之前,因此除了.parent:hover 之外,还可以检查其:hover,然后相应地设置.child 元素的样式。

【讨论】:

大神解答!我没有看到这种可能性 感谢 sdgib。您的解决方案效果很好! 不客气!你永远不知道它可能对谁有帮助:)

以上是关于使重叠的非悬停元素变暗的主要内容,如果未能解决你的问题,请参考以下文章

选择除兄弟姐妹和自我之外的所有元素

创建元素数组的非重叠拆分

css 使用CSS使元素变暗

CSS IE 悬停效果 - 重叠元素、显示:块和崩溃

Jquery - 使整个页面变暗并淡出一个 div 元素

使元素与 js 时间轴重叠