В CSS 2.1 z-index
применяется только к расположенным элементам и указывает две разные вещи:
- Уровень стека поля в текущем контексте стекирования.
- Определяет ли контейнер контекст стекирования.
Но Flexbox говорит следующее:
Элементы Flex отображаются точно так же, как встроенные блоки [CSS21 ], за исключением того, что
order
-модифицированный заказ документа используется вместо необработанный порядок документа иz-index
значения, отличные отauto
, создать stacking context, даже еслиposition
static
.
Затем, в отличие от CSS2.1, установка z-index
некоторого целого числа на некорректном элементе flex создает контекст стекирования.
Однако я не вижу нигде, где должен быть уровень стека этого контекста стекирования.
Аналогичным случаем является opacity
, который также может создавать установочные контексты стеков для непозиционированных элементов. Но в этом случае уровень стека правильно задан как 0:
Если элемент с непрозрачностью менее 1 не расположен, реализации должны рисовать слой, который он создает, внутри своего родителя контекст стекирования, с тем же порядком укладки, который будет использоваться, если он были позиционированным элементом с
z-index: 0
иopacity: 1
.
По-моему, эти варианты разумны:
- Уровень стека - это значение, указанное в
z-index
- Уровень стека равен 0
- Элемент flex обертывает своих потомков в контексте стекирования, так что они раскрашиваются вместе, но сам элемент flex покрашен как обычный элемент, не находящийся в потоке (как если бы он не устанавливал контекст стекирования).
Согласно следующему тесту, Firefox и Chrome делают первый вариант.
.container {
display: flex;
padding-left: 20px;
}
.item {
padding: 20px;
background: #ffa;
align-self: flex-start;
margin-left: -20px;
}
.item:nth-child(even) {
background: #aff;
margin-top: 40px;
}
.za::after{ content: 'z-index: auto'; }
.z0 { z-index: 0; } .z0::after{ content: 'z-index: 0'; }
.z1 { z-index: 1; } .z1::after{ content: 'z-index: 1'; }
.z-1 { z-index: -1; } .z-1::after{ content: 'z-index: -1'; }
<div class="container">
<div class="item z1"></div>
<div class="item z0"></div>
<div class="item za"></div>
<div class="item za"></div>
<div class="item z-1"></div>
</div>