z-index
не игнорируется для flex-элементов (непосредственные потомки flex-container, элемент с display: flex
или display: inline-flex
) или grid-элементов (непосредственные потомки grid-контейнера, элемент с display: grid
или display: inline-grid
).
Спецификация цитата
Из Характеристики W3C Flexbox :
Элементы Flex рисуют точно так же, как и встроенные блоки CSS21 , за исключением того, что вместо порядка необработанных документов используется модифицированный order
порядок документов, и z-index
значения, отличные от auto
, создают контекст стека, даже если position
равно static
.
Из Спецификации макета сетки W3C CSS :
Элементы сетки могут перекрываться, когда они расположены в пересекающихся областях сетки , или даже при размещении в непересекающихся областях из-за отрицательных полей или позиционирования. Порядок рисования элементов сетки точно такой же, как у встроенных блоков CSS21 , за исключением того, что порядок документов с измененным порядком используется вместо порядка необработанных документов, и z-index
значения, отличные от auto
, создают контекст стека, даже если position
равно static
(ведет себя точно так же, как если position
были relative
). Таким образом, свойство z-index
можно легко использовать для управления порядком оси Z элементов сетки.
Пример Flexbox
Итак, предположим, что у нас есть этот макет с наложением (.flex-item-two
наложение .flex-item-one
с использованием, например, отрицательных полей):
.flex {
display: flex;
align-items: center;
}
.flex-item-one {
width: 100px;
height: 100px;
background-color: red;
margin-right: -50px;
}
.flex-item-two {
width: 200px;
height: 200px;
background-color: green;
}
<div class="flex">
<div class="flex-item flex-item-one">One</div>
<div class="flex-item flex-item-two">Two</div>
</div>
Если индекс flex-item-one
больше .flex-item-two
, .flex-item-one
, то перекрывается .flex-item-two
.
.flex {
display: flex;
align-items: center;
}
.flex-item-one {
width: 100px;
height: 100px;
background-color: red;
margin-right: -50px;
z-index: 1;
}
.flex-item-two {
width: 200px;
height: 200px;
background-color: green;
}
<div class="flex">
<div class="flex-item flex-item-one">One</div>
<div class="flex-item flex-item-two">Two</div>
</div>
Пример CSS Grid
#grid {
display: inline-grid;
width: 250px;
grid-template-columns: 1fr 1fr;
grid-template-rows: 1fr 1fr
}
#A {
grid-column: 1 / span 2;
grid-row: 2;
align-self: end;
background-color: #4f81bd;
}
#B {
grid-column: 1;
grid-row: 1;
z-index: 10;
background-color: #8064a2;
}
#C {
grid-column: 2;
grid-row: 1;
align-self: start;
margin-left: -20px;
background-color: #f79646;
}
#D {
grid-column: 2;
grid-row: 2;
justify-self: end;
align-self: start;
background-color: #9bbb59;
}
#E {
grid-column: 1 / span 2;
grid-row: 1 / span 2;
z-index: 5;
justify-self: center;
align-self: center;
background-color: #c0504d;
}
#grid > * {
color: #fff;
display: flex;
align-items: center;
justify-content: center;
padding: 20px 40px;
font-size: 32px;
}
#C, #D {
padding: 10px 20px;
}
<div id="grid">
<div id="A">A</div>
<div id="B">B</div>
<div id="C">C</div>
<div id="D">D</div>
<div id="E">E</div>
</div>