Подтвердить что ты не робот

Z-индекс Относительный или Абсолютный?

Я пытаюсь найти ответ на следующий вопрос:

Является ли элемент z-index его абсолютным порядком стека или его порядком стека относительно его родителя?

Например, предположим, что у меня есть следующий код:

<div style="z-index:-100">
    <div id="dHello" style="z-index:200">Hello World</div>
</div>

<div id="dDomination" style="z-index:100">I Dominate!</div>

Какой из них будет впереди - #dello или #dDomination?

Это просто для примера. Я пробовал это в разных местах, и результаты, похоже, меняются. Я вижу, знает ли кто-нибудь авторитетного источника для урегулирования:

1) Каковы фактические стандарты в отношении z-индекса (по этой теме конкретно)? 2) Как отдельные браузеры различаются в своей фактической реализации?

Спасибо!

4b9b3361

Ответ 1

z-index является относительным. См. Подробный ответ , который я написал для аналогичного вопроса.

Если ни один из других элементов не имеет определенного z-index, используя z-index: 1 будет в порядке.

Модель: как определяется z-индекс?

                                         z-index
<div id=A>                                Auto 1
    <div id=B>                            Auto 1.1
       <div id=C style="z-index:1"></div>          Manual 1
       <div id=D></div>                   Auto 1.1.2
    </div>                                
    <div id=E></div>                      Auto 1.2
</div>
<div id=F></div>                          Auto 2

Во-первых, прямой проходят дочерние узлы тела. Два элемента: столкнулись: #A и #F. Им присваивается z-индекс 1 и 2. Это шаг повторяется для каждого (дочернего) элемента в документе.

Затем проверяются вручную установленные свойства z-index. Если два z-index значения равны, их позиция в дереве документов по сравнению.

Ваш случай:

<div id=X style="z-index:1">          Z-index 1
    <div id=Y style="z-index:3"></div> Z-index 3
</div>
<div id=Z style="z-index:2"></div>    Z-index 2

Вы ожидаете, что #Y перекрытие #Z, потому что a z-index of 3 явно выше 2. Ну, вы ошибаетесь: #Y - ребенок #X, с z-index от 1. Два выше одного, и, следовательно, #Z будет отображаться над #X (и #Y).

Вот плункер, чтобы визуализировать это немного лучше: http://plnkr.co/edit/CCO4W0NS3XTPsVL9Bqgs?p=preview

Ответ 2

Afaik, z-index не работает, если этот элемент не установлен на position: relative; Если у этого же элемента был дочерний элемент с position: relative;, а z-index был установлен выше, ребенок показывал бы поверх своего родителя.

Таким образом, он имеет элементы как "абсолютного", так и "относительного" порядка стека, как вы его сформулировали.

Все браузеры в значительной степени справляются с этим, я думаю.

Ответ 3

Вот спецификация W3C для z-index.

Я думаю, что самая важная строка, основанная на вашем вопросе, такова:

Порядок рисования дерева рендеринга на холсте описанных в терминах контекстов укладки. Контексты стеков могут содержать дополнительные контексты стекирования. Контекст стекирования является атомарным из точки представления его родительского стекового контекста; коробки в другой укладке контексты могут не пересекаться ни с одним из его полей.

Это указывает на то, что между div с z-index: -100 и div с z-index: 200 ничего не может быть сделано.

Ответ 4

Например:

  <!DOCTYPE html>
<html>
<head>
<style>

.x1 {
    position:relative;
    width:100%;
    clear:both;
    display:block;
  z-index:1000;
}

.x2 {
    position:fixed;
    width:100%;
    height:50px;
    background-color:#ff0000;
}

.x3 {
    position:relative;
    height:250px;
    width:600px;
    background-color:#888;
}
.x4 {
    position:relative;
    height:250px;
    width:600px;
    background-color:#0000ff;
}
.x5 {
    position:relative;
    height:250px;
    width:600px;
    background-color:#ff00ff;
}
.x6 {
    position:relative;
    height:250px;
    width:600px;
    background-color:#0000ff;
}

</style>

</head>
<body>
<div class='x1'>this class is relative
<div class='x2'>this class is fixed</div>
</div>

<div class='x3'>x3: this class is relative</div>
<div class='x4'>x4: this class is relative</div>
<div class='x5'>x5: this class is relative</div>
<div class='x6'>x6: this class is relative</div>
<div class='x3'>x3: this class is relative</div>

</body>
</html>