【问题标题】:Override CSS Z-Index Stacking Context覆盖 CSS Z-Index 堆叠上下文
【发布时间】:2013-11-08 01:31:15
【问题描述】:

我正在尝试覆盖/忽略一个元素的堆叠上下文,以便它可以定位在相对于页面根目录的 z 轴上。

不过根据What No One Told You About Z-Index的文章:

如果一个元素包含在堆叠顺序底部的堆叠上下文中,则无法让它出现在堆叠顺序更高的不同堆叠上下文中的另一个元素之前,即使使用z-index 十亿!

可以通过以下三种方式之一在元素上形成新的堆叠上下文:

  • 当一个元素是文档的根元素(元素)时
  • 当元素具有非静态的位置值和非自动的 z-index 值时
  • 当元素的不透明度值小于 1 时

下面的例子:

.red, .green, .blue { position: absolute; }
.red   { background: red; }
.green { background: green; }
.blue  { background: blue; }
<div><span class="red">Red</span></div>
<div><span class="green">Green</span></div>
<div><span class="blue">Blue</span></div>

如果第一个 div 被赋予opacity:.99;,(这会在第一个节点上创建一个new stacking context)那么即使如果.redz-index:1,它仍然会被放置在其他元素的后面 因为它只是呈现为该堆栈中的最高元素。

Working Demo in jsFiddle

看起来像这样:

:有没有办法让元素忽略其任何父元素的堆栈上下文并要求相对于页面的原始堆栈上下文定位?

【问题讨论】:

    标签: css z-index


    【解决方案1】:

    :有没有办法让元素忽略其任何父元素的堆栈上下文并要求相对于页面的原始堆栈上下文定位?

    不,如果不重新定位 DOM 中的元素,就不可能在堆叠上下文之间传输定位元素。您甚至无法使用 position: fixedposition: absolute 将元素移动到根堆叠上下文(正如您所观察到的,.red 相对于其父元素 div:first-child 定位,因为它创建了一个新的堆叠上下文)。

    话虽如此,鉴于您的 HTML 和 CSS,只需将类重新分配给 div 元素应该是微不足道的,如其他答案和 here 所示,因此您所有的 divs 和 spans参与根堆叠上下文:

    <div class="red"><span>Red</span></div>
    <div class="green"><span>Green</span></div>
    <div class="blue"><span>Blue</span></div>
    

    但你的情况可能并不像看起来那么简单。

    【讨论】:

    • 如果他问这种问题,可能不像他提供的例子那么简单,要改变会很痛苦;但正如您所指出的,他唯一的选择是重新分配类或移动元素。
    • BoltClock,感谢您的回答,尽管@BrianGraham 是正确的,该示例用于说明我的问题,而不是问题本身。我正在处理的实际问题是回答关于 SO 的另一个问题:How do I get Bootstrap Tour to work with a jQuery dialog?,我最终通过重新排列 DOM 解决了这个问题。
    • 我现在正在处理这个问题,但它不像重新排序 dom 那样容易,因为我使用 react 导入了它的组件,我想我可以手动处理它以使其工作,但它总是有点棘手您开始重新组织其他人的组件,该组件本质上是它自己的库。那么有没有更新的东西可以处理这个问题?我知道这是一个老问题。
    • @carinlynchin:不,我不知道。
    【解决方案2】:

    我们可以使用 3D 转换来做到这一点,即使它被困在堆叠上下文中,我们也可以将任何元素带到前面:

    .red,
    .green,
    .blue {
      position: absolute;
      width: 100px;
      color: white;
      line-height: 100px;
      text-align: center;
    }
    
    body,
    div:first-child {
      transform-style: preserve-3d; /* this is important for the trick to work */
    }
    .red {
      top: 20px;
      left: 20px;
      background: red;
      /*z-index: 1; we no more need this */
      transform:translateZ(1px); /* this will do the trick  */
    }
    
    .green {
      top: 60px;
      left: 60px;
      background: green;
    }
    
    .blue {
      top: 100px;
      left: 100px;
      background: blue;
    }
    <div><span class="red">Red</span></div>
    <div><span class="green">Green</span></div>
    <div><span class="blue">Blue</span></div>

    更多细节和例子在这里:Why can't an element with a z-index value cover its child?

    【讨论】:

    • 代码 sn-p 不起作用——红色仍在底部。我在 Macbook 上使用 Chrome。
    • @JohnMiller 已修复
    【解决方案3】:

    正如The stacking context 中所述:“使用 z-index,某些元素的渲染顺序受其 z-index 值的影响。发生这种情况是因为这些元素具有导致它们形成堆叠上下文的特殊属性。

    要部分克服堆叠内容问题,您可以使用 css 属性来显示不需要的元素:

    opacity: 0.1;
    

    display: none;
    

    【讨论】:

    • 这个答案实际上是我特定情况下唯一实用的答案。
    • 在我的也是:-)
    猜你喜欢
    • 1970-01-01
    • 2021-11-28
    • 2021-06-17
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多