1. 程式人生 > >CSS動畫例項:旋轉的圓角正方形

CSS動畫例項:旋轉的圓角正方形

      在頁面中放置一個類名為container的層作為效果呈現容器,在該層中再定義十個名為shape的層層巢狀的子層,HTML程式碼描述如下:

<div class="container">

  <div class="shape"><div class="shape"><div class="shape"><div class="shape">

  <div class="shape"><div class="shape"><div class="shape"><div class="shape">

     <div class="shape">

        <div class="shape">

        </div>

     </div>

  </div></div></div></div>

  </div></div></div></div>

</div>

分別為container和shape定義CSS樣式規則如下:

  .container

  {

     margin: 0 auto;

     width: 650px;

     height: 650px;

     position: relative;

     overflow: hidden;

     border: 4px solid rgba(255, 0, 0, 0.9);

     display: flex;

     padding: 0;

     flex: 1;

     align-items: center;

     justify-content: center;

   }

   .shape

   {

      background: radial-gradient(circle, #000, transparent) #f00;

      border: 1px solid;

      box-sizing: border-box;

      border-radius: 5%;

      padding: 20px;

   }

      在CSS樣式的作用下,這11個層在瀏覽器中顯示如圖1所示。10個層層巢狀的子層顯示為10個圓角正方形。

圖1  10個圓角正方形

現在讓這10個圓角正方形旋轉起來,編寫關鍵幀定義為:

   @keyframes turn

   {

      0%   {  transform: rotate(0deg); }

      100% {  transform: rotate(360deg); }

   }

      然後在.shape樣式定義中加上一句“animation: turn 30s infinite linear;”,此時,10個圓角正方形會旋轉起來,如圖2所示。

 

圖2  旋轉的紅色圓角正方形

      圖2中旋轉的10個正方形的背景色全部為紅色,我們想讓顏色進行些變化,在編寫一個名為rainbow(彩虹)的顏色變化的關鍵字定義如下:

   @keyframes rainbow

   {

      0%,100% { color: #f00; }

      16.667% { color: #ff0; }

      33.333% { color: #0f0; }

      50.000% { color: #0ff; }

      66.667% { color: #00f; }

      83.333% { color: #f0f; }

   }

再修改shape的樣式規則定義為:

   .shape

   {

      background: radial-gradient(circle, #000, transparent)  currentcolor;

      border: 1px solid;

      box-sizing: border-box;

      border-radius: 5%;

      padding: 20px;

      animation: turn 10s infinite linear,rainbow 10s infinite linear;

   }

      其中修改了兩處:一處是將背景顏色由紅色(#f00)改成當前色(currentcolor),另一處是在動畫屬性animation中加入了顏色變化的動畫定義。

       此時,在瀏覽器中呈現出如圖3所示的效果。

 

圖3  旋轉的變色圓角正方形

      圖3中旋轉過程中正方形雖然會改變顏色,但10個正方形的顏色仍然一樣。為了讓各個正方形顏色不同,可以為每個層定義一個變數—n,然後為顏色變化的動畫加上屬性animation-delay,它的屬性值根據變數—n進行計算。

      完整的HTML檔案內容如下。

<!DOCTYPE html>
<html>
<head>
<title>旋轉的正方形</title>
<style>
  .container
  {
     margin: 0 auto;
     width: 600px;
     height: 600px;
     position: relative;
     overflow: hidden;
     border: 4px solid rgba(255, 0, 0, 0.9);
     display: flex;
     padding: 0;
     flex: 1;
     align-items: center;
     justify-content: center;
   } 
   .shape 
   {
      background: radial-gradient(circle, #000, transparent)  currentcolor;
      border: 1px solid;
      box-sizing: border-box;
      border-radius: 5%;
      padding: 20px;
      animation: turn 30s infinite linear,
                 rainbow 30s infinite linear
           calc(30 * (10 * (10 - var(--n)) * 0.01) * -1s);
   }
   @keyframes turn 
   {
      0%   {  transform: rotate(0deg); }
      100% {  transform: rotate(360deg); }
   }
   @keyframes rainbow 
   {
      0%,100% { color: #f00; }
      16.667% { color: #ff0; }
      33.333% { color: #0f0; }
      50.000% { color: #0ff; }
      66.667% { color: #00f; }
      83.333% { color: #f0f; }
   }
</style>
</head>
<body>
<div class="container">
  <div class="shape" style="--n: 10;"><div class="shape" style="--n: 9;">
  <div class="shape" style="--n: 8;"><div class="shape" style="--n: 7;">
  <div class="shape" style="--n: 6;"><div class="shape" style="--n: 5;">
  <div class="shape" style="--n: 4;"><div class="shape" style="--n: 3;">
     <div class="shape" style="--n: 2;">
        <div class="shape" style="--n: 1;">
        </div>
     </div>
  </div></div></div></div>
  </div></div></div></div>
</div>
</body>
</html>
View Code

      在瀏覽器中開啟包含這段HTML程式碼的html檔案,可以呈現如圖4所示的旋轉效果。

 

圖4  旋轉的彩色正方形

      我們也可以採用如下的方法實現旋轉的圓角正方形。

      在頁面中放置一個類名為container的層作為效果呈現容器,在該層中再定義18個名為shape的子層,為每個子層設定三個變數:表示該子層縮放比例的變數—scale,表示該子層初始旋轉角度的變數—rotation和表示該子層背景色的變數—color。HTML程式碼描述如下:

<div class="container">

    <div class="shape" style="--scale: 0.840;--rotation: 180deg;--color:#f00"></div>

    <div class="shape" style="--scale: 0.720;--rotation: 360deg;--color:#f36"></div>

    <div class="shape" style="--scale: 0.605;--rotation: 540deg;--color:#f69"></div>

    <div class="shape" style="--scale: 0.518;--rotation: 720deg;--color:#f9c"></div>

    <div class="shape" style="--scale: 0.435;--rotation: 900deg;--color:#900"></div>

    <div class="shape" style="--scale: 0.373;--rotation: 1080deg;--color:#936"></div>

    <div class="shape" style="--scale: 0.314;--rotation: 1260deg;--color:#969"></div>

    <div class="shape" style="--scale: 0.269;--rotation: 1440deg;--color:#993"></div>

    <div class="shape" style="--scale: 0.226;--rotation: 1620deg;--color:#9c0"></div>

    <div class="shape" style="--scale: 0.193;--rotation: 1800deg;--color:#909"></div>

    <div class="shape" style="--scale: 0.163;--rotation: 1980deg;--color:#f06"></div>

    <div class="shape" style="--scale: 0.139;--rotation: 2160deg;--color:#a9a9a9"></div>

    <div class="shape" style="--scale: 0.117;--rotation: 2340deg;--color:#bdb76b"></div>

    <div class="shape" style="--scale: 0.100;--rotation: 2520deg;--color:#556b2f"></div>

    <div class="shape" style="--scale: 0.084;--rotation: 2700deg;--color:#ff8c00"></div>

    <div class="shape" style="--scale: 0.072;--rotation: 2880deg;--color:#e9967a"></div>

    <div class="shape" style="--scale: 0.061;--rotation: 3060deg;--color:#8fbc8f></div>

    <div class="shape" style="--scale: 0.052;--rotation: 3240deg;--color:#2f4f4f"></div>

</div>

      分別為container和shape定義CSS樣式規則,並定義動畫關鍵幀。

      完整的HTML程式碼如下。

<!DOCTYPE html>
<html>
<head>
<title>旋轉的圓角正方形</title>
<style>
  .container
  {
     margin: 0 auto;
     width: 500px;
     height: 500px;
     position: relative;
     overflow: hidden;
     border: 4px solid rgba(255, 0, 0, 0.9);
     display: flex;
     padding: 0;
     flex: 1;
     align-items: center;
     justify-content: center;
     background:#d8d8d8;
     border-radius: 10%;
   } 
   .shape
   {
     position: absolute;
     width: 80%;
     height: 80%;
     top: 50%;
     left: 50%;
     opacity: 0.6;
     border-radius:10%;
     animation: rotate 5s alternate infinite ease-in-out;
   }
   .shape:nth-child(1n+0) 
   {
      background: var(--color);
   }
   @keyframes rotate 
   {
       from { transform: translate(-50%, -50%) rotate(var(--rotation)) scale(var(--scale)); }
       to   { transform: translate(-50%, -50%) rotate(90deg) scale(var(--scale));  }
   }
</style>
</head>
<body>
<div class="container"> 
    <div class="shape" style="--scale: 0.840;--rotation: 180deg;--color:#f00"></div>
    <div class="shape" style="--scale: 0.720;--rotation: 360deg;--color:#f36"></div>
    <div class="shape" style="--scale: 0.605;--rotation: 540deg;--color:#f69"></div>
    <div class="shape" style="--scale: 0.518;--rotation: 720deg;--color:#f9c"></div>
    <div class="shape" style="--scale: 0.435;--rotation: 900deg;--color:#900"></div>
    <div class="shape" style="--scale: 0.373;--rotation: 1080deg;--color:#936"></div>
    <div class="shape" style="--scale: 0.314;--rotation: 1260deg;--color:#969"></div>
    <div class="shape" style="--scale: 0.269;--rotation: 1440deg;--color:#993"></div>
    <div class="shape" style="--scale: 0.226;--rotation: 1620deg;--color:#9c0"></div>
    <div class="shape" style="--scale: 0.193;--rotation: 1800deg;--color:#909"></div>
    <div class="shape" style="--scale: 0.163;--rotation: 1980deg;--color:#f06"></div>
    <div class="shape" style="--scale: 0.139;--rotation: 2160deg;--color:#a9a9a9"></div>
    <div class="shape" style="--scale: 0.117;--rotation: 2340deg;--color:#bdb76b"></div>
    <div class="shape" style="--scale: 0.100;--rotation: 2520deg;--color:#556b2f"></div>
    <div class="shape" style="--scale: 0.084;--rotation: 2700deg;--color:#ff8c00"></div>
    <div class="shape" style="--scale: 0.072;--rotation: 2880deg;--color:#e9967a"></div>
    <div class="shape" style="--scale: 0.061;--rotation: 3060deg;--color:#8fbc8f></div>
    <div class="shape" style="--scale: 0.052;--rotation: 3240deg;--color:#2f4f4f"></div>
</div>
</body>
</html>
View Code

      在瀏覽器中開啟包含這段HTML程式碼的html檔案,可以呈現如圖5所示的旋轉效果。

 

圖5  旋轉的圓角正