css - 浏览器用来处理 z-index 的算法是什么?

标签 css

有人可以提供浏览器用来处理 z-index 的算法/伪代码吗?我似乎总是遇到一些极端情况,在使用 z-index 时,我的期望不符合观察到的行为。我认为理解 z-index 的最好方法可能是研究浏览器用来处理它的算法。我认为算法会是这样的:

render(Node n)
{
    var contexts = [n.stackingContext]; // initialize by creating a single root context
    for(var child in n.children)
    {
        if (child has a z-index set using either z-index:number or z-index:inherit)
        {
            create new stacking context with z-index = z-index above and
            insert this stackingContext into appropriate position in contexts such that
            contexts is always sorted in increasing order of z-index
        }
    }
    for(var context in contexts)
    {
        for(var node in context.nodes) // context.nodes returns nodes in increasing order of z-index
        {
            render(node);
        }
    }
}

并且该方法将像 render(document.body) 一样调用以呈现整个 DOM,但是当我在下面的示例中运行上面的伪代码时,它不会给出预期的结果:

例如,W.r.t.这段代码:

HTML:

<div id="div0">
<div id="div1">
    <div id="div2"></div>
</div>
<div id="div3"></div>
</div>    

CSS:

div
{
    width:100px;
    height:100px;
    position:absolute;
}

#div0
{
z-index:69;    
}

#div1
{
    top:0;
    left:0;
    background:rgba(0,0,255,0.8);
}

#div2
{
    top:20px;
    left:20px;
    z-index:10;
    background:rgba(0,255,0,0.8);
}

#div3
{
    top:10px;
    left:10px;
    z-index:5;
    background:rgba(255,0,0,0.8);
}

js fiddle 在这里:http://jsfiddle.net/z7hemun3/9/

我希望 div3 位于顶部,因为它将创建一个新的堆叠上下文,而 div1 将共享其父级的堆叠上下文,而子级的堆叠上下文(在本例中为 div3)出现在父级的堆叠上下文之上( div0 是 div3 的父级)。但是,div2 出现在顶部,然后是 div3,然后是 div1。 所以看起来 div2 和 div3 的堆栈上下文相互竞争,即使 div2 和 div3 在 dom 树中处于不同级别。

一会儿,上面似乎违反了我从这个 fiddle 中学到的东西:http://jsfiddle.net/z7hemun3/5/

<div id="div1">
    <div id="div2"></div>
    <div id="div3"></div>
</div>


div
{
    width:100px;
    height:100px;
    position:absolute;
}

#div1
{
    top:0;
    left:0;
    z-index:10;
    background:rgba(255,0,0,0.8);
}

#div2
{
    top:10px;
    left:10px;
    z-index:1;
    background:rgba(0,255,0,0.8);
}

#div3
{
    top:20px;
    left:20px;
    background:rgba(0,0,255,0.8);
}

我从 second fiddle 得到的教训是,子元素将始终显示在父元素之上,即使它的 z-index 小于父元素的 z-index。

最佳答案

我不打算详细介绍具体的算法,而是介绍这些指标的计算方式。

在您的第一个示例中,三个(红色、绿色和蓝色)div (1-3) 是(父)div0 元素的嵌套(子)元素。

Z-Indexing is relative with regards to the closest positioned parent element.

由于您使用了将 position:absolute 应用于每个 div 的 css 指令,因此每个 div 元素都已“定位”。

考虑到嵌套后,div0 位于 69。但是,关于它的 children,div 位于 z-index 0,因为它现在是相对定位的元素。 default(0)、5 和 10 的子级 z-index 都堆叠在父级 div0 之上。相对于div0,分别在它上面0、5、10。相对于 div0 的父级,它们在它上面 69、74 和 79。

关于css - 浏览器用来处理 z-index 的算法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27390333/

相关文章:

html - @font-face 根本不工作

javascript - jQuery : How to wait scrollTop animation to finish before do something?

javascript - 如何使图像之间的过渡平滑

javascript - 浏览器的 "Previous"按钮位置改变了吗?

css - 修复隐藏在滚动条上的 div 导航

html - 移动 View 右侧的 Bootstrap 空白

javascript - 在过渡期间,如何获得其他元素的最终偏移量?

html - 如何通过对齐的列表项填充空白

css - 我的 php 表在 IE 中显示正常,但在 Chrome 中显示不正常

javascript - jQuery固定位置滚动闪烁修复?