CSS動畫實例:Loading加載動畫效果(一)

      一些網站或者APP在加載新東西的時候,往往會給出一個好看有趣的Loading圖,大部分的Loading樣式都可以使用CSS3製作出來,它不僅比直接使用gif圖簡單方便,還能節省加載時間和空間。下面介紹常見的一些Loading動畫效果圖的製作方法。

1.圓環型Loading

      這類Loading動畫的基本思想是:先在呈現容器中定義一個名為loader的層,再對loader進行樣式定義,使得其顯示為一個圓環,最後編寫關鍵幀動畫控制,使得loader層旋轉起來即可。

       (1)旋轉未封閉的圓環加載效果。

      例如,設頁面中有  <div class=’loader’></div>,定義loader的樣式規則如下:

  .loader

   {

      width:100px;

      height:100px;

      border-radius:50%;

      border:16px solid #f3f3f3;

      border-top:16px solid #ff0000;

   }

則顯示的圖形如圖1所示。

圖1  圓環1

      若在上面的樣式規則中加上語句:border-bottom:16px solid #0000ff;,則顯示的圖形如圖2所示。

圖2 圓環2

      如再同時將邊框顏色修改為容器背景色,則顯示的圖形如圖3所示。

 

圖3  圓環3

      若只將樣式規則中的border-top:16px solid #ff0000;改寫為border-top:16px solid #d8d8d8;,即將圖1邊框上的紅色改成背景色,則顯示的圖形如圖4所示。

圖4  圓環4

      編寫關鍵幀定義,並在loader樣式定義中加上animation屬性設置語句,可以得到如圖5所示的Loading動畫效果。

      完整的HTML文件內容如下。

<!DOCTYPE html>
<html>
<head>
<title>Loading加載動畫</title>
<style>
   .container
   {
      margin: 0 auto;
      width: 300px;
      height:300px;
      position: relative;
      display:flex;
      justify-content:center;
      align-items:center;
      background:#d8d8d8;
      border: 4px solid rgba(255, 0, 0, 0.9);
      border-radius: 10%;
   }
   .loader
   {
      width:100px;
      height:100px;
      border-radius:50%;
      border:16px solid #d8d8d8;
      border-top:16px solid #ff0000;
      border-bottom:16px solid #0000ff;
      animation:load 2s linear infinite;
   }
   @keyframes load
   {
      0%   { transform: rotate(0deg); }
      100% { transform:rotate(360deg); }
   }
</style>
</head>
<body>
<div  class="container">
  <div class='loader'></div>
</div>    
</body>
</html>

View Code

圖5  Loading動畫效果(1)

      圖1圓環對應的動畫效果如圖6所示。

 

圖6  Loading動畫效果(2)

      圖4圓環對應的動畫效果如圖7所示。

 

圖7   Loading動畫效果(3)

      圖5、圖6和圖7的效果是通過旋轉實現的,還可以縮放圓環,將關鍵幀的定義修改為:

   @keyframes load

   {

      0%

      {

          transform: scale(0.2);

          opacity: 0.5;

      }

      100%

      {

          transform: scale(1);

          opacity: 1;

      }

   }

則呈現出如圖8所示的動畫效果。

 

圖8  Loading動畫效果(4)

      可以設定兩個弧段,進行交叉旋轉,編寫如下的HTML文件。

<!DOCTYPE html>
<html>
<head>
<title>Loading加載動畫</title>
<style>
   .container
   {
      margin: 0 auto;
      width: 300px;
      height:300px;
      position: relative;
      display:flex;
      justify-content:center;
      align-items:center;
      background:#d8d8d8;
      border: 4px solid rgba(255, 0, 0, 0.9);
      border-radius: 10%;
   }
   .loader
   {
      position:absolute;
      border-radius:50%;
      border:10px solid #d8d8d8;
      border-bottom:10px solid #0000ff;
      animation:load 2s linear infinite;
   }
   .loader:nth-child(1)
   {
      width:100px;
      height:100px;
   }
   .loader:nth-child(2)
   {
      width:70px;
      height:70px;
      animation-direction: reverse;
   }
   @keyframes load
   {
      0%   { transform: rotate(0deg); }
      100% { transform:rotate(360deg); }
   }
</style>
</head>
<body>
<div  class="container">
  <div class='loader'></div>
  <div class='loader'></div>
</div>    
</body>
</html>

View Code

      在瀏覽器中打開包含這段HTML代碼的html文件,可以呈現出如圖9所示的Loading動畫效果。

 

圖9  Loading動畫效果(5)

      若將上面.loader定義中的語句border:10px solid #d8d8d8;」刪除,則呈現如圖10所示的動畫效果。

 

