Большинство ответов здесь неверны; некоторые работы, но не по той причине, что они заявляют. Вот некоторые объяснения.
Вот так должен работать z-index в соответствии с спецификацией :
- вы можете присвоить значение
z-index
любому элементу; если нет, по умолчанию auto
- позиционированные элементы (то есть элементы с атрибутом
position
, отличным от значения по умолчанию static
) с z-index
, отличным от auto
, создают новый контекст стека . Контексты суммирования - это «единицы» перекрытия; один контекст суммирования находится либо полностью над другим (то есть каждый элемент первого выше любого элемента второго), либо полностью ниже него.
- в том же контексте стека сравнивается уровень стека элементов. Элементы с явным значением
z-index
имеют это значение в качестве уровня стека, другие элементы наследуются от своих родителей. Элемент с более высоким уровнем стека отображается сверху. Когда два элемента имеют одинаковый уровень стека, обычно тот, который находится позже в дереве DOM, отображается сверху. (Более сложные правила применяются, если они имеют другой атрибут position
.)
Другими словами, когда для двух элементов установлено z-index
, чтобы решить, какие из них будут отображаться сверху, вам нужно проверить, есть ли у них какие-либо позиционные родители, у которых также установлен z-index
. Если они этого не делают или родители являются общими, побеждает тот, у кого более высокий z-индекс. Если они это сделают, вам нужно сравнить родителей, и z-index
детей не имеет значения.
Таким образом, z-index
определяет, как элемент размещается по сравнению с другими дочерними элементами его «родительского стека» (ближайший предок с набором z-index
и position
из relative
, absolute
или fixed
), но это не имеет значения при сравнении с другими элементами; учитывается z-index
родителя-стека (или, возможно, z-index
родителя-стека родителя-стека и т. д.). В типичном документе, где вы используете z-index
только в нескольких элементах, таких как раскрывающиеся меню и всплывающие окна, ни один из которых не содержит другого, родительский элемент всех элементов, имеющих z-index
, является целым документом, и вы обычно можете не думайте о z-index
как о глобальном упорядочении на уровне документа.
Принципиальное отличие IE6 / 7 состоит в том, что позиционированные элементы запускают новые контексты стекирования, независимо от того, установлены они z-index
или нет. Поскольку элементы, которым вы бы инстинктивно присваивали значения z-index
, как правило, абсолютно позиционированы и имеют относительно позиционированного родителя или близкого предка, это будет означать, что ваши z-index
-элементные элементы вообще не будут сравниваться, вместо этого их позиционированные предки будет - и так как у них не установлен z-index, порядок документов будет преобладать.
В качестве обходного пути вам нужно выяснить, какие предки на самом деле сравниваются, и назначить им некоторый z-index для восстановления нужного вам порядка (который обычно будет обратным порядком документа). Обычно это делается с помощью javascript - для выпадающего меню вы можете просматривать контейнеры меню или родительские элементы меню и назначать им z-index
1000, 999, 998 и т. Д. Другой метод: когда всплывающее или раскрывающееся меню становится видимым, найдите всех его относительно расположенных предков и присвойте им класс on-top
, который имеет очень высокий z-индекс; когда он снова станет невидимым, удалите классы.