Свойство z-index как правило применяется только исключительно к позиционированным элементам (relative, absolute, fixed и т. д.) https://jsfiddle.net/8e1hxkmy/ Вот есть элемент Р и Н1, Р находится под Н1 потому что у Н1 задан приоритет слоя z-index:2; Далее у Р есть вложенный элемент EM у которого z-index ещё больше чем у H1, но так как ЕМ не позиционированный он не должен налаживаться на Н1 но, если его контейнеру Р присвоить display:flex; так ЕМ сразу начинает налаживаться на H1. Почему такое поведение?
p{
margin-bottom: -30px;
position: relative;
color: red;
display: flex;
background: blue;
}
h1{
position: relative;
z-index: 2;
background: green;
}
p em{
background: red;
z-index: 3;
}
<p>13231<em>666</em></p>
<h1>Aaaaa</h1>
Это поведение согласно спецификации w3.org.
Элементы контейнера Flex отрисовываются как inline элементы, за исключением возможности применять z-index даже если position: static
4.3. Flex Item Z-Ordering
Flex items paint exactly the same as inline blocks [CSS21], except that order-modified document order is used in place of raw document order, and z-index values other than auto create a stacking context even if position is static.
z-index применяется не только для позиции, а ко всем гибким элементам. Гибкими элементы делает position: absolite, fixed, static... и так же гибким их делает display: flex. Приоритетными его блоки становятся потому, что p стоит перед h1
p{
margin-bottom: -30px;
position: relative;
color: red;
display: flex;
background: blue;
z-index: 1;
}
h1{
position: relative;
z-index: 2;
background: green;
}
p em{
background: red;
z-index: 3;
}
<p>13231<em>666</em></p>
<h1>Aaaaa</h1>
Сборка персонального компьютера от Artline: умный выбор для современных пользователей