Code前端首页关于Code前端联系我们

CSS3动画实践:太极动画和伪类构建加载图

terry 2年前 (2023-09-27) 阅读数 67 #数据结构与算法

使用CSS3动画和伪类构建、分析和设置执行顺序和关键帧时间段。

效果

CSS3动画实战:animation和伪类构建太极Loading图

动画分析

首先通过效果来分析动画的执行情况:

  1. 边框的四个边依次进行动画处理。
  2. 矩形边框变成圆形边框。
  3. 太极图的内部格局逐渐显现。
  4. 太极图形旋转。
  5. 所有动画均按相反顺序执行。

你只要想好上面1的效果,剩下的就很容易实现了。对于5种效果,只需设置属性动画方向:alternate,并在整体动画中添加animation-iteration-count:infinite即可保证无限循环。

静态效果实现

首先创建一个静态效果。

html结构:

<div id="loader">
  <div class="logo">
    <div class="left"></div>
    <div class="right"></div>
  </div> 
  <p>Loading...</p>
</div>

CSS(LESS)部分:

@border-width:2px;
@loader-width:150px;
@loader-insider-width:@loader-width * 0.15;
@animate-time:4s;

*{
  margin: 0;
  padding: 0;
  border: 0;
}

html, body{
  width: 100%;
  height: 100%;
}

#loader{
  position: absolute;
  top: 0;
  left: 0;
  bottom: 0;
  right: 0;
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;

  p {
    padding: 1.5em;
    font-family: Arial;
  }

  .logo{
    width: @loader-width;
    height: @loader-width;
    position: relative;

    &:before{
      position: absolute;
      content: '';
      left: 0;
      top: 0;
      border-color: transparent;
      border-width: @border-width;
      border-style: solid;
      border-top-color: #000;
      border-right-color: #000;
      width: 100%;
      height: 100%;
    }

    &:after{
      position: absolute;
      content: '';
      bottom: -2 * @border-width;
      right: -2 * @border-width;
      border-color: transparent;
      border-width: @border-width;
      border-style: solid;
      border-bottom-color: #000;
      border-left-color: #000;
      width: 100%;
      height: 100%;
    }

    .left{
      position: absolute;
      width: 50%;
      height: 100%;
      top: @border-width;
      right: 50%;
      background-color: #000;
      border-top-left-radius: 100% 50%;
      border-bottom-left-radius: 100% 50%;

      &:before{
        position: absolute;
        content: '';
        width: 100%;
        height: 50%;
        bottom: 0;
        left: 50%;
        border-radius: 50%;
        background-color: #000;
      }

      &:after{
        position: absolute;
        content: '';
        width: @loader-insider-width;
        height: @loader-insider-width;
        background-color: #fff;
        bottom: ~'calc(25% - @{loader-insider-width} / 2)';
        left: ~'calc(100% - @{loader-insider-width} / 2)';
        border-radius: 50%;
      }      
    }

    .right{
      position: absolute;
      width: 50%;
      height: 100%;
      top: @border-width;
      left: 50%;
      border-top-right-radius: 100% 50%;
      border-bottom-right-radius: 100% 50%;

      &:before{
        position: absolute;
        content: '';
        width: 100%;
        height: 50%;
        top: 0;
        right: 50%;
        border-radius: 50%;
        background-color: #fff;
      }

      &:after{
        position: absolute;
        content: '';
        width: @loader-insider-width;
        height: @loader-insider-width;
        background-color: #000;
        top: ~'calc(25% - @{loader-insider-width} / 2)';
        right: ~'calc(100% - @{loader-insider-width} / 2)';
        border-radius: 50%;
      }    
    }  
  }  
}

效果:

CSS3动画实战:animation和伪类构建太极Loading图

动画的实现

上面已经实现了静态效果,现在已经把动画部分提取出来了。

动画按钮帧时间段

根据效果,进行如下时间段划分:

CSS3动画实战:animation和伪类构建太极Loading图

边框效果的实现

设置两个伪类›的宽度和高度。 改为0,然后添加动画效果:

.logo{
    width: @loader-width;
    height: @loader-width;
    position: relative;
    animation: spin @animate-time infinite;
    animation-direction: alternate;
    animation-timing-function:ease;

    &:before{
      position: absolute;
      content: '';
      left: 0;
      top: 0;
      border-color: transparent;
      border-width: @border-width;
      border-style: solid;
      animation: line-before @animate-time infinite;
      animation-direction: alternate;
    }

    &:after{
      position: absolute;
      content: '';
      bottom: -2 * @border-width;
      right: -2 * @border-width;
      border-color: transparent;
      border-width: @border-width;
      border-style: solid;
      animation: line-after @animate-time infinite;
      animation-direction: alternate;
    }
}

keyframes:

@keyframes line-before {
  0% {
    width: 0;
    height: 0;
    border-top-color: #000;
  }

  9.9% {
    border-right-color: transparent;
  }

  10% {
    width: 100%;
    border-right-color: #000;
    border-top-color: #000;
    height: 0;
  }

  20%,100% {
    width: 100%;
    border-right-color: #000;
    border-top-color: #000;
    height: 100%;
  }

  40% {
    width: 100%;
    border-right-color: #000;
    border-top-color: #000;
    height: 100%;
    border-radius: 0;
  }

  //在执行到50%的时候变圆
  50%, 100% {
    width: 100%;
    border-right-color: #000;
    border-top-color: #000;
    height: 100%;
    border-radius: 50%;
  }
}

@keyframes line-after {
  0%,19.9% {
    border-color: transparent;
    width: 0;
    height: 0;
  }
  20% {
    width: 0;
    height: 0;
    border-bottom-color: #000;
  }

  29.9% {
    border-left-color: transparent;
  }

  30% {
    width: 100%;
    border-left-color: #000;
    border-bottom-color: #000;
    height: 0;
  }

  40% {
    width: 100%;
    border-left-color: #000;
    border-bottom-color: #000;
    height: 100%;
    border-radius: 0;
  }

  //在执行到50%的时候变圆
  50%, 100% {
    border-radius: 50%;
    width: 100%;
    border-left-color: #000;
    border-bottom-color: #000;
    height: 100%;
  }
}

内部图案显示效果

只需调整透明度:

@keyframes left-right-fade {
  0%, 50%{
    opacity: 0;
  }

  75%, 100% {
    opacity: 1;
  }
}

旋转效果

@keyframes spin {
  0%, 75%{
    transform:rotate(0deg);
  }

  90%, 100% {
    transform:rotate(360deg);
  }
}

所有样式代码
@keyframes spin {
  0%, 75%{
    transform:rotate(0deg);
  }

  90%, 100% {
    transform:rotate(360deg);
  }
}

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门