用CSS3實現餅狀loading效果

武功山的秋天

原文地址:→看過來css

寫在前面

(附錄有源碼及效果)html

以前碰到一個小練習,就是用純CSS3來寫餅狀的loading效果,以前着實沒有寫過這玩意兒,小花徹底沒頭緒,而後參考了張鑫旭老師的CSS3實現雞蛋餅餅狀圖loading等待轉轉轉,還有些別的東西,用一種看起來有一點相似可是好像又不同的方式完成了一樣的效果,題目要求的大概就是這個樣子:css3

look me

開始

琢磨了一下,睡一覺起來畫了個圖,理順了一下,不過感受此圖有點難意會啊啊啊啊啊,不要緊,小花會在後文一點一點解釋噠~(紅跟粉表明顏色,斜槓後面是z-index的值)
餅狀loading流程圖git

原理

這個東西分爲兩部分:外圈和內圓。顏色這東西都自定義啦,不過我畫的的圈圈好像有點太大,而後動畫時間是隨便設的,反正轉起來看着感受有點怪怪的額github

先上html結構chrome

<div class="con-wrap">

    <!--外圈-->
    <div class="out-round"></div>
    
    <!--內圓,裏面有半圓四個-->
    <div class="in-round">
        <div class="lt-round"></div>
        <div class="lt-mask"></div>
        <div class="rt-round"></div>
        <div class="rt-mask"></div>
    </div>
</div>

外圈和內圓是經過position定位重合在一塊兒,實質上外圈轉完2圈,內圓的紅色和粉色才各轉完1圈(內圓的全程包括紅色從1到0、粉色從1到0),因此內圓的動畫時間應該是外圈的兩倍!!!wordpress

1.外圈動畫

外圈很簡單,設置border-radius:50%便可畫出一個圓,而後設置三條邊框爲紅色,另一條爲透明,即畫出了四分之三個圓邊框(即外圓)。spa

.out-round {
            width: 100px;
            height: 100px;
            border-radius: 50%;
            margin: 150px auto;
            border: 3px solid #FF298C;
            border-left: 3px solid transparent;
            animation: outRound 1s linear infinite running;
        }

四分之三個圓邊框

接下來是外圈的動畫,爲其設置的動畫就是旋轉一圈,infinite表示無限次3d

@keyframes outRound {
            0% {
                transform: rotate(120deg)
            }
            100% {
                transform: rotate(-240deg)
            }
        }

其中rotate(120deg)爲旋轉起始位置,可根據實際狀況調整。

至此外圈就完成了,比較麻煩的是下面的內圓,不過根據圖示應該是能夠想象的。

2.內圓

此處有四個半圓,左邊兩個,右邊兩個(round爲紅色,mask爲粉色),動畫主要經過改變兩個紅色半圓的z-index值來控制各個半圓顯示的優先順序。內圓的css實現部分爲:

/*左邊兩個半圓*/
        .lt-round, .lt-mask {
            position: absolute;
            width: 35px;
            height: 70px;
            border-radius: 35px 0 0 35px;
            transform-origin: right center;
        }
        
/*右邊兩個半圓*/
        .rt-round, .rt-mask {
            position: absolute;
            left: 50%;
            width: 35px;
            height: 70px;
            border-radius: 0 35px 35px 0;
        }

下面過程描述內圓的動畫全程(其中右邊的粉色全程不須要動,右邊紅色部分只須要改變z-index的值來改變顯示的優先級,從而實現顯示和隱藏的效果來配合補充左半邊的圓。):

  1. 初始設置:
紅左 z-index:3
粉1  z-index:2

紅右 z-index:1
粉2  z-index:0

模型圖:

模型圖1

視覺效果圖(忽略中間的白線):

視覺效果圖

2.左邊紅色旋轉完180度時(逆時針旋轉因此是360→180→0)

模型圖:

模型圖2

視覺效果圖:

視覺效果圖

3.左邊紅色轉完到0度時(此時左右兩邊的紅色半圓被粉色覆蓋)

模型圖:

模型圖3

視覺效果圖:

視覺效果圖

4.粉色半圓重複以前紅色半圓的動畫(即左邊粉色360→180→0)

模型圖:

模型圖4

視覺效果圖:

視覺效果圖

5.當左邊粉色旋轉到0度時,所有半圓回到了最初始的狀態,整個動畫即完成(在相同時間下外圈完成了2次的動畫)。

模型圖:

模型圖5

視覺效果圖:

視覺效果圖

動畫代碼部分

1.前半程爲左邊紅色旋轉一週,後半程爲粉色旋轉一週。動畫實現以下:

/*左邊紅色完成第一圈的旋轉*/
@keyframes ltRound {
            0% {
                transform: rotate(360deg);
            }
            24.9% {
                z-index: 3;
            }
            25% {
                z-index: 1;
                transform: rotate(180deg);
            }
            50% {
                transform: rotate(0deg);
            }
            74.9% {
                z-index: 1;
            }
            75%, 100% {
                z-index: 3;
            }
        }

/*右邊紅色圓經過z-index來控制顯示和隱藏,從而達到在適當時間配上左半圓的效果*/
@keyframes rtRound {
            0%, 24.9% {
                z-index: 1;
            }
            25% {
                z-index: -3;
            }
            74.9% {
                z-index: -3;
            }
            75%, 100% {
                z-index: 1;
            }
        }
        
/*左邊粉色完成第二圈的旋轉*/
@keyframes ltMask {
            0%, 25%, 50% {
                transform: rotate(360deg);
            }
            75% {
                transform: rotate(180deg);
            }
            100% {
                transform: rotate(0deg);
            }
        }

2.在所有代碼未完成時,能夠將動畫時間設大一點,這樣便於觀察,搞完了再設回去就OK了。
3.因爲動畫是勻速變化的,可是z-index的值不能勻速變化,因此只能在某個很短期內去改變z-index的值。這樣才能達到效果(忽然感受這種實現好像也不是很好)

小結

  1. 沒作兼容,在chrome中無異常,別的我就不太知道了
  2. 只是用來練習練習,實際上不必定會用到,可是裏面幾個知識點仍是hei有用滴
  3. 小花是小白,對不少東西都還沒整明白,歡迎大佬們指點指點~
  4. 這幾個圖畫的我心好累,sei能給小花推薦個好用點的額

源代碼

相關文章
相關標籤/搜索