CSS ONLY Animate Draw Circle with border-radius and transparent background

前端 未结 1 1155
别跟我提以往
别跟我提以往 2020-11-28 09:41

I am trying to draw a circle with border-radius, and animate it. I can do this, but what i can\'t do is overlay elements and set the circles background to transparent, witho

相关标签:
1条回答
  • 2020-11-28 09:51

    This is my solution.

    I set a background on body to show it is transparent

    body {
      background: repeating-linear-gradient(45deg, white 0px, lightblue 100px);
      height: 500px;
      background-size: 500px 500px;
      background-repeat: no-repeat;
    }
    
    html {
      height: 100%;
    }
    
    #container {
      position: absolute;
      width: 400px;
      height: 400px;
       border: solid red 1px;
       animation: colors 4s infinite;
    }
    
    #halfclip {
      width: 50%;
      height: 100%;
      right: 0px;
      position: absolute;
       overflow: hidden;
       transform-origin: left center;
       animation: cliprotate 16s steps(2) infinite;
       -webkit-animation: cliprotate 16s steps(2) infinite;
    }
    
    .halfcircle {
      box-sizing: border-box;
      height: 100%;
      right: 0px;
      position: absolute;
      border: solid 25px transparent;
       border-top-color: blue;
       border-left-color: blue;
       border-radius: 50%;
    }
    #clipped {
      width: 200%;
       animation: rotate 8s linear infinite;
       -webkit-animation: rotate 8s linear infinite;
    }
    #fixed {
      width: 100%;
        transform: rotate(135deg);  
       animation: showfixed 16s steps(2) infinite;
       -webkit-animation: showfixed 16s linear infinite;
    }
    
    @-webkit-keyframes cliprotate {
      0% {transform: rotate(0deg);}
      100% {transform: rotate(360deg);}
    }
    
    @keyframes cliprotate {
      0% {transform: rotate(0deg);}
      100% {transform: rotate(360deg);}
    }
    
    
    @-webkit-keyframes rotate {
      0% {transform: rotate(-45deg);}
      100% {transform: rotate(135deg);}
    }
    
    @keyframes rotate {
      0% {transform: rotate(-45deg);}
      100% {transform: rotate(135deg);}
    }
    
    @-webkit-keyframes showfixed {
      0% {opacity: 0;}
      49.9% {opacity: 0;}
      50% {opacity: 1;}
     100% {opacity: 1;}
    }
    <div id="container">
        <div id="halfclip">
            <div class="halfcircle" id="clipped">
            </div>
        </div>
        <div class="halfcircle" id="fixed">
        </div>
    </div>

    And this is a variation on the solution, to make it run only once on hover

    body {
      background: repeating-linear-gradient(45deg, white 0px, lightblue 100px);
      height: 500px;
      background-size: 500px 500px;
      background-repeat: no-repeat;
    }
    
    html {
      height: 100%;
    }
    
    #container {
      position: absolute;
      width: 300px;
      height: 300px;
       border: solid red 1px;
    }
    
    #halfclip {
        width: 50%;
        height: 100%;
        right: 0px;
        position: absolute;
        overflow: hidden;
        transform-origin: left center;
    }
    
    #container:hover #halfclip {
        animation: cliprotate 6s 1;
        transform: rotate(180deg);
    } 
    
    @keyframes cliprotate {
      0% {transform: rotate(0deg);}
      50% {transform: rotate(0deg);}
      50.01% {transform: rotate(180deg);}
      100% {transform: rotate(180deg);}
    }
    
    .halfcircle {
      box-sizing: border-box;
      height: 100%;
      right: 0px;
      position: absolute;
      border: solid 25px transparent;
       border-top-color: blue;
       border-left-color: blue;
       border-radius: 50%;
    }
    
    #clipped {
        width: 200%;
        transform: rotate(-45deg);
    }
    #container:hover #clipped {
        transform: rotate(135deg);
        animation: rotate 3s linear 2;
    }
    
    
    @keyframes rotate {
      0% {transform: rotate(-45deg);}
      100% {transform: rotate(135deg);}
    }
    
    
    #fixed {
      width: 100%;
        transform: rotate(135deg);  
        opacity: 0;
    }
    
    #container:hover #fixed {
        opacity: 1;
        animation: showfixed 6s 1;
    }
    
    
    
    @keyframes showfixed {
      0% {opacity: 0;}
      49.99% {opacity: 0;}
      50% {opacity: 1;}
     100% {opacity: 1;}
    }
    <div id="container">
        <div id="halfclip">
            <div class="halfcircle" id="clipped">
            </div>
        </div>
        <div class="halfcircle" id="fixed">
        </div>
    </div>

    0 讨论(0)
提交回复
热议问题