幾個單元素Loading動畫解構


這個賬號建了也有1個多月,拖延症患者終於下定決心開始寫博。做前端從前至后差不多1年時間,如果文中有什么紕漏歡迎指出,未來的路還很長~

 

 

第一篇文章用來解構幾個挺不錯的單元素Loading動畫。效果圖如下:

 

 

 

 Demo中每個動畫不考慮容器都只使用一個div標簽,通過添加陰影和偽元素再加以動畫效果即可實現。下面我們來逐個對圖中的動畫進行分析。

 

總體HTML解構:

<div class="load-container load[index]">

  <div class="loader">Loading...</div>
</div>

 

CSS分析:

Demo 1:

第一步:首先通過對loader類添加::before和::after兩個偽元素副本,和主元素一樣width為1em,height為4em。並設置position:absolute,通過調整TRBL到左右位置,實現如下圖中的排列(注意需要在父元素上設置position:relative,這樣才能根據父元素位置進行定位)。

第二步:設置動畫關鍵幀(@keyframes),關於關鍵幀的介紹可以參考W3C的Animation介紹。設置0%、80%、100%處為初始狀態即 box-shadow: 0 0 #FFF; height: 4em; 在40%處設置為拉伸狀態即:box-shadow: 0 -2em #ffffff; height: 5em; 其中使用box-shadow是為了實現沿水平軸線伸縮的效果。當然其中的長度我們可以自己設置,選擇一個合適的伸縮尺度。考慮兼容性可加上內核前綴。

第三步:將動畫添加至三個元素中,並使用animation-delay屬性設置不同的時延以達到依次伸縮的效果。

以下是該Loading動畫的CSS代碼,總的來說還是很容易實現的。

 1 .load1 .loader,
 2 .load1 .loader:before,
 3 .load1 .loader:after {
 4   background: #FFF;
 5   -webkit-animation: load1 1s infinite ease-in-out;
 6   animation: load1 1s infinite ease-in-out;
 7   width: 1em;
 8   height: 4em;
 9 }
10 .load1 .loader:before,
11 .load1 .loader:after {
12   position: absolute;
13   top: 0;
14   content: '';
15 }
16 .load1 .loader:before {
17   left: -1.5em;
18   -webkit-animation-delay: -0.32s;
19   animation-delay: -0.32s;
20 }
21 .load1 .loader {
22   text-indent: -9999em;
23   margin: 8em auto;
24   position: relative;
25   font-size: 11px;
26   -webkit-animation-delay: -0.16s;
27   animation-delay: -0.16s;
28 }
29 .load1 .loader:after {
30   left: 1.5em;
31 }
32 @-webkit-keyframes load1 {
33   0%,
34   80%,
35   100% {
36     box-shadow: 0 0 #FFF;
37     height: 4em;
38   }
39   40% {
40     box-shadow: 0 -2em #ffffff;
41     height: 5em;
42   }
43 }
44 @keyframes load1 {
45   0%,
46   80%,
47   100% {
48     box-shadow: 0 0 #FFF;
49     height: 4em;
50   }
51   40% {
52     box-shadow: 0 -2em #ffffff;
53     height: 5em;
54   }
55 }
View Code

 

 

Demo 2:

第一步:首先同樣新建兩個::before和::after偽元素副本,設置形狀:主元素為圓形,加1em的box-shadow,即外面的白色圓環。偽元素為半圓,背景色與容器背景色相同。為了更直觀地查看總體結構我們給偽元素加上2px的boder,並將背景調為半透明,如下圖所示。

第二步:設置關鍵幀,使用CSS Transform屬性,具體介紹可參考Transform。0%處設置為 transform: rotate(0deg); 100%處設置為 transform: rotate(360deg); 

