Использование z-index

Использование свойства z-index немного сложнее чем может показаться на первый взгляд. Обычно мы не уделяем достаточно внимания порядку наложения элементов. Однако, применяя относительное или абсолютное позиционирование, мы сталкиваемся с тем что элементы занимают одно пространство, перекрывая друг друга. И какой элемент будет на верхнем слое зависит от порядка наложения, который можно задать с помощью свойства z-index.

Если не указывать значения z-index у элементов, по умолчанию будет установлен следующий порядок:

  1. Спозиционированные элементы в том порядке, в котором они присутствуют в HTML коде страницы (чем ниже они в коде, тем выше в порядке).
  2. Инлайновые элементы
  3. Не спозиционированные «плавающие» элементы в том порядке, в котором они присутствуют в коде страницы.
  4. Все не спозиционированные, не «плавающие», блочные элементы в том порядке, в котором они присутствуют в коде страницы.
  5. Фон и граница корневого элемента.

Исходя из этого становится понятно что любой элемент который относительно или абсолютно спозиционирован будет перекрывать все остальные не спозиционированные элементы. А вместе они накладываются на корневой элемент.

По умолчанию свойство z-index принимает значение auto, также оно может принимать целое значение или наследовать его. Целое значение может быть как положительным так и отрицательным, а также быть равным 0. Чем больше положительное значение, тем выше элемент в порядке и соответственно чем больше отрицательное значение — тем элемент ниже. По умолчанию элементы находятся на 0-м слое. В соответствии с этим порядок наложения теперь выглядит следующим образом:

  1. Спозиционированные элементы со значением z-index больше чем 0, затем в порядке появления в HTML коде страницы.
  2. Спозиционированные элементы в том порядке, в котором они присутствуют в коде страницы.
  3. Инлайновые элементы
  4. Не спозиционированные «плавающие» элементы в том порядке, в котором они присутствуют в коде страницы.
  5. Все не спозиционированные, не «плавающие», блочные элементы в том порядке, в котором они присутствуют в коде страницы.
  6. Спозиционированные элементы со значением z-index меньше чем 0, затем в порядке появления в HTML коде страницы.
  7. Фон и граница корневого элемента.

Наложение содержимого

Допустим блоку #front мы установили z-index:5. Тем самым мы устанавливаем новый порядок наложения для всех вложенных элементов блока с id="front". Допустим блок с id="middle" вложен в блок с id="front" и если установить ему значение z-index:2, то он должен перекрыть блок с id="front". Почему? Потому что, после установки z-index в блоке с id="front", для каждого дочернего элемента z-index будет расчитываться относительно блока с id="front":

  1. У блока c id="front" z-index:5.0
  2. У блока с id="middle" z-index:5.2

Пока блок с id="front" является предком, он устанавливает порядок наложения своего содержимого и его локальный уровень можно принять равным 0. Когда мы установили z-index для блока с id="middle", мы установили его локальное значение относительно блока с id="front". Т.к. 2 больше 0, поэтому #middle располагается выше.

Для примера рассмотрим следующий код:

<div id="one">
     <div id="two"></div>
</div>
<div id="three"></div>

Теперь используя CSS, мы спозиционируем элементы так чтобы они перекрывали друг друга:

#one{
    position: absolute;
    left: 0px;
    top: 20px;
    z-index: 10;
}
#two{
    position: absolute;
    left: 50px;
    top: 30px;
    z-index: 15;
}
#three{
    position: absolute;
    left: 100px;
    top: 30px;
    z-index: 12;
}
Первый блок Первый блок Первый блок Первый блок Первый блок Первый блок Первый блок Первый блок

Второй блок Второй блок Второй блок Второй блок Второй блок Второй блок Второй блок Второй блок
Третий блок Третий блок Третий блок Третий блок Третий блок Третий блок Третий блок Третий блок

В результате блок с id="two" находится ниже блока с id="three" даже не смотря на то, что значение z-index у него выше. Это происходит потому что блок с id="two" является дочерним элементом блока с id="one", который устанавливает новый порядок наложения содержимого.

  1. #three 12
  2. #two 10.15
  3. #one 10.0

Ошибка в Firefox

