html - CSS 动画 : squares loader

标签 html css css-animations

我需要做一个加载器。
这个装载机由三个方 block 组成,它们像掉在地上的重箱子一样滚动。

主要部分已经完成,但这个动画有点棘手:当动画开始时,正方形必须一起缩放,停止然后滚动,最后,正方形需要缩小以同时完全消失。

CodePen 在这里:http://codepen.io/jadw/pen/yVrPJz .
这里的代码:

          .loader {
              height: 20vw;
              width: 20vw;
              position: absolute;
              top: 0;
              bottom: 0;
              left: 0;
              right: 0;
              margin: auto;
            }

            .loader::after {
              content: "";
              position: absolute;
              z-index: -1;
              top: 22%;
              bottom: 0;
              left: 0;
              right: 0;
              border-top: 2px dotted #ff0000;
              margin-top: -7%;
            }

            .square {
              position: absolute;
              top: 0;
              left: 0;
              display: block;
              bottom: 0.15vw;
              width: 0.15vw;
              height: 0.15vw;
              background-color: transparent;
            }

            .square:nth-child(1) {
              transform: scale(0.01, 0.01);
              border: 0.35vw solid #000000;
              animation-name: spin-scale-cube1;
              animation-duration: 3s;
              animation-delay: 0s;
              animation-timing-function: steps(6, 6);
              animation-iteration-count: infinite;
              z-index: 1;
            }

            .square:nth-child(2) {
              border: 0.35vw solid #DCDA15;
              animation-name: spin-scale-cube1;
              animation-duration: 3s;
              animation-delay: 0.08s;
              animation-timing-function: steps(6, 6);
              animation-iteration-count: infinite;
              z-index: -1;
            }

            .square:nth-child(3) {
              border: 0.35vw solid #00A2DE;
              animation-name: spin-scale-cube1;
              animation-duration: 3s;
              animation-delay: 0.18s;
              animation-timing-function: steps(5, 5);
              animation-iteration-count: infinite;
              z-index: 0;
            }

            .loader-text {
              color: #000000;
              text-align: center;
              font-family: "Arial", sans-serif;
              font-size: 3vw;
              margin-top: 27%;
            }

            .loader-text span {
              margin: 0;
              padding: 0;
              width: 0.3vw;
              display: inline-block;
              visibility: hidden;
            }

            .loader-text span:nth-child(1) {
              animation-name: blink-dot1;
              animation-duration: 3s;
              animation-delay: 0s;
              animation-timing-function: steps(4);
              animation-iteration-count: infinite;
            }

            .loader-text span:nth-child(2) {
              animation-name: blink-dot2;
              animation-duration: 3s;
              animation-delay: 0.1s;
              animation-timing-function: steps(4);
              animation-iteration-count: infinite;
            }

            .loader-text span:nth-child(3) {
              animation-name: blink-dot3;
              animation-duration: 3s;
              animation-delay: 0s;
              animation-timing-function: steps(4);
              animation-iteration-count: infinite;
            }

            .ground {
              border-bottom: 2px solid #ff0000;
            }

            @keyframes spin-scale-cube1 {
              0% {
                width: 0vw;
                height: 0vw;
                transform: translate(0vw, 0) rotate(0deg);
                transform-origin: bottom right;
              }
              1% {
                bottom: 1vw;
                width: 1vw;
                height: 1vw;
                transform-origin: bottom right;
                transform: translate(0vw, 0) rotate(0deg);
              }
              2% {
                bottom: 1.5vw;
                width: 1.5vw;
                height: 1.5vw;
                transform-origin: bottom right;
                transform: translate(0vw, 0) rotate(0deg);
              }
              3% {
                bottom: 2vw;
                width: 2vw;
                height: 2vw;
                transform-origin: bottom right;
                transform: translate(0vw, 0) rotate(0deg);
              }
              4%,
              10% {
                bottom: 2.5vw;
                width: 2.5vw;
                height: 2.5vw;
                transform-origin: bottom right;
                transform: translate(0vw, 0) rotate(0deg);
              }
              20% {
                bottom: 2.5vw;
                width: 2.5vw;
                height: 2.5vw;
                transform-origin: bottom right;
                transform: translate(0vw, 0) rotate(90deg);
              }
              20.01% {
                transform: translate(3.2vw, 0) rotate(0deg);
              }
              40% {
                bottom: 2.5vw;
                width: 2.5vw;
                height: 2.5vw;
                transform-origin: bottom right;
                transform: translate(3.2vw, 0) rotate(90deg);
              }
              40.01% {
                transform: translate(6.4vw, 0) rotate(0deg);
              }
              60% {
                bottom: 2.5vw;
                width: 2.5vw;
                height: 2.5vw;
                transform-origin: bottom right;
                transform: translate(6.4vw, 0) rotate(90deg);
              }
              60.01% {
                transform: translate(9.6vw, 0) rotate(0deg);
              }
              80% {
                bottom: 2.5vw;
                width: 2.5vw;
                height: 2.5vw;
                transform-origin: bottom right;
                transform: translate(9.6vw, 0) rotate(90deg);
              }
              80.01% {
                transform: translate(12.8vw, 0) rotate(0deg);
              }
              90% {
                bottom: 2.5vw;
                width: 2.5vw;
                height: 2.5vw;
                transform-origin: bottom right;
                transform: translate(12.8vw, 0) rotate(0deg);
              }
              90.01% {
                bottom: 2.5vw;
                width: 2.5vw;
                height: 2.5vw;
                transform-origin: bottom right;
                transform: translate(16vw, 0) rotate(0deg);
              }
              91% {
                bottom: 1.5vw;
                width: 1.5vw;
                height: 1.5vw;
                transform-origin: bottom right;
                transform: translate(16vw, 0) rotate(0deg);
              }
              93% {
                bottom: 1vw;
                width: 1vw;
                height: 1vw;
                transform-origin: bottom right;
                transform: translate(16vw, 0) rotate(0deg);
              }
              95% {
                bottom: 0.5vw;
                width: 0.5vw;
                height: 0.5vw;
                transform-origin: bottom right;
                transform: translate(16vw, 0) rotate(0deg);
              }
              97% {
                bottom: 0vw;
                width: 0vw;
                height: 0vw;
                transform-origin: bottom right;
                transform: translate(16vw, 0) rotate(0deg);
              }
              100% {
                bottom: 0vw;
                width: 0vw;
                height: 0vw;
                transform-origin: bottom right;
                transform: translate(16vw, 0) rotate(0deg);
              }
            }

            @keyframes spin-scale-cube2 {
              0% {
                width: 0vw;
                height: 0vw;
                transform: translate(0vw, 0) rotate(0deg);
                transform-origin: bottom right;
              }
              1% {
                bottom: 1vw;
                width: 1vw;
                height: 1vw;
                transform-origin: bottom right;
                transform: translate(0vw, 0) rotate(0deg);
              }
              2% {
                bottom: 1.5vw;
                width: 1.5vw;
                height: 1.5vw;
                transform-origin: bottom right;
                transform: translate(0vw, 0) rotate(0deg);
              }
              3% {
                bottom: 2vw;
                width: 2vw;
                height: 2vw;
                transform-origin: bottom right;
                transform: translate(0vw, 0) rotate(0deg);
              }
              4%,
              10% {
                bottom: 2.5vw;
                width: 2.5vw;
                height: 2.5vw;
                transform-origin: bottom right;
                transform: translate(0vw, 0) rotate(0deg);
              }
              20% {
                bottom: 2.5vw;
                width: 2.5vw;
                height: 2.5vw;
                transform-origin: bottom right;
                transform: translate(0vw, 0) rotate(90deg);
              }
              20.01% {
                transform: translate(3.2vw, 0) rotate(0deg);
              }
              40% {
                bottom: 2.5vw;
                width: 2.5vw;
                height: 2.5vw;
                transform-origin: bottom right;
                transform: translate(3.2vw, 0) rotate(90deg);
              }
              40.01% {
                transform: translate(6.4vw, 0) rotate(0deg);
              }
              60% {
                bottom: 2.5vw;
                width: 2.5vw;
                height: 2.5vw;
                transform-origin: bottom right;
                transform: translate(6.4vw, 0) rotate(90deg);
              }
              60.01% {
                transform: translate(9.6vw, 0) rotate(0deg);
              }
              80% {
                bottom: 2.5vw;
                width: 2.5vw;
                height: 2.5vw;
                transform-origin: bottom right;
                transform: translate(9.6vw, 0) rotate(90deg);
              }
              80.01% {
                transform: translate(12.8vw, 0) rotate(0deg);
              }
              90% {
                bottom: 2.5vw;
                width: 2.5vw;
                height: 2.5vw;
                transform-origin: bottom right;
                transform: translate(12.8vw, 0) rotate(0deg);
              }
              90.01% {
                bottom: 2.5vw;
                width: 2.5vw;
                height: 2.5vw;
                transform-origin: bottom right;
                transform: translate(16vw, 0) rotate(0deg);
              }
              91% {
                bottom: 1.5vw;
                width: 1.5vw;
                height: 1.5vw;
                transform-origin: bottom right;
                transform: translate(16vw, 0) rotate(0deg);
              }
              93% {
                bottom: 1vw;
                width: 1vw;
                height: 1vw;
                transform-origin: bottom right;
                transform: translate(16vw, 0) rotate(0deg);
              }
              95% {
                bottom: 0.5vw;
                width: 0.5vw;
                height: 0.5vw;
                transform-origin: bottom right;
                transform: translate(16vw, 0) rotate(0deg);
              }
              97% {
                bottom: 0vw;
                width: 0vw;
                height: 0vw;
                transform-origin: bottom right;
                transform: translate(16vw, 0) rotate(0deg);
              }
              100% {
                bottom: 0vw;
                width: 0vw;
                height: 0vw;
                transform-origin: bottom right;
                transform: translate(16vw, 0) rotate(0deg);
              }
            }

            @keyframes spin-scale-cube3 {
              0% {
                width: 0vw;
                height: 0vw;
                transform: translate(0vw, 0) rotate(0deg);
                transform-origin: bottom right;
              }
              1% {
                bottom: 1vw;
                width: 1vw;
                height: 1vw;
                transform-origin: bottom right;
                transform: translate(0vw, 0) rotate(0deg);
              }
              2% {
                bottom: 1.5vw;
                width: 1.5vw;
                height: 1.5vw;
                transform-origin: bottom right;
                transform: translate(0vw, 0) rotate(0deg);
              }
              3% {
                bottom: 2vw;
                width: 2vw;
                height: 2vw;
                transform-origin: bottom right;
                transform: translate(0vw, 0) rotate(0deg);
              }
              4%,
              10% {
                bottom: 2.5vw;
                width: 2.5vw;
                height: 2.5vw;
                transform-origin: bottom right;
                transform: translate(0vw, 0) rotate(0deg);
              }
              20% {
                bottom: 2.5vw;
                width: 2.5vw;
                height: 2.5vw;
                transform-origin: bottom right;
                transform: translate(0vw, 0) rotate(90deg);
              }
              20.01% {
                transform: translate(3.2vw, 0) rotate(0deg);
              }
              40% {
                bottom: 2.5vw;
                width: 2.5vw;
                height: 2.5vw;
                transform-origin: bottom right;
                transform: translate(3.2vw, 0) rotate(90deg);
              }
              40.01% {
                transform: translate(6.4vw, 0) rotate(0deg);
              }
              60% {
                bottom: 2.5vw;
                width: 2.5vw;
                height: 2.5vw;
                transform-origin: bottom right;
                transform: translate(6.4vw, 0) rotate(90deg);
              }
              60.01% {
                transform: translate(9.6vw, 0) rotate(0deg);
              }
              80% {
                bottom: 2.5vw;
                width: 2.5vw;
                height: 2.5vw;
                transform-origin: bottom right;
                transform: translate(9.6vw, 0) rotate(90deg);
              }
              80.01% {
                transform: translate(12.8vw, 0) rotate(0deg);
              }
              85% {
                bottom: 2.5vw;
                width: 2.5vw;
                height: 2.5vw;
                transform-origin: bottom right;
                transform: translate(12.8vw, 0) rotate(0deg);
              }
              90.01% {
                bottom: 2.5vw;
                width: 2.5vw;
                height: 2.5vw;
                transform-origin: bottom right;
                transform: translate(16vw, 0) rotate(0deg);
              }
              91% {
                bottom: 1.5vw;
                width: 1.5vw;
                height: 1.5vw;
                transform-origin: bottom right;
                transform: translate(16vw, 0) rotate(0deg);
              }
              93% {
                bottom: 1vw;
                width: 1vw;
                height: 1vw;
                transform-origin: bottom right;
                transform: translate(16vw, 0) rotate(0deg);
              }
              95% {
                bottom: 0.5vw;
                width: 0.5vw;
                height: 0.5vw;
                transform-origin: bottom right;
                transform: translate(16vw, 0) rotate(0deg);
              }
              97% {
                bottom: 0vw;
                width: 0vw;
                height: 0vw;
                transform-origin: bottom right;
                transform: translate(16vw, 0) rotate(0deg);
              }
              100% {
                bottom: 0vw;
                width: 0vw;
                height: 0vw;
                transform-origin: bottom right;
                transform: translate(16vw, 0) rotate(0deg);
              }
            }

            @keyframes blink-dot1 {
              0%,
              18% {
                visibility: hidden;
              }
              19% {
                visibility: hidden;
              }
              20% {
                visibility: visible;
              }
              100% {
                visibility: hidden;
              }
            }

            @keyframes blink-dot2 {
              0%,
              50% {
                visibility: hidden;
              }
              51% {
                visibility: hidden;
              }
              52% {
                visibility: visible;
              }
              100% {
                visibility: hidden;
              }
            }

            @keyframes blink-dot3 {
              0%,
              73% {
                visibility: hidden;
              }
              74% {
                visibility: hidden;
              }
              75% {
                visibility: visible;
              }
              100% {
                visibility: hidden;
              }
            }