第三步:將動畫效果加入到兩個偽元素中。在此一定要注意設置它們的transform-origin屬性,即旋轉中心點,這在上面的Transform參考文章中也有提到。因為CSS會默認繞着元素中心點進行旋轉,而在此我們需要它實現繞主元素中心點進行旋轉變換。

 以下為Demo2的CSS代碼:

 1 .load2 .loader,
 2 .load2 .loader:before,
 3 .load2 .loader:after {
 4   border-radius: 50%;
 5 }
 6 .load2 .loader:before,
 7 .load2 .loader:after {
 8   position: absolute;
 9   content: '';
10 }
11 .load2 .loader:before {
12   width: 5.2em;
13   height: 10.2em;
14   background: #0dcecb;
15   border-radius: 10.2em 0 0 10.2em;
16   top: -0.1em;
17   left: -0.1em;
18   -webkit-transform-origin: 5.2em 5.1em;
19   transform-origin: 5.2em 5.1em;
20   -webkit-animation: load2 2s infinite ease 1.5s;
21   animation: load2 2s infinite ease 1.5s;
22 }
23 .load2 .loader {
24   font-size: 11px;
25   text-indent: -99999em;
26   margin: 5em auto;
27   position: relative;
28   width: 10em;
29   height: 10em;
30   box-shadow: inset 0 0 0 1em #FFF;
31 }
32 .load2 .loader:after {
33   width: 5.2em;
34   height: 10.2em;
35   background: #0dcecb;
36   border-radius: 0 10.2em 10.2em 0;
37   top: -0.1em;
38   left: 5.1em;
39   -webkit-transform-origin: 0px 5.1em;
40   transform-origin: 0px 5.1em;
41   -webkit-animation: load2 2s infinite ease;
42   animation: load2 2s infinite ease;
43 }
44 @-webkit-keyframes load2 {
45   0% {
46     -webkit-transform: rotate(0deg);
47     transform: rotate(0deg);
48   }
49   100% {
50     -webkit-transform: rotate(360deg);
51     transform: rotate(360deg);
52   }
53 }
54 @keyframes load2 {
55   0% {
56     -webkit-transform: rotate(0deg);
57     transform: rotate(0deg);
58   }
59   100% {
60     -webkit-transform: rotate(360deg);
61     transform: rotate(360deg);
62   }
63 }
View Code

 

 

Demo 3:

第一步:主元素為一個從左至右漸變的圓形,如下圖所示。在此使用了linear-gradient,該屬性已得到普遍兼容,如果需要兼容老版本的IE,可考慮使用濾鏡(filter)實現。

第二步:添加::before和::after偽元素副本,從下方左圖中可以看出,偽元素一個為半徑稍小的圓形,背景色與容器顏色相同,一個為1/4扇形,顏色為白色。最終效果如右圖所示。

              

第三步:接下來的事就順理成章了,設置關鍵幀加入旋轉效果即可。

