I wish that in CSS the before will render before the container, and the after will render after. something like
before : z-index = 0, container: z-index = 1, and after: z-index = 2
but the order is before : z-index = 1, container: z-index = 0, and after: z-index = 2
HTML:
<div id=theDiv>DIV</div>
CSS:
#theDiv{
position:relative;
width:100px; height:100px;
background-color:red;
margin:50px;
}
#theDiv:before{
content:"Before";
position:absolute; top:-30px; left:-30px;
width:90px; height:90px;
background-color:blue;
}
#theDiv:after{
content:"After";
position:absolute; top:30px; left:30px;
width:90px; height:90px;
background-color:yellow;
}
https://jsfiddle.net/shprung/892y1gzc/
My usual solution is to force on the before a z-index of -1 which fill like a hack.
The specs don't mentioned the stacking order by indirectly suggests what I was hoping for :
...As their names indicate, the :before and :after pseudo-elements specify the location of content before and after an element's document tree content...
Any better solution than forcing the z-index:-1 ?
Other similar question want to assume that all you need is to setup new stacking content, but this is not the case. for example, if you give each a z-index like the code below it still not behave correctly. so the z-index:-1 for the before is some unique case and this is why I am puzzled.
#theDiv{
z-index:50;
position:relative;
width:100px; height:100px;
background-color:red;
margin:50px;
}
#theDiv:before{
z-index:1;
content:"Before";
position:absolute; top:-30px; left:-30px;
width:90px; height:90px;
background-color:blue;
}
#theDiv:after{
z-index:100;
content:"After";
position:absolute; top:30px; left:30px;
width:90px; height:90px;
background-color:yellow;
}