Search code examples
htmlcsscss-shapes

z-index in half of shape


I want to make shape as below:

enter image description here

I tried so far but how can I hybrid those together:

.clal-loader{
  display:flex;
}
.clal-loader div{
  border: 10px solid #38477e;
  border-left: 0;
  border-bottom-right-radius: 100px;
  border-top-right-radius: 100px;
  width: 30px;
  height: 30px;
}
.clal-loader div:nth-child(1){
   border-color:#0cabec;
}

.clal-loader div:nth-child(2){
 transform: rotate(-180deg);
     position: absolute;
    left: 25px;
    z-index: -1;
}
<div class="clal-loader">
  <div></div>
  <div></div>
</div>


Solution

  • I would consider radial-gradient and only one element like below. Basically they are 4 similar gradient each one creating a quarter circle and you adjust the order to have the final shape:

    .box {
      width:100px;
      height:150px;
      background:
        radial-gradient(circle at bottom left, transparent 40%,blue  40%, blue  60%,transparent 61%) top,  
        radial-gradient(circle at bottom right,transparent 40%,green 40%, green 60%,transparent 61%) top,
        radial-gradient(circle at top right,   transparent 40%,green 40%, green 60%,transparent 61%) bottom,
        radial-gradient(circle at top left,    transparent 40%,blue  40%, blue  60%,transparent 61%) bottom;
        
      background-size:100% 50%;
      background-repeat:no-repeat;
      
    }
    <div class="box">
    
    </div>

    With two elements you can consider both pseudo element of each div to create the same think as the first code then all you have to do is to adjust z-index.

    .box {
      width:100px;
      height:100px;
      position:relative;
    }
    .box > div {
      position:absolute;
      top:0;
      left:0;
      right:0;
      bottom:0;
    }
    .box > div:before,
    .box > div:after {
      content:"";
      position:absolute;
      width:70%;
      height:50%;
    }
    
    .box > div:first-child {
      color:red;
    }
    
    .box > div:last-child {
      color:blue;
    }
    
    .box > div:first-child::before {
      z-index:1;
      top:0;
      left:0;
      border-top:15px solid;
      border-right:15px solid;
      border-top-right-radius:100%;
    }
    .box > div:first-child::after {
      bottom:0;
      left:0;
      border-bottom:15px solid;
      border-right:15px solid;
      border-bottom-right-radius:100%;
    }
    .box > div:last-child::before {
      top:0;
      right:0;
      border-top:15px solid;
      border-left:15px solid;
      border-top-left-radius:100%;
    }
    .box > div:last-child::after {
      bottom:0;
      right:0;
      border-bottom:15px solid;
      border-left:15px solid;
      border-bottom-left-radius:100%;
    }
    
    *,*::before,*::after {
      box-sizing:border-box;
    }
    <div class="box">
      <div></div>
      <div></div>
    </div>