- Основные понятия
- Слой (Stacking Context)
- Отношение z-index к положению элементов
- Контекст наложения
- Значения z-index
- Автоматическое значение (auto)
- Числовые значения
- Условия работы z-index
- Примеры использования z-index
- Пример 1: Кнопка поверх изображения
- Пример 2: Модальное окно (popup)
- Пример 3: Слайдер или карусель
- Частые ошибки и их решение
- Ошибка 1: z-index не работает
- Ошибка 2: Конфликт контекстов наложения
- Ошибка 3: Отрицательный z-index
- Ошибка 4: Конфликт библиотек или фреймворков
- Советы по работе с z-index
- Используйте ограниченные диапазоны значений
- Ведите документацию
- Используйте CSS-переменные
- Следите за контекстом наложения
- Заключение
z-index
— это CSS-свойство, которое управляет порядком наложения (z-упорядочение) элементов на веб-странице. Оно определяет, какой элемент будет находиться «выше» или «ниже» других в визуальном представлении. Работает это свойство только для тех элементов, которые находятся в одном «контексте наложения».
Простая аналогия вышесказанного: представьте, что вы накладываете листы бумаги друг на друга. Лист с наибольшим значением z-index
будет «самым верхним». Листы с меньшими значениями останутся ниже, а те, у которых z-index
не задан, будут расположены в порядке их появления в HTML.
Примеры использования
- Размещение кнопки поверх изображения.
- Создание всплывающего модального окна.
- Размещение всплывающих подсказок, которые всегда находятся выше других элементов.
- Управление порядком отображения слоев в сложных макетах (например, карусели или анимации).
Почему важно знать про z-index? Без понимания работы z-index
вы можете столкнуться с неожиданными визуальными проблемами: элементы могут «исчезать», быть перекрытыми другими или неправильно взаимодействовать.
Основные понятия
Слой (Stacking Context)
Каждый элемент на веб-странице находится на своем слое. Это упорядоченные уровни, которые формируют так называемый «контекст наложения». Задача z-index
— управлять этими уровнями.
Базовый порядок: если z-index
не указан, браузер отображает элементы в естественном порядке (natural stacking order):
- Фоновые изображения и цвета.
- Блоки с текстом.
- Псевдоэлементы, такие как
::before
и::after
.
Новый контекст наложения: создается, если у родительского элемента есть определенные свойства (например, position
и z-index
, или transform
).
Отношение z-index к положению элементов
Значение z-index
определяет порядок в текущем контексте наложения. Если элементы находятся в разных контекстах, то их z-index
значения никак не взаимодействуют между собой.
Контекст наложения
Контекст наложения создается, когда элемент имеет определенные CSS-свойства, такие как position: relative
, position: absolute
, position: fixed
, position: sticky
, opacity
менее 1, transform
, filter
, flex
, grid
и другие. Этот контекст определяет, как дочерние элементы будут накладываться относительно друг друга.
Как создается новый контекст наложения? Новый контекст наложения создается, когда элемент удовлетворяет одному или нескольким условиям:
- Имеет позиционирование, отличное от
static
(например,relative
,absolute
,fixed
,sticky
). - Имеет непрозрачность (
opacity
) менее 1. - Имеет примененные трансформации (
transform
), фильтры (filter
), или другие свойства, влияющие на контекст наложения.
Значения z-index
Автоматическое значение (auto)
По умолчанию у элементов значение z-index
равно auto
. Это значит, что элемент не имеет заданного уровня и подчиняется правилам естественного порядка.
Числовые значения
- Положительные значения: элементы с
z-index: 10
будут располагаться выше элементов сz-index: 5
. - Отрицательные значения: элементы с
z-index: -1
окажутся ниже всех, включая фон.
Пример:
<div style="position: relative; z-index: 10;">Это верхний слой</div>
<div style="position: relative; z-index: 5;">Это средний слой</div>
<div style="position: relative; z-index: -1;">Это нижний слой</div>
Если у двух элементов одинаковый
z-index
, порядок их отображения зависит от их положения в DOM (первый элемент выше).
Условия работы z-index
Элементы с позиционированием
Для работы z-index
у элемента должно быть задано одно из следующих значений свойства position
:
relative
absolute
fixed
sticky
Если position: static
(значение по умолчанию), свойство z-index
будет игнорироваться.
Пример:
<div style="position: static; z-index: 10;">z-index не работает</div>
<div style="position: relative; z-index: 10;">z-index работает</div>
Контекст наложения
Контекст наложения формируется не только с помощью z-index
, но и при наличии других свойств, таких как:
transform
opacity
filter
will-change
clip-path
Каждый новый контекст изолирован, то есть внутренние элементы не могут «перебить» слои внешних.
Пример:
<div style="position: relative; z-index: 10;">
<div style="transform: scale(1); z-index: 100;">Этот элемент выше только внутри родителя</div>
</div>
Примеры использования z-index
Пример 1: Кнопка поверх изображения
<div style="position: relative;">
<img src="image.jpg" alt="Изображение" style="width: 100%;">
<button style="position: absolute; z-index: 10; top: 20px; left: 20px;">Кнопка</button>
</div>
Здесь кнопка располагается поверх изображения благодаря position: absolute
и z-index: 10
.
Пример 2: Модальное окно (popup)
<div style="position: relative; z-index: 1;">
<p>Контент страницы</p>
</div>
<div style="position: fixed; z-index: 100; background: rgba(0,0,0,0.8); width: 100%; height: 100%; top: 0; left: 0;">
<div style="margin: 100px auto; background: white; padding: 20px; width: 300px; text-align: center;">
Модальное окно
</div>
</div>
Фон затемняет страницу, а модальное окно размещено сверху благодаря z-index: 100
.
Пример 3: Слайдер или карусель
<div style="position: relative; z-index: 5;">Слайд 1</div>
<div style="position: relative; z-index: 10;">Слайд 2 (на переднем плане)</div>
<div style="position: relative; z-index: 5;">Слайд 3</div>
Здесь второй слайд будет поверх остальных благодаря более высокому значению z-index
.
Частые ошибки и их решение
Ошибка 1: z-index не работает
Проблема: элементу задан z-index
, но он не отображается выше других элементов.
Причина: скорее всего, у элемента позиционирование position: static
(по умолчанию).
Решение: задайте элементу position: relative
, absolute
, fixed
или sticky
.
<div style="z-index: 10;">Элемент</div> <!-- z-index не работает -->
<div style="position: relative; z-index: 10;">Элемент</div> <!-- z-index работает -->
Ошибка 2: Конфликт контекстов наложения
Проблема: вложенный элемент с высоким z-index
не перекрывает внешний элемент.
Причина: новый контекст наложения был создан на родительском элементе с помощью таких свойств, как transform
, opacity
, filter
, и т.д.
Решение: проверяйте контексты наложения и избегайте ненужного их создания.
<div style="transform: scale(1); position: relative; z-index: 10;">
<div style="z-index: 100;">Этот элемент выше только внутри родителя</div>
</div>
В этом примере вложенный элемент не сможет перекрыть внешние элементы, так как находится внутри нового контекста.
Ошибка 3: Отрицательный z-index
Проблема: элемент с отрицательным z-index
оказывается полностью скрытым.
Причина: элемент с отрицательным z-index
уходит за фоновые элементы или родительский контекст.
Решение: убедитесь, что отрицательные значения используются с учетом фона и контекста наложения.
<div style="position: relative; z-index: -1;">Этот элемент окажется под фоном</div>
Ошибка 4: Конфликт библиотек или фреймворков
Проблема: готовые библиотеки или фреймворки (например, Bootstrap) используют свои предопределенные значения z-index
.
Решение:
- Проверьте документацию фреймворка.
- Используйте кастомные классы с собственными значениями
z-index
.
Советы по работе с z-index
Используйте ограниченные диапазоны значений
Не нужно задавать z-index: 9999
без необходимости. Лучше структурировать значения:
- 1-10 для базовых элементов.
- 50-100 для модальных окон.
- 100-200 для всплывающих подсказок.
Ведите документацию
Если проект сложный, записывайте, какие значения z-index
и для каких целей вы используете. Это поможет избежать конфликтов.
Используйте CSS-переменные
CSS-переменные облегчают управление слоями.
:root {
--z-modal: 100;
--z-tooltip: 200;
}
Следите за контекстом наложения
Минимизируйте создание новых контекстов, чтобы избежать сложных зависимостей.
Заключение
- z-index — мощное, но требующее внимательного подхода свойство CSS.
- Необходимо учитывать такие факторы, как позиционирование и контексты наложения.
- Правильная организация слоев и документация значительно упрощают работу с
z-index
. - Практика и опыт помогут избежать распространенных ошибок.