According to flexbox specification:
..4.3. Flex Item Z-Ordering ,... and
z-indexvalues other thanautocreate a stacking
Like you wrote in your question, elements do not need to be positioned for z-index to work in a flex container.
Flex items can participate in a z-index stacking order even with position: static, which is not true for other CSS box models (except Grid) where z-index only works on positioned elements.
4.3. Flex Item Z-Ordering
Flex items paint exactly the same as inline blocks, except that
order-modified document order is used in place of raw document order, andz-indexvalues other thanautocreate a stacking context even ifpositionisstatic.
The reason z-index isn't working in your code is that div.header and div.core are not flex items. They are children of body, but body is not a flex container.
In order for z-index to work here, you'll need to apply display: flex to body.
Add this to your code:
body {
display: flex;
flex-direction: column;
}
Revised Demo
More details: https://stackoverflow.com/a/35772825/3597276