【问题标题】:how to reverse this circle animation?如何反转这个圆圈动画?
【发布时间】:2018-10-23 15:35:49
【问题描述】:

我在网上找到了这段代码 sn-p,我正在尝试反转它,以便圆圈从 0% 的全白渐变到 100% 渐变圆圈,然后停止动画。但是我似乎无法弄清楚倒车部分。我试过摆弄这些值,但似乎无法获得预期的效果。一旦渐变部分未显示,摆脱仍然存在的小轮廓也很好。干杯

#circle-loader-wrap {
  overflow: hidden;
  position: relative;
  margin-top: -10px;
  width: 200px;
  height: 200px;

  background: linear-gradient(90deg, #fdbd39,#ee6723,#E06387);
  border-radius: 200px;

  -ms-transform: rotate(180deg);
  -webkit-transform: rotate(180deg);
  -moz-transform: rotate(180deg);
  transform: rotate(180deg);
}

#circle-loader-wrap:after {
  content: '';
  position: absolute;
  left: 15px;
  top: 15px;
  width: 170px;
  height: 170px;
  border-radius: 50%;
  background-color: white;

}

#circle-loader-wrap div {
  overflow: hidden;
  position: absolute;
  width: 50%;
  height: 100%;
}

#circle-loader-wrap .loader {
  position: absolute;
  left: 100%;
  top: 0;
  width: 100%;
  height: 100%;
  border-radius: 1000px;
  background-color: white;
}

#circle-loader-wrap .left-wrap {
  left: 0;
}

#circle-loader-wrap .left-wrap .loader {
  border-top-left-radius: 0;
  border-bottom-left-radius: 0;
  transform-origin: 0 50% 0;
  -webkit-transform-origin: 0 50% 0;
  animation: loading-left 10s infinite linear;
  -webkit-animation: loading-left 10s infinite linear;
}

#circle-loader-wrap .right-wrap {
  left: 50%;
}

#circle-loader-wrap .right-wrap .loader {
  left: -100%;
  border-bottom-right-radius: 0;
  border-top-right-radius: 0;
  transform-origin: 100% 50% 0;
  -webkit-transform-origin: 100% 50% 0;
  animation: loading-right 10s infinite linear;
  -webkit-animation: loading-right 10s infinite linear;
}

@keyframes loading-left {
  0% {
    -webkit-transform: rotate(0deg);
  }
  50% {
    -webkit-transform: rotate(0deg);
  }
  100% {
    -webkit-transform: rotate(180deg);
  }
}

@-webkit-keyframes loading-left {
  0% {
    -webkit-transform: rotate(0deg);
  }
  50% {
    -webkit-transform: rotate(0deg);
  }
  100% {
    -webkit-transform: rotate(180deg);
  }
}

@keyframes loading-right {
  0% {
    transform: rotate(0deg);
  }
  50% {
    transform: rotate(180deg);
  }
    100% {
    -webkit-transform: rotate(180deg);
  }

}

@-webkit-keyframes loading-right {
  0% {
    -webkit-transform: rotate(0deg);
  }
  50% {
    -webkit-transform: rotate(180deg);
  }
  100% {
    -webkit-transform: rotate(180deg);
  }

}
        <div class="container mt-5">
            <div class="row">
              <div class="col-3">
                <div id="circle-loader-wrap">
                  <div class="left-wrap">
                    <div class="loader"></div>
                  </div>
                  <div class="right-wrap">
                    <div class="loader"></div>
                  </div>
                </div>
              </div>
            </div>
          </div>

