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;
}
 
    