如何用纯 CSS 创做一个菱形 loader 动画

效果预览

在线演示
html

按下右侧的“点击预览”按钮能够在当前页面预览,点击连接能够全屏预览。前端


https://codepen.io/comehope/pen/eKzjqKgit


可交互视频教程


此视频是能够交互的,你能够随时暂停视频,编辑视频中的代码。github


请用 chrome, safari, edge 打开观看。chrome


https://scrimba.com/p/pEgDAM/c8eyJUEsegmentfault


源代码下载


本地下载

每日前端实战系列的所有源代码请从 github 下载:dom


https://github.com/comehope/front-end-daily-challengesflex


代码解读


定义 dom,一个容器中包含 9 个子元素:动画

<div class="loader">
    <span></span>
    <span></span>
    <span></span>
    <span></span>
    <span></span>
    <span></span>
    <span></span>
    <span></span>
    <span></span>
</div>

居中显示:url

body {
  margin: 0;
  height: 100vh;
  display: flex;
  align-items: center;
  justify-content: center;
  background-color: black;
}

定义容器和子元素尺寸,是一个大正方形里包含 9 个小正方形:

.loader {
    width: 10em;
    height: 10em;
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    grid-gap: 0.5em;
}

把图案调整为大菱形中包含 9 个小菱形:

.loader {
    transform: rotate(45deg);
}

以竖向的小菱形为单位,为小菱形块上色:

.loader span {
    background-color: var(--c);
}

.loader span:nth-child(7) {
    --c: tomato;
}

.loader span:nth-child(4),
.loader span:nth-child(8) {
    --c: gold;
}

.loader span:nth-child(1),
.loader span:nth-child(5),
.loader span:nth-child(9) {
    --c: limegreen;
}

.loader span:nth-child(2),
.loader span:nth-child(6) {
    --c: dodgerblue;
}

.loader span:nth-child(3) {
    --c: mediumpurple;
}

定义动画效果:

.loader span {
    animation: blinking 2s linear infinite;
    animation-delay: var(--d);
    transform: scale(0);
}

@keyframes blinking {
    0%, 100% {
        transform: scale(0);
    }

    40%, 80% {
        transform: scale(1);
    }
}

最后,为小菱形设置时延,加强动感:

.loader span:nth-child(7) {
    --d: 0s;
}

.loader span:nth-child(4),
.loader span:nth-child(8) {
    --d: 0.2s;
}

.loader span:nth-child(1),
.loader span:nth-child(5),
.loader span:nth-child(9) {
    --d: 0.4s;
}

.loader span:nth-child(2),
.loader span:nth-child(6) {
    --d: 0.6s;
}

.loader span:nth-child(3) {
    --d: 0.8s;
}

大功告成!

原文地址:https://segmentfault.com/a/1190000015208027

相关文章
相关标签/搜索