CSS代碼如下:

 1 .load3 .loader {
 2   font-size: 10px;
 3   margin: 5em auto;
 4   text-indent: -9999em;
 5   width: 11em;
 6   height: 11em;
 7   border-radius: 50%;
 8   background: #ffffff;
 9   background: -moz-linear-gradient(left, #ffffff 10%, rgba(255, 255, 255, 0) 42%);
10   background: -webkit-linear-gradient(left, #ffffff 10%, rgba(255, 255, 255, 0) 42%);
11   background: -o-linear-gradient(left, #ffffff 10%, rgba(255, 255, 255, 0) 42%);
12   background: -ms-linear-gradient(left, #ffffff 10%, rgba(255, 255, 255, 0) 42%);
13   background: linear-gradient(to right, #ffffff 10%, rgba(255, 255, 255, 0) 42%);
14   position: relative;
15   -webkit-animation: load3 1.4s infinite linear;
16   animation: load3 1.4s infinite linear;
17 }
18 .load3 .loader:before {
19   width: 50%;
20   height: 50%;
21   background: #FFF;
22   border-radius: 100% 0 0 0;
23   position: absolute;
24   top: 0;
25   left: 0;
26   content: '';
27 }
28 .load3 .loader:after {
29   background: #0dcecb;
30   width: 75%;
31   height: 75%;
32   border-radius: 50%;
33   content: '';
34   margin: auto;
35   position: absolute;
36   top: 0;
37   left: 0;
38   bottom: 0;
39   right: 0;
40 }
41 @-webkit-keyframes load3 {
42   0% {
43     -webkit-transform: rotate(0deg);
44     transform: rotate(0deg);
45   }
46   100% {
47     -webkit-transform: rotate(360deg);
48     transform: rotate(360deg);
49   }
50 }
51 @keyframes load3 {
52   0% {
53     -webkit-transform: rotate(0deg);
54     transform: rotate(0deg);
55   }
56   100% {
57     -webkit-transform: rotate(360deg);
58     transform: rotate(360deg);
59   }
60 }
View Code

 

 

Demo 4:

第一步:此效果只需要一個主元素,隨后在動畫中加入數個box-shadow即可。從下圖可以看到主元素為1個小圓形,將其周圍分為8個區域,每個地方可存放一個box-shadow副本(我們完全可以把box-shadow創造出的陰影看做主元素的拷貝,就像text-shadow那樣)。

第二步:定義關鍵幀,在0%、12.5%、25%、37.5%、50%、62.5%、75%、87.5%、100%處設置box-shadow的大小,讓其順時針或者逆時針逐個增大。

第三步:加入動畫效果。

CSS代碼如下:

 1 .load4 .loader {
 2   font-size: 20px;
 3   margin: 5em auto;
 4   width: 1em;
 5   height: 1em;
 6   border-radius: 50%;
 7   position: relative;
 8   text-indent: -9999em;
 9   -webkit-animation: load4 1.3s infinite linear;
10   animation: load4 1.3s infinite linear;
11 }
12 @-webkit-keyframes load4 {
13   0%,
14   100% {
15     box-shadow: 0em -3em 0em 0.2em #ffffff, 2em -2em 0 0em #ffffff, 3em 0em 0 -0.5em #ffffff, 2em 2em 0 -0.5em #ffffff, 0em 3em 0 -0.5em #ffffff, -2em 2em 0 -0.5em #ffffff, -3em 0em 0 -0.5em #ffffff, -2em -2em 0 0em #ffffff;
16   }
17   12.5% {
18     box-shadow: 0em -3em 0em 0em #ffffff, 2em -2em 0 0.2em #ffffff, 3em 0em 0 0em #ffffff, 2em 2em 0 -0.5em #ffffff, 0em 3em 0 -0.5em #ffffff, -2em 2em 0 -0.5em #ffffff, -3em 0em 0 -0.5em #ffffff, -2em -2em 0 -0.5em #ffffff;
19   }
20   25% {
21     box-shadow: 0em -3em 0em -0.5em #ffffff, 2em -2em 0 0em #ffffff, 3em 0em 0 0.2em #ffffff, 2em 2em 0 0em #ffffff, 0em 3em 0 -0.5em #ffffff, -2em 2em 0 -0.5em #ffffff, -3em 0em 0 -0.5em #ffffff, -2em -2em 0 -0.5em #ffffff;
22   }
23   37.5% {
24     box-shadow: 0em -3em 0em -0.5em #ffffff, 2em -2em 0 -0.5em #ffffff, 3em 0em 0 0em #ffffff, 2em 2em 0 0.2em #ffffff, 0em 3em 0 0em #ffffff, -2em 2em 0 -0.5em #ffffff, -3em 0em 0 -0.5em #ffffff, -2em -2em 0 -0.5em #ffffff;
25   }
26   50% {
27     box-shadow: 0em -3em 0em -0.5em #ffffff, 2em -2em 0 -0.5em #ffffff, 3em 0em 0 -0.5em #ffffff, 2em 2em 0 0em #ffffff, 0em 3em 0 0.2em #ffffff, -2em 2em 0 0em #ffffff, -3em 0em 0 -0.5em #ffffff, -2em -2em 0 -0.5em #ffffff;
28   }
29   62.5% {
30     box-shadow: 0em -3em 0em -0.5em #ffffff, 2em -2em 0 -0.5em #ffffff, 3em 0em 0 -0.5em #ffffff, 2em 2em 0 -0.5em #ffffff, 0em 3em 0 0em #ffffff, -2em 2em 0 0.2em #ffffff, -3em 0em 0 0em #ffffff, -2em -2em 0 -0.5em #ffffff;
31   }
32   75% {
33     box-shadow: 0em -3em 0em -0.5em #ffffff, 2em -2em 0 -0.5em #ffffff, 3em 0em 0 -0.5em #ffffff, 2em 2em 0 -0.5em #ffffff, 0em 3em 0 -0.5em #ffffff, -2em 2em 0 0em #ffffff, -3em 0em 0 0.2em #ffffff, -2em -2em 0 0em #ffffff;
34   }
35   87.5% {
36     box-shadow: 0em -3em 0em 0em #ffffff, 2em -2em 0 -0.5em #ffffff, 3em 0em 0 -0.5em #ffffff, 2em 2em 0 -0.5em #ffffff, 0em 3em 0 -0.5em #ffffff, -2em 2em 0 0em #ffffff, -3em 0em 0 0em #ffffff, -2em -2em 0 0.2em #ffffff;
37   }
38 }
39 @keyframes load4 {
40   0%,
41   100% {
42     box-shadow: 0em -3em 0em 0.2em #ffffff, 2em -2em 0 0em #ffffff, 3em 0em 0 -0.5em #ffffff, 2em 2em 0 -0.5em #ffffff, 0em 3em 0 -0.5em #ffffff, -2em 2em 0 -0.5em #ffffff, -3em 0em 0 -0.5em #ffffff, -2em -2em 0 0em #ffffff;
43   }
44   12.5% {
45     box-shadow: 0em -3em 0em 0em #ffffff, 2em -2em 0 0.2em #ffffff, 3em 0em 0 0em #ffffff, 2em 2em 0 -0.5em #ffffff, 0em 3em 0 -0.5em #ffffff, -2em 2em 0 -0.5em #ffffff, -3em 0em 0 -0.5em #ffffff, -2em -2em 0 -0.5em #ffffff;
46   }
47   25% {
48     box-shadow: 0em -3em 0em -0.5em #ffffff, 2em -2em 0 0em #ffffff, 3em 0em 0 0.2em #ffffff, 2em 2em 0 0em #ffffff, 0em 3em 0 -0.5em #ffffff, -2em 2em 0 -0.5em #ffffff, -3em 0em 0 -0.5em #ffffff, -2em -2em 0 -0.5em #ffffff;
49   }
50   37.5% {
51     box-shadow: 0em -3em 0em -0.5em #ffffff, 2em -2em 0 -0.5em #ffffff, 3em 0em 0 0em #ffffff, 2em 2em 0 0.2em #ffffff, 0em 3em 0 0em #ffffff, -2em 2em 0 -0.5em #ffffff, -3em 0em 0 -0.5em #ffffff, -2em -2em 0 -0.5em #ffffff;
52   }
53   50% {
54     box-shadow: 0em -3em 0em -0.5em #ffffff, 2em -2em 0 -0.5em #ffffff, 3em 0em 0 -0.5em #ffffff, 2em 2em 0 0em #ffffff, 0em 3em 0 0.2em #ffffff, -2em 2em 0 0em #ffffff, -3em 0em 0 -0.5em #ffffff, -2em -2em 0 -0.5em #ffffff;
55   }
56   62.5% {
57     box-shadow: 0em -3em 0em -0.5em #ffffff, 2em -2em 0 -0.5em #ffffff, 3em 0em 0 -0.5em #ffffff, 2em 2em 0 -0.5em #ffffff, 0em 3em 0 0em #ffffff, -2em 2em 0 0.2em #ffffff, -3em 0em 0 0em #ffffff, -2em -2em 0 -0.5em #ffffff;
58   }
59   75% {
60     box-shadow: 0em -3em 0em -0.5em #ffffff, 2em -2em 0 -0.5em #ffffff, 3em 0em 0 -0.5em #ffffff, 2em 2em 0 -0.5em #ffffff, 0em 3em 0 -0.5em #ffffff, -2em 2em 0 0em #ffffff, -3em 0em 0 0.2em #ffffff, -2em -2em 0 0em #ffffff;
61   }
62   87.5% {
63     box-shadow: 0em -3em 0em 0em #ffffff, 2em -2em 0 -0.5em #ffffff, 3em 0em 0 -0.5em #ffffff, 2em 2em 0 -0.5em #ffffff, 0em 3em 0 -0.5em #ffffff, -2em 2em 0 0em #ffffff, -3em 0em 0 0em #ffffff, -2em -2em 0 0.2em #ffffff;
64   }
65 }
View Code

 

 

Demo 5:

跟Demo 4非常類似,只是將設置box-shadow的大小改為設置其顏色透明度。

附上代碼:

 1 .load5 .loader {
 2   margin: 4em auto;
 3   font-size: 25px;
 4   width: 1em;
 5   height: 1em;
 6   border-radius: 50%;
 7   position: relative;
 8   text-indent: -9999em;
 9   -webkit-animation: load5 1.1s infinite ease;
10   animation: load5 1.1s infinite ease;
11 }
12 @-webkit-keyframes load5 {
13   0%,
14   100% {
15     box-shadow: 0em -2.6em 0em 0em #ffffff, 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.5), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.7);
16   }
17   12.5% {
18     box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.7), 1.8em -1.8em 0 0em #ffffff, 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.5);
19   }
20   25% {
21     box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.5), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.7), 2.5em 0em 0 0em #ffffff, 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);
22   }
23   37.5% {
24     box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.5), 2.5em 0em 0 0em rgba(255, 255, 255, 0.7), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);
25   }
26   50% {
27     box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.5), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.7), 0em 2.5em 0 0em #ffffff, -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);
28   }
29   62.5% {
30     box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.5), 0em 2.5em 0 0em rgba(255, 255, 255, 0.7), -1.8em 1.8em 0 0em #ffffff, -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);
31   }
32   75% {
33     box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.5), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.7), -2.6em 0em 0 0em #ffffff, -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);
34   }
35   87.5% {
36     box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.5), -2.6em 0em 0 0em rgba(255, 255, 255, 0.7), -1.8em -1.8em 0 0em #ffffff;
37   }
38 }
39 @keyframes load5 {
40   0%,
41   100% {
42     box-shadow: 0em -2.6em 0em 0em #ffffff, 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.5), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.7);
43   }
44   12.5% {
45     box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.7), 1.8em -1.8em 0 0em #ffffff, 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.5);
46   }
47   25% {
48     box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.5), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.7), 2.5em 0em 0 0em #ffffff, 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);
49   }
50   37.5% {
51     box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.5), 2.5em 0em 0 0em rgba(255, 255, 255, 0.7), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);
52   }
53   50% {
54     box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.5), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.7), 0em 2.5em 0 0em #ffffff, -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);
55   }
56   62.5% {
57     box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.5), 0em 2.5em 0 0em rgba(255, 255, 255, 0.7), -1.8em 1.8em 0 0em #ffffff, -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);
58   }
59   75% {
60     box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.5), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.7), -2.6em 0em 0 0em #ffffff, -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);
61   }
62   87.5% {
63     box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.5), -2.6em 0em 0 0em rgba(255, 255, 255, 0.7), -1.8em -1.8em 0 0em #ffffff;
64   }
65 }
View Code

 

 

