【问题标题】:Isolation with CSS Mix-Blend-Modes: how to prevent elements from blending with parent使用 CSS Mix-Blend-Modes 进行隔离:如何防止元素与父元素混合
【发布时间】:2023-04-05 09:48:01
【问题描述】:

我尝试了很多不同的方法,但无法使 .pink 和 .green div 相互混合,但不能使父元素 .wrapper 的背景颜色混合。

.wrapper {
  background-color: blue;
  height: 100vh;
  width: 100%;
  isolation: isolate;
}

.pink {
  background: hotpink;
  height: 80%;
  width: 50%;
  position: absolute;
  z-index: 1;
  top: 0;
  left: 10%;
  mix-blend-mode: multiply;
}

.green {
  background: limegreen;
  height: 80%;
  width: 50%;
  position: absolute;
  z-index: 1;
  top: 0;
  right: 10%;
  mix-blend-mode: multiply;
}
<div class="wrapper">
  <div class="pink"></div>
  <div class="green"></div>
</div>

或者,看小提琴:https://jsfiddle.net/grettynebraska/9dr6vspy/5/#&togetherjs=breFHFSfEd

我的目标只是让粉红色和绿色的 div 相互融合,并生活在黑色背景上,它们不会与之融合。

我尝试使用绝对位置,并将粉红色/绿色 div 和包装器作为兄弟姐妹并排放置。但是,所有元素仍然混合在一起。

【问题讨论】:

    标签: html css mix-blend-mode


    【解决方案1】:

    我会考虑一个额外的包装器,您可以在其中设置 z-index 以创建质押上下文,因此该元素将不再与蓝色元素混合:

    .wrapper {
      background-color: blue;
      height: 100vh;
      width: 100%;
    }
    .wrapper > div {
      position:absolute;
      height: 100vh;
      left:0;
      right:0;
      z-index:0;
      top:0;
    }
    
    .pink {
      background: hotpink;
      height: 80%;
      width: 50%;
      position: absolute;
      z-index: 1;
      top: 0;
      left: 10%;
      mix-blend-mode: multiply;
    }
    
    .green {
      background: limegreen;
      height: 80%;
      width: 50%;
      position: absolute;
      z-index: 1;
      top: 0;
      right: 10%;
      mix-blend-mode: multiply;
    }
    <div class="wrapper">
      <div>
        <div class="pink"></div>
        <div class="green"></div>
      </div>
    </div>

    CSS 中创建堆叠上下文的所有内容都必须被视为“孤立”组。 HTML 元素本身不应创建组。

    应用了混合的元素,必须与该元素所属的堆叠上下文的所有底层内容 [CSS21] 混合。 ref

    因此,主要技巧是将元素置于不属于蓝色元素的堆叠上下文中。如果包装器元素是它们的直接父元素,那么将它们放在不同的堆叠上下文中并不是一件容易的事,因此需要额外的包装器。


    隔离对您没有帮助,因为它只会使包装器创建一个堆叠上下文,因此它不会将包装器与其子元素隔离,而是与外部的所有元素隔离。如果您将其应用于额外的包装器,它将完全像设置 z-indexany other property that create a stacking context.

    .wrapper {
      background-color: blue;
      height: 100vh;
      width: 100%;
    }
    .wrapper > div {
      position:absolute;
      height: 100vh;
      left:0;
      right:0;
      isolation:isolate;
      top:0;
    }
    
    .pink {
      background: hotpink;
      height: 80%;
      width: 50%;
      position: absolute;
      z-index: 1;
      top: 0;
      left: 10%;
      mix-blend-mode: multiply;
    }
    
    .green {
      background: limegreen;
      height: 80%;
      width: 50%;
      position: absolute;
      z-index: 1;
      top: 0;
      right: 10%;
      mix-blend-mode: multiply;
    }
    <div class="wrapper">
      <div>
        <div class="pink"></div>
        <div class="green"></div>
      </div>
    </div>

    【讨论】:

    • 一个小补充是,一个带有isolation: isolate 的额外包装器也将创建一个堆栈上下文,就像使用 CSS clip-path 一样。
    • @BryceHowitson 是的,就像我做的最后一个例子 ;) 我还与创建堆叠上下文的所有属性进行了比较(添加列出所有这些属性的链接,包括剪辑路径)
    • 没有看过那个列表,但我想我会让像我这样不读的人很明显...... :) 这个列表很好,它提醒我@987654331 @ 还会创建一个堆叠上下文,这可能会对混合产生负面影响,具体取决于其使用方式。
    • @BryceHowitson 变换是最差的,它还为固定元素创建了一个包含块;)所以它也破坏了固定元素
    • 谢谢。因此,当我在包装器内创建额外的 div 并将其定位为绝对位置时,我为 .wrapper > div 和它所容纳的两个矩形创建了一个堆叠上下文。这是有道理的。我不明白的是为什么当我从 .wrapper 中删除 .wrapper > div 并将其作为与 .wrapper 相邻的同级放置时也会发生混合,并将 .wrapper > div 设置为绝对定位,覆盖在 .wrapper 上。包装背景颜色。在这种情况下,我仍然让矩形与 .wrapper 混合,尽管它们是相邻的并且 .wrapper > div 是绝对的。
    猜你喜欢
    • 2021-04-30
    • 1970-01-01
    • 2015-03-27
    • 2020-12-12
    • 1970-01-01
    • 2016-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多