Мы все привыкли что Firefox хорошо поддерживает CSS, однако в этом случае это к сожалению не так. В соответствии со спецификацией CSS2.1, элемент не может быть расположен ниже фона своего родительского элемента. Представим что мы установили отрицательное значение z-index для блока с id="two". Содержимое блока с id="one" должно перекрыть блок с id="two", но фон должен остаться ниже. Результаты показаны на рисунке:

Z-index

Мы видим что во всех сновных браузерах содержимое блока #one перекрывает блок с id="two", тогда как его фон остался на прежнем месте. В Firefox же ситуация иная: блок с id="one" полностью перекрывает блок с id="two". Будьте осторожны, применяя отрицательный z-index.

Заключение

Если вы чувствуете что вам этого мало, зайдите на сайт W3C, где детально описывается порядок наложения не только элементов, но и фона, фоновых изображения и границ. Как и большинство вещей в CSS, здесь есть над чем подумать…

Оригинал: Detailed Look at Stacking in CSS

Обсуждение:

  1. Dimox

    Странно, что разработчики FireFox до сих пор не сделали поддержку отрицательного значения для z-index. Часто этого очень не хватает.

  2. tapazukk

    Хм, чисто с эмоционаьной точки зрения поведение FF кажется верным.

  3. Салат

    Мне тоже не хватает, но эту уж совсем другая история… и не хочу я понимать fox!!!

  4. Картофель

    Читал про фоксовские глюки с цсс и не раз с ними сталкивался. Работаю с ЦМС и делаю сайты под ИЕ но тестю и на лисе. Не думаю что данный глюк уменьшит юзеров лисы.

  5. Pavel

    Только вот не надо рассказывать что IE лучше чем FireFox!!! Наверное не даром не существует толковых заплаток стилей под Фокс, так как он нормально работает, в отличие от InternetExplorera!

    У корпорации Майкрософт явные проблемы с отделом браузерна ИЕ — вышла восьмая версия IE 8 и уже создали заплатку, что бы 8 ая версия работала как 7 ая. Типа режим эмуляции отображения стилей. Встает вопрос, нахрен надо было выпускать тогда такую корявую 8 ую версию?

    Самый толковый и безопасный браузер — это FireFox!

    После идут Safari, Opera
    Chrom от Гугла «хромает», не даром так назвали.
    И только в конце плетется ненависный IE по всем параметрам. Единственный его большой плюс — это сглаживание шрифтов, даже лучше чем в Сафари! Но это единственный плюс. Во всем остальном он проигрывает!

    Кто то скажет: там намного больше программных возможностей!!! А кому нужны эти возможности, если сайт не будет нормально работать в FireFox Opera Safari у других пользователей, которых уже больше чем тех кто на ИЕ! Это же бред отсеивать этих посетителей, потому что у них стоят нормальные браузеры.

    Писать нормальные CMS надо, товарищи программисты — кроссбраузерные! И не лениться!

    • Alex

      А где вы усмотрели представление IE лучше нежели FF?

    • Link

      Павел, вы какие-то очень интересные вещи говорите! :)
      FF чуть ли не глючнее, чем IE. Ужасно дырявое и кривое создание.
      А про существование acid3.acidtests.org тестов вы слышали?
      Между прочим, по результатам этих тестов Opera 10 и Хромой набирают по 100 баллов, в отличае даже от FF 3, которорый набирает 72.
      Про сафари ничего сказать не могу..
      Так что зря вы недолюбливаете Oper’у и Chrome :)

  6. LEGION

    Я честно сказать ни чего не понял! Этот урок походу не для начинающего!

  7. Никита

    Не могли бы вы пожалуйста подсказать мне в чем проблема здесь http://dl.dropbox.com/u/20559449/crossbr/OverSky/forms.html . Выпадающее меню прячеться под изображения, хотя z-index я ему уже поставил 999. У каритинки стоит z-index:2. Я уже неделю, не могу разобраться.

    • Alex

      Возможно вы где-то не закрыли тег, поэтому порядок наложения сбился.

      • Никита

        Во блин. Исправил. Оказывается блоку с контентом надо было поставить z-index:0. Хрен бы догадался если бы не сжал код в три дули.
        Спасибо.

  8. Kosta

    а мне надо было просто присвоить position Элементам, чтобы они отображались в нужной последовательности.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*