<div class="loader">
<div class="square"></div>
<div class="square"></div>
 <div class="square"></div>
 <div class="loader-text">Loading
<span>.</span>
<span>.</span>
<span>.</span>
</div>
</div>

如何让正方形在动画开始的同时放大,在动画结束的同时缩小?

最佳答案

我的“问题”解决了。

当动画开始时(步长为 0%),您必须将正方形平移到 y 轴上的 2.5vw(正方形的宽度和高度)。 当动画结束时(步长为 100%),您必须将正方形平移到 x 轴上的 14.05vw(任意值)和 y 轴上的 2.5vw。

这些更改会生成该代码:

     .loader {
         height: 20vw;
         width: 20vw;
         position: absolute;
         top: 0;
         bottom: 0;
         left: 0;
         right: 0;
         margin: auto;
       }

       .loader::after {
         content: "";
         position: absolute;
         z-index: -1;
         top: 22%;
         bottom: 0;
         left: 0;
         right: 0;
         border-top: 2px dotted #ff0000;
         margin-top: -7%;
       }

       .square {
         position: absolute;
         top: 0;
         left: 0;
         display: block;
         bottom: 0.15vw;
         width: 0.15vw;
         height: 0.15vw;
         background-color: transparent;
       }

       .square:nth-child(1) {
         transform-origin: bottom right;
         border: 0.35vw solid #000000;
         animation-name: spin-scale-cube1;
         animation-duration: 3s;
         animation-delay: 0s;
         animation-timing-function: ease;
         animation-iteration-count: infinite;
         z-index: 1;
       }

       .square:nth-child(2) {
         border: 0.35vw solid #DCDA15;
         animation-name: spin-scale-cube2;
         animation-duration: 3s;
         animation-delay: 0s;
         animation-timing-function: linear;
         animation-iteration-count: infinite;
         z-index: 0;
       }

       .square:nth-child(3) {
         border: 0.35vw solid #00A2DE;
         animation-name: spin-scale-cube3;
         animation-duration: 3s;
         animation-delay: 0s;
         animation-timing-function: linear;
         animation-iteration-count: infinite;
         z-index: -1;
       }

       .loader-text {
         color: #000000;
         text-align: center;
         font-family: "Arial", sans-serif;
         font-size: 3vw;
         margin-top: 27%;
       }

       .loader-text span {
         margin: 0;
         padding: 0;
         width: 0.3vw;
         display: inline-block;
         visibility: hidden;
       }

       .loader-text span:nth-child(1) {
         animation-name: blink-dot1;
         animation-duration: 3s;
         animation-delay: 0s;
         animation-timing-function: ease;
         animation-iteration-count: infinite;
       }

       .loader-text span:nth-child(2) {
         animation-name: blink-dot2;
         animation-duration: 3s;
         animation-delay: 0s;
         animation-timing-function: linear;
         animation-iteration-count: infinite;
       }

       .loader-text span:nth-child(3) {
         animation-name: blink-dot3;
         animation-duration: 3s;
         animation-delay: 0s;
         animation-timing-function: linear;
         animation-iteration-count: infinite;
       }

       .ground {
         border-bottom: 2px solid #ff0000;
       }

       @keyframes spin-scale-cube1 {
         0% {
           bottom: 2.5vw;
           width: 0vw;
           height: 0vw;
           transform-origin: bottom center;
           transform: translate(0vw, 2.5vw) rotate(0deg);
         }
         4%,
         10% {
           bottom: 2.5vw;
           width: 2.5vw;
           height: 2.5vw;
           transform-origin: bottom right;
           transform: translate(0vw, 0) rotate(0deg);
         }
         20% {
           bottom: 2.5vw;
           width: 2.5vw;
           height: 2.5vw;
           transform-origin: bottom right;
           transform: translate(0vw, 0) rotate(90deg);
         }
         20.01% {
           transform: translate(3.2vw, 0) rotate(0deg);
         }
         40% {
           bottom: 2.5vw;
           width: 2.5vw;
           height: 2.5vw;
           transform-origin: bottom right;
           transform: translate(3.2vw, 0) rotate(90deg);
         }
         40.01% {
           transform: translate(6.4vw, 0) rotate(0deg);
         }
         60% {
           bottom: 2.5vw;
           width: 2.5vw;
           height: 2.5vw;
           transform-origin: bottom right;
           transform: translate(6.4vw, 0) rotate(90deg);
         }
         60.01% {
           transform: translate(9.6vw, 0) rotate(0deg);
         }
         80% {
           bottom: 2.5vw;
           width: 2.5vw;
           height: 2.5vw;
           transform-origin: bottom right;
           transform: translate(9.6vw, 0) rotate(90deg);
         }
         80.01% {
           transform: translate(12.8vw, 0) rotate(0deg);
         }
         94% {
           bottom: 2.5vw;
           width: 2.5vw;
           height: 2.5vw;
           transform-origin: bottom right;
           transform: translate(12.8vw, 0) rotate(0deg);
         }
         94.01% {
           bottom: 2.5vw;
           width: 2.5vw;
           height: 2.5vw;
           transform-origin: bottom right;
           transform: translate(12.8vw, 0) rotate(0deg);
         }
         100% {
           bottom: 0vw;
           width: 0vw;
           height: 0vw;
           transform-origin: bottom right;
           transform: translate(14.05vw, 2.5vw) rotate(0deg);
         }
       }

       @keyframes spin-scale-cube2 {
         0% {
           width: 0vw;
           height: 0vw;
           transform: translate(0vw, 2.5vw) rotate(0deg);
           transform-origin: bottom right;
         }
         4%,
         13% {
           bottom: 2.5vw;
           width: 2.5vw;
           height: 2.5vw;
           transform-origin: bottom right;
           transform: translate(0vw, 0) rotate(0deg);
         }
         23% {
           bottom: 2.5vw;
           width: 2.5vw;
           height: 2.5vw;
           transform-origin: bottom right;
           transform: translate(0vw, 0) rotate(90deg);
         }

         23.01% {
           transform: translate(3.2vw, 0) rotate(0deg);
         }
         43% {
           bottom: 2.5vw;
           width: 2.5vw;
           height: 2.5vw;
           transform-origin: bottom right;
           transform: translate(3.2vw, 0) rotate(90deg);
         }
         43.01% {
           transform: translate(6.4vw, 0) rotate(0deg);
         }
         63% {
           bottom: 2.5vw;
           width: 2.5vw;
           height: 2.5vw;
           transform-origin: bottom right;
           transform: translate(6.4vw, 0) rotate(90deg);
         }
         63.01% {
           transform: translate(9.6vw, 0) rotate(0deg);
         }
         83% {
           bottom: 2.5vw;
           width: 2.5vw;
           height: 2.5vw;
           transform-origin: bottom right;
           transform: translate(9.6vw, 0) rotate(90deg);
         }
         83.01% {
           transform: translate(12.8vw, 0) rotate(0deg);
         }
         94% {
           bottom: 2.5vw;
           width: 2.5vw;
           height: 2.5vw;
           transform-origin: bottom right;
           transform: translate(12.8vw, 0) rotate(0deg);
         }
         94.01% {
           bottom: 2.5vw;
           width: 2.5vw;
           height: 2.5vw;
           transform-origin: bottom right;
           transform: translate(12.8vw, 0) rotate(0deg);
         }
         100% {
           bottom: 0vw;
           width: 0vw;
           height: 0vw;
           transform-origin: bottom right;
          transform: translate(14.05vw, 2.5vw) rotate(0deg);
         }
       }

       @keyframes spin-scale-cube3 {
         0% {
           width: 0vw;
           height: 0vw;
           transform: translate(0vw, 2.5vw) rotate(0deg);
           transform-origin: bottom right;
         }
         4%,
         18% {
           bottom: 2.5vw;
           width: 2.5vw;
           height: 2.5vw;
           transform-origin: bottom right;
           transform: translate(0vw, 0) rotate(0deg);
         }
         28% {
           bottom: 2.5vw;
           width: 2.5vw;
           height: 2.5vw;
           transform-origin: bottom right;
           transform: translate(0vw, 0) rotate(90deg);
         }
         28.01% {
           transform: translate(3.2vw, 0) rotate(0deg);
         }
         48% {
           bottom: 2.5vw;
           width: 2.5vw;
           height: 2.5vw;
           transform-origin: bottom right;
           transform: translate(3.2vw, 0) rotate(90deg);
         }
         48.01% {
           transform: translate(6.4vw, 0) rotate(0deg);
         }
         68% {
           bottom: 2.5vw;
           width: 2.5vw;
           height: 2.5vw;
           transform-origin: bottom right;
           transform: translate(6.4vw, 0) rotate(90deg);
         }
         68.01% {
           transform: translate(9.6vw, 0) rotate(0deg);
         }
         88% {
           bottom: 2.5vw;
           width: 2.5vw;
           height: 2.5vw;
           transform-origin: bottom right;
           transform: translate(9.6vw, 0) rotate(90deg);
         }
         88.01% {
           transform: translate(12.8vw, 0) rotate(0deg);
         }
         94% {
           bottom: 2.5vw;
           width: 2.5vw;
           height: 2.5vw;
           transform-origin: bottom right;
           transform: translate(12.8vw, 0) rotate(0deg);
         }
         94.01% {
           bottom: 2.5vw;
           width: 2.5vw;
           height: 2.5vw;
           transform-origin: bottom right;
           transform: translate(12.8vw, 0) rotate(0deg);
         }
         100% {
           bottom: 0vw;
           width: 0vw;
           height: 0vw;
           transform-origin: bottom right;
           transform: translate(14.05vw, 2.5vw) rotate(0deg);
         }
       }

       @keyframes blink-dot1 {
         0%,
         10% {
           visibility: hidden;
         }
         20.01% {
           visibility: visible;
         }
         40% {
           visibility: visible;
         }
         60% {
           visibility: visible;
         }
         100% {
           visibility: hidden;
         }
       }

       @keyframes blink-dot2 {
         0%,
         50% {
           visibility: hidden;
         }
         51% {
           visibility: hidden;
         }
         52% {
           visibility: visible;
         }
         100% {
           visibility: hidden;
         }
       }

       @keyframes blink-dot3 {
         0%,
         73% {
           visibility: hidden;
         }
         74% {
           visibility: hidden;
         }
         75% {
           visibility: visible;
         }
         100% {
           visibility: hidden;
         }
       }

关于html - CSS 动画 : squares loader,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41348114/

相关文章:

java - 使用 Jsoup 解析网页。为什么 Android 上的行为不同?

javascript - CSS关键帧动画不删除显示 block

javascript - Bootstrap 之旅不工作

HTML:如何使用 CSS 作为链接样式表添加图像

html - 移动设备 (WordPress) 标题顶部/底部的空白

CSS 加载动画

html - 图标未显示

html - 调整图像大小,并在容器内水平和垂直居中

android 如何在 android Webview 中获取点击字符串?

javascript - 输入类型=电子邮件元素的 AngularJS ng-model 绑定(bind)问题