Demo 6:

第一步:運用Demo 4、5的思路,在關鍵幀中給主元素創建5個box-shadow副本。

第二步:在0%、5%、95%、100%處五個副本處於重疊狀態,再在30%、55%處設置其分離狀態,並加入transform的旋轉效果即可實現小球的加速、減速模擬。我們不必在關鍵幀中定義太多節點,因為CSS會自動去處理中間的過渡狀態。

第三步:將動畫加入到主元素中。

CSS代碼如下:

 1 .load6 .loader {
 2   font-size: 90px;
 3   text-indent: -9999em;
 4   overflow: hidden;
 5   width: 1em;
 6   height: 1em;
 7   border-radius: 50%;
 8   margin: 0.8em auto;
 9   position: relative;
10   -webkit-animation: load6 1.7s infinite ease;
11   animation: load6 1.7s infinite ease;
12 }
13 @-webkit-keyframes load6 {
14   0% {
15     -webkit-transform: rotate(0deg);
16     transform: rotate(0deg);
17     box-shadow: -0.11em -0.83em 0 -0.4em #ffffff, -0.11em -0.83em 0 -0.42em #ffffff, -0.11em -0.83em 0 -0.44em #ffffff, -0.11em -0.83em 0 -0.46em #ffffff, -0.11em -0.83em 0 -0.477em #ffffff;
18   }
19   5%,
20   95% {
21     box-shadow: -0.11em -0.83em 0 -0.4em #ffffff, -0.11em -0.83em 0 -0.42em #ffffff, -0.11em -0.83em 0 -0.44em #ffffff, -0.11em -0.83em 0 -0.46em #ffffff, -0.11em -0.83em 0 -0.477em #ffffff;
22   }
23   30% {
24     box-shadow: -0.11em -0.83em 0 -0.4em #ffffff, -0.51em -0.66em 0 -0.42em #ffffff, -0.75em -0.36em 0 -0.44em #ffffff, -0.83em -0.03em 0 -0.46em #ffffff, -0.81em 0.21em 0 -0.477em #ffffff;
25   }
26   55% {
27     box-shadow: -0.11em -0.83em 0 -0.4em #ffffff, -0.29em -0.78em 0 -0.42em #ffffff, -0.43em -0.72em 0 -0.44em #ffffff, -0.52em -0.65em 0 -0.46em #ffffff, -0.57em -0.61em 0 -0.477em #ffffff;
28   }
29   100% {
30     -webkit-transform: rotate(360deg);
31     transform: rotate(360deg);
32     box-shadow: -0.11em -0.83em 0 -0.4em #ffffff, -0.11em -0.83em 0 -0.42em #ffffff, -0.11em -0.83em 0 -0.44em #ffffff, -0.11em -0.83em 0 -0.46em #ffffff, -0.11em -0.83em 0 -0.477em #ffffff;
33   }
34 }
35 @keyframes load6 {
36   0% {
37     -webkit-transform: rotate(0deg);
38     transform: rotate(0deg);
39     box-shadow: -0.11em -0.83em 0 -0.4em #ffffff, -0.11em -0.83em 0 -0.42em #ffffff, -0.11em -0.83em 0 -0.44em #ffffff, -0.11em -0.83em 0 -0.46em #ffffff, -0.11em -0.83em 0 -0.477em #ffffff;
40   }
41   5%,
42   95% {
43     box-shadow: -0.11em -0.83em 0 -0.4em #ffffff, -0.11em -0.83em 0 -0.42em #ffffff, -0.11em -0.83em 0 -0.44em #ffffff, -0.11em -0.83em 0 -0.46em #ffffff, -0.11em -0.83em 0 -0.477em #ffffff;
44   }
45   30% {
46     box-shadow: -0.11em -0.83em 0 -0.4em #ffffff, -0.51em -0.66em 0 -0.42em #ffffff, -0.75em -0.36em 0 -0.44em #ffffff, -0.83em -0.03em 0 -0.46em #ffffff, -0.81em 0.21em 0 -0.477em #ffffff;
47   }
48   55% {
49     box-shadow: -0.11em -0.83em 0 -0.4em #ffffff, -0.29em -0.78em 0 -0.42em #ffffff, -0.43em -0.72em 0 -0.44em #ffffff, -0.52em -0.65em 0 -0.46em #ffffff, -0.57em -0.61em 0 -0.477em #ffffff;
50   }
51   100% {
52     -webkit-transform: rotate(360deg);
53     transform: rotate(360deg);
54     box-shadow: -0.11em -0.83em 0 -0.4em #ffffff, -0.11em -0.83em 0 -0.42em #ffffff, -0.11em -0.83em 0 -0.44em #ffffff, -0.11em -0.83em 0 -0.46em #ffffff, -0.11em -0.83em 0 -0.477em #ffffff;
55   }
56 }
View Code

 

 

