← Все вопросы

Как наложить один элемент поверх другого через z-index?

Задан 22 месяца назад1.3к просмотров2 ответа
9

Делаю модальное окно и бейдж поверх картинки, но они прячутся под другими блоками. Ставлю z-index: 999 — и иногда работает, иногда нет. Как правильно управлять, что лежит выше?

2 ответа

14
✓ Принятый ответ — помог автору

z-index задаёт порядок наложения по «глубине»: чем больше число, тем выше элемент. Но есть критичное условие.

z-index работает только у позиционированных элементов — то есть с position: relative, absolute, fixed или sticky. У обычного static он просто игнорируется — отсюда «иногда не работает».

.overlay {
  position: fixed;   /* без position z-index бесполезен */
  inset: 0;
  z-index: 100;
}
.modal {
  position: relative;
  z-index: 101;       /* выше оверлея */
}

Вторая ловушка — контекст наложения (stacking context). Если родитель образует свой контекст (например, у него задан z-index, либо opacity меньше 1, либо transform), то z-index ребёнка считается только внутри этого родителя. Поэтому z-index: 9999 у вложенного элемента может проиграть соседнему блоку, чей родитель «выше». Лечится так: поднимайте z-index не у глубоко вложенного элемента, а у того предка, который участвует в общем порядке.

Практический совет: не лепите случайные 999/9999. Заведите шкалу (например, дропдаун 10, шапка 100, модалка 1000) — так конфликтов меньше и логика прозрачна.

5

Если z-index упорно «не слушается», в 90% случаев причина одна из двух: у элемента нет position (кроме static), либо он заперт в контексте наложения родителя с transform/opacity/filter. Откройте инструменты разработчика и проверьте, какой предок создаёт stacking context — обычно проблема там, а не в самом числе.

Ваш ответ

Войдите, чтобы ответить на вопрос.