Search code examples
cssz-indexpseudo-element

Is it possible to set the stacking order of pseudo-elements below their parent element?


I am trying to style a element with the :after pseudo element CSS selector

#element {
    position: relative;
    z-index: 1;
}

#element::after {
    position:relative;
    z-index: 0;
    content: " ";
    position: absolute;
    width: 100px;
    height: 100px;
}

It seems like the ::after element can not be lower then the element itself.

Is there a way to have the pseudo element lower then the element itself?


Solution

  • Pseudo-elements are treated as descendants of their associated element. To position a pseudo-element below its parent, you have to create a new stacking context to change the default stacking order.
    Positioning the pseudo-element (absolute) and assigning a z-index value other than “auto” creates the new stacking context.

    #element { 
        position: relative;  /* optional */
        width: 100px;
        height: 100px;
        background-color: blue;
    }
    
    #element::after {
        content: "";
        width: 150px;
        height: 150px;
        background-color: red;
    
        /* create a new stacking context */
        position: absolute;
        z-index: -1;  /* to be below the parent element */
    }
    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="utf-8">
      <title>Position a pseudo-element below its parent</title>
    </head>
    <body>
      <div id="element">
      </div>
    </body>
    </html>