Demo 7:

第一眼看着類似於Demo 1和Demo 4的結合,實現方法其實不止一種。一種思路是創建兩個偽元素然后給三個元素都創建box-shadow,控制陰影大小和動畫時延即可;另一種思路是像前幾個例子一樣只需要對主元素創建兩個box-shadow副本,並在關鍵幀中對各節點設置對應大小。Demo中使用的是前一種方法。

附上CSS代碼:

 1 .load7 .loader:before,
 2 .load7 .loader:after,
 3 .load7 .loader {
 4   border-radius: 50%;
 5   width: 2.5em;
 6   height: 2.5em;
 7   -webkit-animation-fill-mode: both;
 8   animation-fill-mode: both;
 9   -webkit-animation: load7 1.8s infinite ease-in-out;
10   animation: load7 1.8s infinite ease-in-out;
11 }
12 .load7 .loader {
13   margin: 8em auto;
14   font-size: 10px;
15   position: relative;
16   text-indent: -9999em;
17   -webkit-animation-delay: -0.16s;
18   animation-delay: -0.16s;
19 }
20 .load7 .loader:before {
21   left: -3.5em;
22   -webkit-animation-delay: -0.32s;
23   animation-delay: -0.32s;
24 }
25 .load7 .loader:after {
26   left: 3.5em;
27 }
28 .load7 .loader:before,
29 .loader:after {
30   content: '';
31   position: absolute;
32   top: 0;
33 }
34 @-webkit-keyframes load7 {
35   0%,
36   80%,
37   100% {
38     box-shadow: 0 2.5em 0 -1.3em #ffffff;
39   }
40   40% {
41     box-shadow: 0 2.5em 0 0 #FFF;
42   }
43 }
44 @keyframes load7 {
45   0%,
46   80%,
47   100% {
48     box-shadow: 0 2.5em 0 -1.3em #ffffff;
49   }
50   40% {
51     box-shadow: 0 2.5em 0 0 #FFF;
52   }
53 }
View Code

 

 

