CSS-свойство z-index
Используйте CSS-свойство z-index для управления порядком наложения элементов. Узнайте о значениях свойства и попробуйте примеры.
CSS-свойство z-index управляет порядком наложения перекрывающихся элементов — определяет, какой из них отображается спереди, а какой скрыт позади. Название происходит от воображаемой оси z: ось x идёт слева направо, ось y — сверху вниз, а ось z направлена из экрана к наблюдателю. Элемент с более высоким z-index располагается ближе к пользователю и перекрывает элементы с меньшим значением.
На этой странице рассматривается, что делает z-index, почему он работает только на позиционированных элементах, как контексты наложения определяют, какие значения вообще сравниваются между собой, а также наиболее частые причины, по которым z-index «не работает».
Как работает наложение
По умолчанию при перекрытии элементов тот, который расположен позже в HTML-источнике, отрисовывается поверх остальных. z-index позволяет явно переопределить этот порядок. Например, z-index: 10 будет находиться выше z-index: 1 вне зависимости от порядка в источнике, а отрицательные значения, такие как z-index: -1, помещают элемент позади его родителя.
Однако z-index — это не глобальный рейтинг. Значения сравниваются только в пределах одного контекста наложения. Контекст наложения — это самостоятельный слой: каждый элемент внутри него укладывается относительно своих соседей, а вся группа затем укладывается как единое целое внутри родительского контекста. Корневой элемент страницы (<html>) создаёт первый контекст наложения, а определённые свойства создают новые (см. ниже).
Свойство z-index не оказывает никакого эффекта на static-элементы (значение по умолчанию). Оно применяется только к позиционированным элементам — тем, у которых position установлено в relative, absolute, fixed или sticky — а также к элементам flex/grid.
| Начальное значение | auto |
|---|---|
| Применяется к | Позиционированным элементам. |
| Наследуется | Нет. |
| Анимируемое | Да. |
| Версия | CSS2 |
| DOM-синтаксис | object.style.zIndex = "-1"; |
Синтаксис
Синтаксис CSS-свойства z-index
z-index: auto | number | initial | inherit;Пример свойства z-index с отрицательным значением:
Пример CSS-свойства z-index с отрицательным значением
<!DOCTYPE html>
<html>
<head>
<title>Title of the document</title>
<style>
img {
position: absolute;
left: 0;
top: 10px;
z-index: -1;
}
</style>
</head>
<body>
<h2>Z-index property example</h2>
<img src="https://api.w3docs.com/uploads/media/default/0001/01/0710cad7a1017902166203def268a0df2a5fd545.png" alt="W3docs logo" width="200" height="100" />
</body>
</html>Пример свойства z-index с положительным значением:
Пример CSS-свойства z-index с числовым значением
<!DOCTYPE html>
<html>
<head>
<title>Title of the document</title>
<style>
#blue,
#green,
#grey {
position: absolute;
width: 150px;
height: 150px;
color: #eee;
opacity: 0.95;
padding: 15px;
line-height: 100px;
text-align: center;
}
#blue {
z-index: 1;
background-color: #1c87c9;
top: 60px;
left: 50px;
line-height: 1;
}
.black {
height: 80px;
width: 160px;
background-color: #000;
line-height: 100px;
bottom: 20px;
position: absolute;
z-index: 10;
}
#green {
z-index: 2;
background-color: #8ebf42;
top: 100px;
left: 170px;
}
#grey {
background-color: #666;
top: 200px;
left: 100px;
}
</style>
</head>
<body>
<h2>Z-index property example</h2>
<div class="container">
<div id="blue">
Blue
<div class="black">Black</div>
</div>
<div id="green">Green</div>
<div id="grey">Grey</div>
</div>
</body>
</html>Блоки перекрываются, потому что все они абсолютно позиционированы. Синий блок (z-index: 1) находится под зелёным блоком (z-index: 2), а у серого блока нет z-index, поэтому он подчиняется порядку в источнике. Обратите внимание, что чёрный блок (z-index: 10) вложен внутрь синего блока: его z-index: 10 сравнивается только с другими дочерними элементами синего блока, поэтому он не может подняться выше зелёного, даже несмотря на то что 10 > 2. Это и есть правило контекста наложения в действии.
Результат

Значения
| Значение | Описание | Попробовать |
|---|---|---|
| auto | Уровень наложения создаваемого блока равен уровню родительского. Это значение по умолчанию. | Попробовать » |
| number | Уровень наложения создаваемого блока задаётся числом. Допустимы отрицательные значения. | Попробовать » |
| initial | Устанавливает для свойства его значение по умолчанию. | Попробовать » |
| inherit | Наследует свойство от родительского элемента. |
Что создаёт новый контекст наложения
Понимание контекстов наложения — ключ к освоению z-index. Новый контекст создаётся, в частности, следующим:
- Корневым элементом
<html>. - Позиционированным элементом (
relative,absolute,fixed,sticky) со значениемz-index, отличным отauto. - Дочерним элементом flex- или grid-контейнера со значением
z-index, отличным отauto. - Элементом со значением
opacityменьше1(см. opacity). - Элементом со значением
transform,filter,perspective,clip-pathилиmask, отличным отnone(см. transform). - Элементом с
position: fixedилиposition: sticky. - Элементом с
isolation: isolate. - Элементом с
will-change, установленным на свойство, которое создаёт контекст.
Как только элемент формирует контекст наложения, значения z-index его потомков «заперты» внутри него — они никогда не смогут вырваться наружу и конкурировать с элементами за пределами родителя.
Почему ваш z-index «не работает»
Вот типичные причины, расположенные в порядке частоты возникновения:
- Элемент является
static.z-indexмолча игнорируется, еслиpositionне установлен вrelative,absolute,fixedилиsticky(или элемент не является flex/grid-элементом). Сначала задайте позиционирование. - Родительский элемент формирует контекст наложения. Модальное окно с
z-index: 9999может оказаться скрытым за другим элементом, если его предок находится в контексте наложения с меньшим значением. Решение — поднятьz-indexпредка, а не потомка. - Предок имеет
opacityилиtransform. Даже безобидныйopacity: 0.99илиtransform: translateZ(0)(часто добавляемый для «GPU-ускорения») создаёт контекст наложения и может заблокировать дочерние элементы. - Вы боретесь с порядком в источнике. Без
z-indexпобеждают элементы, расположенные позже. Иногда проще переупорядочить HTML, чем вести «гонкуz-index».
Избегайте больших «магических чисел» вроде z-index: 999999. Они делают порядок наложения невозможным для понимания. Используйте небольшую задокументированную шкалу (например 1, 10, 100, 1000 для контента, выпадающих меню, фиксированных панелей и модальных окон).
Пример: изоляция контекста наложения
Свойство isolation: isolate создаёт новый контекст наложения без изменения позиционирования или прозрачности. Это самый чистый способ ограничить значения z-index компонента:
.card {
/* z-index values inside .card now stay inside .card */
isolation: isolate;
}Связанные свойства
- position — необходимо для того, чтобы
z-indexимел эффект. - opacity — значения ниже
1создают контекст наложения. - transform — значения, отличные от
none, создают контекст наложения.