【问题讨论】:

    标签: css transform webkit-transform webkit-animation


    【解决方案1】:

    @keyframes 的 CSS 是这个加载动画的棘手部分。

    您可以使用开发工具检查.left-wrap&gt;.loader.right-wrap&gt;.loader 这两个元素。 一旦.loader 元素与其容器(.left-wrap.left-wrap)重叠,它就会隐藏渐变圆。

    这个动画的重点是这两个loader元素的关键帧旋转度

    以左半圆和下面的代码为例,在这种情况下,左半圆的可见性由.right-wrap.right-wrap&gt;.loader控制。 .right-wrap&gt;.loader 旋转 180 度时,不与其容器重叠,整个左半边可见。

    当我们减少旋转时,.right-wrap&gt;.loader 的重叠部分及其容器会增加,从而隐藏了一些圆圈。

    另外,为了控制旋转的时机(圆的哪个部分,左或右,先执行旋转),关键帧分为2部分,0%-50%(第一部分)和50% -100%(第二部分)。

    如果我们在0%50% 关键帧中将旋转设置为相同,则元素在动画的第一部分不会旋转。 从这个概念您还可以看出,如果50%100% 保持相同的旋转,则动画的第二部分没有呈现旋转。

    要控制顺时针或逆时针,重要的是要知道旋转开始的度数和旋转的度数。对于顺时针动画,旋转应该从 180 度开始,以 360 度结束,而对于逆时针动画,它应该从 180 度开始,以 0 度结束。

    #circle-loader-wrap {
      overflow: hidden;
      position: relative;
      margin-top: -10px;
      width: 200px;
      height: 200px;
    
      background: linear-gradient(90deg, #fdbd39,#ee6723,#E06387);
      border-radius: 200px;
    
      -ms-transform: rotate(180deg);
      -webkit-transform: rotate(180deg);
      -moz-transform: rotate(180deg);
      transform: rotate(180deg);
    }
    
    #circle-loader-wrap:after {
      content: '';
      position: absolute;
      left: 15px;
      top: 15px;
      width: 170px;
      height: 170px;
      border-radius: 50%;
      background-color: white;
    
    }
    
    #circle-loader-wrap div {
      overflow: hidden;
      position: absolute;
      width: 50%;
      height: 100%;
    }
    
    #circle-loader-wrap .loader {
      position: absolute;
      left: 100%;
      top: 0;
      width: 100%;
      height: 100%;
      border-radius: 1000px;
      background-color: white;
    }
    
    #circle-loader-wrap .left-wrap {
      left: 0;
    }
    
    #circle-loader-wrap .left-wrap .loader {
      border-top-left-radius: 0;
      border-bottom-left-radius: 0;
      transform-origin: 0 50% 0;
      -webkit-transform-origin: 0 50% 0;
      animation: loading-left 10s infinite linear;
      -webkit-animation: loading-left 10s infinite linear;
    }
    
    #circle-loader-wrap .right-wrap {
      left: 50%;
    }
    
    #circle-loader-wrap .right-wrap .loader {
      left: -100%;
      border-bottom-right-radius: 0;
      border-top-right-radius: 0;
      transform-origin: 100% 50% 0;
      -webkit-transform-origin: 100% 50% 0;
      animation: loading-right 10s infinite linear;
      -webkit-animation: loading-right 10s infinite linear;
    }
    
    @keyframes loading-left {
      0% {
        -webkit-transform: rotate(180deg);
      }
      50% {
        -webkit-transform: rotate(180deg);
      }
      100% {
        -webkit-transform: rotate(360deg);
      }
    }
    
    @-webkit-keyframes loading-left {
      0% {
        -webkit-transform: rotate(180deg);
      }
      50% {
        -webkit-transform: rotate(180deg);
      }
      100% {
        -webkit-transform: rotate(360deg);
      }
    }
    
    @keyframes loading-right {
      0% {
        transform: rotate(180deg);
      }
      50% {
        transform: rotate(360deg);
      }
        100% {
        -webkit-transform: rotate(360deg);
      }
    
    }
    
    @-webkit-keyframes loading-right {
      0% {
        -webkit-transform: rotate(180deg);
      }
      50% {
        -webkit-transform: rotate(360deg);
      }
      100% {
        -webkit-transform: rotate(360deg);
      }
    
    }
            <div class="container mt-5">
                <div class="row">
                  <div class="col-3">
                    <div id="circle-loader-wrap">
                      <div class="left-wrap">
                        <div class="loader"></div>
                      </div>
                      <div class="right-wrap">
                        <div class="loader"></div>
                      </div>
                    </div>
                  </div>
                </div>
              </div>

    【讨论】:

    • 非常感谢图表和解释!
    【解决方案2】:

    一种方法是调整动画中transform: rotate()的参数:

    #circle-loader-wrap {
      overflow: hidden;
      position: relative;
      margin-top: -10px;
      width: 200px;
      height: 200px;
      background: linear-gradient(90deg, #fdbd39, #ee6723, #E06387);
      border-radius: 200px;
      -ms-transform: rotate(180deg);
      -webkit-transform: rotate(180deg);
      -moz-transform: rotate(180deg);
      transform: rotate(180deg);
    }
    
    #circle-loader-wrap:after {
      content: '';
      position: absolute;
      left: 15px;
      top: 15px;
      width: 170px;
      height: 170px;
      border-radius: 50%;
      background-color: white;
    }
    
    #circle-loader-wrap div {
      overflow: hidden;
      position: absolute;
      width: 50%;
      height: 100%;
    }
    
    #circle-loader-wrap .loader {
      position: absolute;
      left: 100%;
      top: 0;
      width: 100%;
      height: 100%;
      border-radius: 1000px;
      background-color: white;
    }
    
    #circle-loader-wrap .left-wrap {
      left: 0;
    }
    
    #circle-loader-wrap .left-wrap .loader {
      border-top-left-radius: 0;
      border-bottom-left-radius: 0;
      transform-origin: 0 50% 0;
      -webkit-transform-origin: 0 50% 0;
      animation: loading-left 10s infinite linear;
      -webkit-animation: loading-left 10s infinite linear;
    }
    
    #circle-loader-wrap .right-wrap {
      left: 50%;
    }
    
    #circle-loader-wrap .right-wrap .loader {
      left: -100%;
      border-bottom-right-radius: 0;
      border-top-right-radius: 0;
      transform-origin: 100% 50% 0;
      -webkit-transform-origin: 100% 50% 0;
      animation: loading-right 10s infinite linear;
      -webkit-animation: loading-right 10s infinite linear;
    }
    
    @keyframes loading-left {
      0% {
        -webkit-transform: rotate(-180deg);
      }
      50% {
        -webkit-transform: rotate(0deg);
      }
      100% {
        -webkit-transform: rotate(0deg);
      }
    }
    
    @-webkit-keyframes loading-left {
      0% {
        -webkit-transform: rotate(-180deg);
      }
      50% {
        -webkit-transform: rotate(0deg);
      }
      100% {
        -webkit-transform: rotate(0deg);
      }
    }
    
    @keyframes loading-right {
      0% {
        transform: rotate(-180deg);
      }
      50% {
        transform: rotate(-180deg);
      }
      100% {
        -webkit-transform: rotate(0deg);
      }
    }
    
    @-webkit-keyframes loading-right {
      0% {
        -webkit-transform: rotate(-180deg);
      }
      50% {
        -webkit-transform: rotate(-180deg);
      }
      100% {
        -webkit-transform: rotate(0deg);
      }
    }
    <div class="container mt-5">
      <div class="row">
        <div class="col-3">
          <div id="circle-loader-wrap">
            <div class="left-wrap">
              <div class="loader"></div>
            </div>
            <div class="right-wrap">
              <div class="loader"></div>
            </div>
          </div>
        </div>
      </div>
    </div>

    【讨论】:

      【解决方案3】:

      CSS Animation 属性将帮助您反向旋转相同的动画。

      //dont care about this code, its just to get the length of shapes to set the dash offset
      let shape = document.querySelector('.circle');
      let shapeLength= shape.getTotalLength();
      console.log(shapeLength);
      #circle { 
         width: 300px;
         height:300px;
         background: #fcfcfc;
      }
      .text{
         fill: red;
         text-anchor: middle;
      }
      #circle{
         animation: circleMove 5s ease-out infinite both alternate;
      }
      .circle{
         fill: none;
         stroke: red;
         stroke-width: 5px;
         stroke-dasharray:251;
         animation: circleMove 5s ease-in 1  alternate;
      }
      @keyframes circleMove{
         from{
            stroke-dashoffset: 251;
         }
         to{
            stroke-dashoffset: 0;
         }
      }
      <!-- Learn about this code on MDN: https://developer.mozilla.org/en-US/docs/Web/SVG/Element/circle -->
      
      <div id="circle">
         <svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
            <circle class='circle' cx="50" cy="50" r="40"/>
            <text class='text' x="50" y="50" font-family="Verdana" font-size="11" ></text>
         </svg>
      </div>

      【讨论】:

      • 干杯!欣赏它!
      猜你喜欢
      • 2012-11-12
      • 2016-05-04
      • 2021-03-17
      • 1970-01-01
      • 1970-01-01
      • 2021-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多