Demo 8:

相信有了Demo 2的例子很多朋友都會馬上想到創建兩個偽元素交替覆蓋的方法,不過其實也不用那么復雜,我們只需要對主元素的border-top、border-right、border-bottom、border-left分別進行設置即可,類似於CSS三角形的制作原理。

附上CSS代碼:

 1 .load8 .loader {
 2   margin: 6em auto;
 3   font-size: 10px;
 4   position: relative;
 5   text-indent: -9999em;
 6   border-top: 1.1em solid rgba(255, 255, 255, 0.2);
 7   border-right: 1.1em solid rgba(255, 255, 255, 0.2);
 8   border-bottom: 1.1em solid rgba(255, 255, 255, 0.2);
 9   border-left: 1.1em solid #ffffff;
10   -webkit-animation: load8 1.1s infinite linear;
11   animation: load8 1.1s infinite linear;
12 }
13 .load8 .loader,
14 .load8 .loader:after {
15   border-radius: 50%;
16   width: 10em;
17   height: 10em;
18 }
19 @-webkit-keyframes load8 {
20   0% {
21     -webkit-transform: rotate(0deg);
22     transform: rotate(0deg);
23   }
24   100% {
25     -webkit-transform: rotate(360deg);
26     transform: rotate(360deg);
27   }
28 }
29 @keyframes load8 {
30   0% {
31     -webkit-transform: rotate(0deg);
32     transform: rotate(0deg);
33   }
34   100% {
35     -webkit-transform: rotate(360deg);
36     transform: rotate(360deg);
37   }
38 }
View Code

 

 最后的最后,剛好今天是七夕,不管是人是犬都祝福大家節日快樂啦!

 

 

 

 

 

 再附一圖 ,哈哈哈 ~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM