搜尋

多重動畫的權重與順序

由於 animation 屬於 CSS 樣式屬性,在操作上仍然可能會遇到需要處理「權重」的狀況,這篇教學會介紹處理多重動畫時 animation 權重以及相關的執行順序。

快速導覽:

CSS 教學 - 多重動畫的權重與順序

animation 權重

由於 animation 屬於 CSS 樣式屬性,使用時會影響到元素樣式的「權重」,基本上 animationanimation-* 都會按照 CSS 選擇器的權重規則套用樣式。

延伸閱讀:CSS 選擇器的優先順序 ( 權重 )

但由於 @keyframes 是 CSS 裡的「聲明、定義」語法,如果是寫在 @keyframes 裡的樣式屬性,則會需要額外遵守下列規則:

  • 如果有同樣名字的 @keyframes只會執行「最後一個」 @keyframes
  • @keyframes 裡的樣式屬性等同「inline 行內樣式的權重」的權重 ( 最高 )。
  • @keyframes 裡的樣式屬性不支援 !important
  • @keyframes 裡百分比相同裡的樣式屬性,後方會覆蓋前方樣式*
  • 使用 CSSKeyframesRule 覆寫 @keyframes 內容,避免透過奇怪的行內樣式語法修改。

下方範例出現了兩個名為 oxxo 的 @keyframes,會執行後方的 @keyframes,而 @keyframes 裡同樣是 50% 的關鍵影格,後方的 background 會覆蓋前方的 background

線上展示:https://codepen.io/oxxo/pen/xxvBQLj

<!-- HTML 程式碼-->
<h2>把滑鼠移到我身上</h2>
<div></div>

<!-- CSS 程式碼 -->
<style>
  h2 {
    width: 300px;
    border: 2px solid #000;
  }
  h2:hover~div {
    animation-name: oxxo;
    animation-duration: 2s;
  }
  div {
    width: 50px;
    height: 50px;
    margin: 5px;
    background: red;
  }

  /* 不會執行 */
  @keyframes oxxo{
    50% {
      margin-left: 100px;
      background: cyan;
    }
  }

  /* 執行這個 */
  @keyframes oxxo{
    50% {
      margin-left: 200px;
      background: green;  /* 被後方覆蓋 */
    }
    50% {
      background: yellow;
    }
  }
</style>

CSS 教學 - 多重動畫的權重與順序 - @keyframes 的樣式屬性權重規則

多重動畫執行順序

animation-* 相關樣式屬性具有支援「多重動畫」的功能,只要透過「逗號」分隔每個 @keyframes 名稱或對應的動畫設定,就可以讓元素執行多個動畫的關鍵影格,多重動畫基本上會遵照下方原則進行套用或取代樣式。

  • 如果有「多個」動畫名稱,但其他動畫樣式只有「一個」,則所有的動畫名稱都會套用這個動畫樣式
  • 如果其他動畫樣式數量「少於」動畫名稱數量,就只會套用「第一個」動畫樣式
  • 如果「同樣百分比」裡有「同樣的樣式屬性」,後方的樣式屬性會「取代」前方的樣式屬性

下方範例會讓 div 呈現三組不同的 @keyframes 動畫。

線上展示:https://codepen.io/oxxo/pen/YzmgRxB

<!-- HTML 程式碼-->
<h2>把滑鼠移到我身上</h2>
<div></div>

<!-- CSS 程式碼 -->
<style>
  h2 {
    width: 300px;
    border: 2px solid #000;
  }
  h2:hover~div {
    animation-name: a, b, c;          /* 同時執行 a b c */
    animation-duration: 4s, 2s, 1s;   /* a b c 對應的播放時間 */
  }
  div {
    width: 50px;
    height: 50px;
    margin: 5px;
    background: red;
  }
  @keyframes a {
    50% {background: cyan;}
  }
  @keyframes b {
    50% {margin-left: 100px;}
  }
  @keyframes c {
    50% {
      width: 100px;
      height: 100px;
    }
  }
</style>

CSS 教學 - animation 權重與順序 - 多重動畫

多重動畫如果搭配 animation-delayanimation-fill-mode: forwards,就能實現「一個動畫結束後再播放下一個動畫」的效果,下方範例有五個 @keyframes,運用 animation-delay 讓第二個之後的 @keyframes 都比前一個多延遲一秒,最後就能實現一個接一個的動畫效果。

線上展示:https://codepen.io/oxxo/pen/OJKqaxJ

<!-- HTML 程式碼-->
<h2>把滑鼠移到我身上</h2>
<div></div>

<!-- CSS 程式碼 -->
<style>
  h2 {
    width: 300px;
    border: 2px solid #000;
  }
  h2:hover~div {
    animation-name: a, b, c, d, e;
    animation-duration: 1s;
    animation-delay: 0s, 1s, 2s, 3s, 4s;
    animation-fill-mode: forwards;
  }
  div {
    width: 50px;
    height: 50px;
    margin: 5px;
    background: red;
  }

  @keyframes a{
    100% {background: cyan;}
  }

  @keyframes b{
    100% {margin-left: 100px;}
  }

  @keyframes c{
    100% {width: 100px;}
  }

  @keyframes d{
    100% {height: 100px;}
  }

  @keyframes e{
    100% {
      width: 50px;
      height: 50px;
      margin: 5px;
      background: red;
    }
  }
</style>

CSS 教學 - animation 權重與順序 - 一個動畫結束後再播放下一個動畫

小結

當要操作進階的 animation 時,就少不了要使用多重動畫的技巧,透過這篇教學的介紹,對於多重動畫的順序和權重,應該能有更近一步的認識。

意見回饋

如果有任何建議或問題,可傳送「意見表單」給我,謝謝~

CSS 教學

基本介紹

認識 CSS 開始使用 CSS CSS 語法規則 CSS 命名原則

CSS 選擇器

認識 CSS 選擇器 優先順序 ( 權重 ) 樣式繼承與聯集 元素選擇器 ID 和 Class 選擇器 屬性選擇器 文件結構選擇器 虛擬類別選擇器 ( 結構 ) 虛擬類別選擇器 ( 類型 ) 虛擬類別選擇器 ( 輸入 ) 虛擬類別選擇器 ( 行為 ) 虛擬類別選擇器 ( 超連結 ) 虛擬類別選擇器 ( 邏輯 ) 虛擬類別選擇器 ( 其他 ) 虛擬元素選擇器 群組與組合選擇器

數值與單位

關鍵字與文字數值 長度與角度單位 顏色單位 位置名稱與時間單位

變數與內容函式

變數 數學計算 文字與清單計數 生成內容與引號

顏色與濾鏡

色彩模型 漸層色 影像濾鏡

文字樣式

使用通用字型 使用外部字型 @font-face 定義字型 文字尺寸 常用文字樣式 文字換行 文字空白與 Tab 大小 文字行高與縮排 文字水平與垂直對齊 文字書寫方向 特殊文字樣式

元素容器

容器顯示類型 ( display ) 元素 display 對照表 盒子模型 ( Box Model ) 寬度與高度 內邊距 ( padding ) 外邊界 ( margin ) 邊框 ( border ) 邊框圓角 影像邊框 輪廓 ( outline ) 可見性與透明度 內容溢出與裁切

背景與陰影

背景顏色 背景圖 ( 定位、尺寸 ) 背景圖 ( 固定、重複 ) 背景圖 ( 多重背景、混合 ) 背景縮寫 ( background ) 容器陰影 ( box-shadow )

清單與表格

清單樣式 清單計數器 定義計數規則 表格基本樣式 表格邊框樣式 表格內容寬度與對齊

基本排版與定位

元素排版方式 浮動 ( float ) 浮動形狀 定位 ( position )

Flexbox 彈性排版

Flexbox 彈性盒子 Flexbox 對齊方式 Flexbox 彈性伸縮

Grid 網格排版

Grid 網格容器與格線 Grid 網格空間與命名 Grid 網格流向與間距 Grid 排列網格項目 Grid 項目對齊與順序

轉場與動畫

轉場 ( transition ) 轉場觸發事件 動畫 ( animation ) 動畫觸發事件 多重動畫的權重與順序

變形、裁切與遮罩

裁切路徑 ( clip-path ) 影像遮罩 ( mask ) 物件填滿方式與定位 轉換函式 ( transform ) 3D 轉換與透視