圖10  Loading動畫效果(6)

      (2)旋轉後封閉的圓環加載效果。

      上面的幾個圓環型動畫效果是一段圓環形弧段進行旋轉,旋轉的整個過程中未封閉成一個圓環。若旋轉過程中出現一個封閉的圓環,例如一小段圓弧逐步沿圓環轉動,轉動過程中圓弧段加長,直到封閉為一個圓環。動畫效果如圖11所示。

 

圖11  Loading動畫效果(7)

      這個動畫製作起來稍微複雜一點,需要藉助遮罩的思想。基本思路是:先製作一個完整的圓環,然後在圓環上左右兩半邊上分別讓一個填充色為紅色的矩形框旋轉,旋轉時位於圓環上的部分顯示出來,超出圓環的部分被隱藏(設置overflow: hidden;即可),這樣就可實現圖11所示的動畫效果。

      設頁面有<span class=”loader”></span>,定義.loader的樣式規則如下:

   .loader

   {

       position: relative;

       height: 100px;

       width: 100px;

       border-radius: 50%; 

       background:#f3f3f3;

   }

   .loader:after

   {

       content: “”;

       position: absolute;

       top: 20px;

       left: 20px;

       height: 60px;

       width: 60px;

       background:#d8d8d8;

       border-radius: 50%;

   }

可以得到如圖12所示的圓環。

圖12  一個圓環

      然後分別對圓環內的子元素左右矩形框進行樣式設置和關鍵幀定義,編寫如下的HTML文件。

<!DOCTYPE html>
<html>
<head>
<title>Loading加載動畫</title>
<style>
   .container
   {
      margin: 0 auto;
      width: 300px;
      height:300px;
      position: relative;
      display:flex;
      justify-content:center;
      align-items:center;
      background:#d8d8d8;
      border: 4px solid rgba(255, 0, 0, 0.9);
      border-radius: 10%;
   }
   .loader
   {
       position: relative;
       height: 100px;
       width: 100px;
       border-radius: 50%;  
       background:#f3f3f3;
   }
   .loader:after 
   {
       content: "";
       position: absolute;
       top: 20px; 
       left: 20px;
       height: 60px; 
       width: 60px;
       background:#d8d8d8;
       border-radius: 50%;
   }
   .loader > span 
   {
       position: absolute;
       height: 100%; 
       width: 50%;
       overflow: hidden;
   }
   .left  
   { 
       left:0   
   }
   .right 
   { 
       left:50%;
   }
   .mask 
   {
      position: absolute;
      left: 100%; 
      top: 0;
      height: 100%; 
      width: 100%;
      border-radius: 60px;
      background:  #ff0000;
      opacity: 0.8;
      animation: rotate1 3s infinite linear;
      transform-origin: 0 50% 0;
   }
   .left .mask 
   {
      border-bottom-left-radius: 0;
      border-top-left-radius: 0;
   }
   .right .mask 
   {
      border-bottom-right-radius: 0;
      border-top-right-radius: 0;
      left: -100%;
      transform-origin: 100% 50% 0;
      animation-name:rotate2;
      animation-delay: 1.5s;
   }
   @keyframes rotate1
   {
      0%  { transform:rotate(0deg);}
      25% { transform:rotate(0deg);}
      50% { transform:rotate(180deg);}
      75% { transform:rotate(180deg);}
      100%{ transform:rotate(360deg);}
   }
   @keyframes rotate2
   {
      0%  { transform:rotate(0deg);}
      25% { transform:rotate(180deg);}
      50% { transform:rotate(180deg);}
      75% { transform:rotate(360deg);}
      100%{ transform:rotate(360deg);}
   }
</style>
</head>
<body>
<div  class="container">
  <span class="loader">
    <span class="left"><span class="mask"></span></span>
    <span class="right"><span class="mask"></span></span>
  </span>
</div>    
</body>
</html>

View Code

      在瀏覽器中打開包含這段HTML代碼的html文件,可以呈現出如圖11所示的Loading動畫效果。

      若將上面代碼中.right .mask定義里的animation-name:rotate2;animation-delay: 1.5s;語句刪除,這時圓環左右兩邊的動畫過程相同,且右邊也沒有延時,呈現出如圖13所示的Loading動畫效果。

 

圖13  Loading動畫效果(8)

      若只將上面HTML文件中.loader:after的樣式定義全刪除(這樣圖形就變成一個實心圓,不再是一個圓環),其餘部分保持不變,則呈現出如圖14所示的Loading動畫效果。

 

圖14  Loading動畫效果(9)

      若將上面HTML文件中.loader:after的樣式定義全刪除後,再刪除right .mask定義里的animation-name:rotate2;animation-delay: 1.5s;語句,其餘部分保持不變,則呈現出如圖15所示的Loading動畫效果。

 

圖15  Loading動畫效果(10)