Позиционирование, z-index, stacking context
↑ 1.3 CSS и SASS · ← Предыдущая · → Следующая
Зачем это на собесе
«Почему z-index не работает?» — классика про stacking context.
Объяснение
position | Поведение |
|---|---|
static | по умолчанию, top/left не работают |
relative | смещение от своей позиции, остаётся в потоке, задаёт контекст для потомков |
absolute | вне потока, относительно ближайшего позиционированного предка |
fixed | относительно viewport |
sticky | липнет при прокрутке между relative и fixed (нужен top) |
.modal-overlay { position: fixed; inset: 0; background: rgb(0 0 0 / .5); z-index: 100; }
.badge { position: absolute; top: -4px; right: -4px; } /* родитель: position: relative */
.header { position: sticky; top: 0; }z-index работает только у позиционированных элементов (и flex/grid-потомков) внутри своего stacking context — изолированной группы наложения.
Stacking context создаётся: корневым элементом, position с z-index не auto, opacity < 1, transform, filter, will-change, isolation: isolate, position: fixed/sticky, flex/grid-потомками с z-index.
Правило: элемент с z-index: 9999 не выйдет из родительского контекста с меньшим z-index — сравниваются контексты родителей.
.dropdown-wrapper { isolation: isolate; } /* локальный контекст, чтобы z-index внутри не влиял на страницу */Нюансы и подводные камни
- Не сравнивайте
z-indexиз разных контекстов. - Модальные окна и подсказки выносят в
<body>(Teleport во Vue), чтобы избежать обрезкиoverflowи контекстов. transformна родителе меняет поведениеposition: fixedпотомка (становится относительным родителя).stickyне работает, если у предкаoverflowнеvisible.- «Лестница»
z-index: 999999— признак проблемы архитектуры слоёв: введите шкалу токенов.
Практика
- Воспроизведите ситуацию с недействующим
z-indexи исправьте черезisolation. - Сделайте липкую шапку таблицы.
- Введите переменные слоёв:
--z-dropdown,--z-modal,--z-toast.
Вопросы с ответами
Почему z-index не работает?
Элемент не позиционирован, либо находится в другом stacking context, чей уровень ниже.
Чем fixed отличается от absolute?
fixedпривязан к viewport,absolute— к ближайшему позиционированному предку.