前端每日實戰:25# 視頻演示如何用純 CSS 創做一個慧星拖尾效果的 loader 動畫

圖片描述

效果預覽

按下右側的「點擊預覽」按鈕能夠在當前頁面預覽,點擊連接能夠全屏預覽。css

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

可交互視頻教程

此視頻是能夠交互的,你能夠隨時暫停視頻,編輯視頻中的代碼。前端

請用 chrome, safari, edge 打開觀看。git

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

源代碼下載

每日前端實戰系列的所有源代碼請從 github 下載:chrome

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

代碼解讀

定義dom,設置3層容器:flex

<div class="loader">
    <div class="face">
        <div class="circle"></div>
    </div>
</div>

居中顯示:動畫

html,
body,
.loader {
    height: 100%;
    display: flex;
    align-items: center;
    justify-content: center;
    background-color: black;
}

定義容器尺寸:spa

.loader {
    width: 200px;
    height: 200px;
    position: relative;
}

.loader .face {
    position: absolute;
    width:100%;
    height: 100%;
    border: 2px solid white;
    border-radius: 50%;
}

畫出半圓弧:

.loader .face {
    --color: gold;
    border-top-color: var(--color);
    border-left-color: var(--color);
}

畫出弧線的端點:

.loader .face .circle {
    position: absolute;
    top: 50%;
    left: 50%;
    width: 50%;
    height: 1px;
    background-color: white;
    transform-origin: left;
    transform: rotate(-45deg);
}

.loader .face .circle::before {
    position: absolute;
    top: -5px;
    right: -5px;
    content: '';
    background-color: var(--color);
    width: 10px;
    height: 10px;
    border-radius: 50%;
}

給端點增長光暈效果:

.loader .face .circle::before {
    box-shadow: 0 0 20px var(--color),
                0 0 40px var(--color),
                0 0 60px var(--color),
                0 0 80px var(--color),
                0 0 100px var(--color),
                0 0 0 5px rgba(255,255,0,0.1);
}

隱藏掉輔助線:

.loader .face {
    border: 2px solid transparent;
}

.loader .face .circle {
    background-color: transparent;
}

在 dom 中再增長一條弧線:

<div class="loader">
    <div class="face">
        <div class="circle"></div>
    </div>
    <div class="face">
        <div class="circle"></div>
    </div>
</div>

調整2條弧線的直徑,變成同心弧:

.loader .face:nth-child(1) {
    width:100%;
    height: 100%;
}

.loader .face:nth-child(2) {
    width:70%;
    height: 70%;
}

調整2條弧線的顏色:

.loader .face:nth-child(1) {
    --color: gold;
}

.loader .face:nth-child(2) {
    --color: lime;
}

調整2條弧線的端點位置:

.loader .face:nth-child(1) {
    --deg: 0deg;
}

.loader .face:nth-child(2) {
    --deg: 180deg;
}

.loader .face .circle {
    transform: rotate(calc(var(--deg) - 45deg));
}

定義動畫效果:

.loader .face {
    animation: animate 3s linear infinite;
}

@keyframes animate
{
    from {
        transform: rotate(0deg);
    }
    
    to {
        transform: rotate(360deg);
    }
}

最後,讓第 2 條弧線反向旋轉:

.loader .face:nth-child(2) {
    animation-direction: reverse;
}

大功告成!

相關文章
相關標籤/搜索