搜尋

CSS 變數 ( CSS Variables )

W3C 在 2012 年 已經制定了 CSS 的變數規範,目前幾乎所有瀏覽器都支援 CSS 變數語法,透過變數的應用,CSS 程式碼將會變得更容易閱讀、管理和維護,這篇教學將會深入介紹 CSS 的變數,包含宣告、使用、全域變數、區域變數和行內變數等用法。

快速導覽:

CSS 教學 - CSS 變數  ( CSS  )

宣告變數

CSS 宣告變數的方式如同 CSS 樣式屬性的寫法,但必須遵守下列規則:

  • 「兩個破折號 --開頭,後方連接「變數名稱」。
  • 變數名稱使用「英文字母大小寫、數字、破折號和底線符號」,且開頭需為英文
  • 變數名稱區分大小寫,例如 --apple--Apple 會被視為兩個不同的變數。
  • 變數內容必須放入具有「單位」的數值、文字、色彩代碼

下方的範例將會在 :root 裡定義三個變數:

:root {
  --size-1: 20px;
  --size-2: 30px;
  --size-3: 40px;
}

使用變數

宣告變數後,只在需要變數的樣式屬性裡,使用「var()」函式讀取變數數值,執行後就會自動帶入變數數值。

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

<!-- HTML 程式碼 -->
<h1>oxxo.studio</h1>
<h2>hello world!!</h2>
<h3>good morning!!</h3>

<!-- CSS 程式碼 -->
<style>
  /* 宣告變數 */
  :root {
    --size-1: 20px;
    --size-2: 30px;
    --size-3: 40px;
  }
  /* 使用變數 */
  h1 {font-size: var(--size-1);}
  h2 {font-size: var(--size-2);}
  h3 {font-size: var(--size-3);}
</style>

CSS 教學 - CSS 變數  ( CSS  ) - 宣告與使用

全域變數

「全域變數」表示「所有元素都能使用的變數」,如果要宣告全域變數,通常會將變數寫在 :root 裡,或將變數寫在 htmlbody 元素裡,如此一來網頁中所有元素都可以使用變數,下方的例子執行後,不論 h1、h2 和 h3 位於哪個元素,只要在同一個網頁中,就會套用變數所設定的顏色。

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

<!-- HTML 程式碼 -->
<h1>oxxo.studio</h1>
<div>
  <h2>hello world!!</h2>
</div>
<div>
  <div>
    <h3>good morning!!</h3>
  </div>
</div>

<!-- CSS 程式碼 -->
<style>
  :root {
    --color1: red;
    --color2: green;
    --color3: orange;
  }
  h1 {color: var(--color1);}
  h2 {color: var(--color2);}
  h3 {color: var(--color3);}
</style>

CSS 教學 - CSS 變數  ( CSS  ) - 全域變數

區域變數

「區域變數」表示「某個元素裡才能使用的變數」,由於定義在指定元素內,不屬於這個元素的子元素 ( 兄弟元素或父元素 ) 就無法使用變數,下方的範例執行後,由於 h1 所使用的變數是定義在 div 裡的區域變數,當 h1 沒有被 div 包覆時,就無法讀取變數,只能呈現預設的黑色。

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

<!-- HTML 程式碼 -->
<h1>oxxo.studio</h1>
<div>
  <h2>hello world!!</h2>
</div>
<div>
  <div>
    <h3>good morning!!</h3>
  </div>
</div>

<!-- CSS 程式碼 -->
<style>
  /* 變數只有在 div 裡才有作用 */
  div {
    --color1: red;
    --color2: green;
    --color3: orange;
  }
  h1 {color: var(--color1);}  /* 如果 h1 沒有被 div 包覆,就無法讀取變數數值 */
  h2 {color: var(--color2);}
  h3 {color: var(--color3);}
</style>

CSS 教學 - CSS 變數  ( CSS  ) - 區域變數

如果元素裡定義的變數名稱和父元素裡的變數名稱相同 ( 或和 :root 定義的全域變數名稱相同 ),則會使用「覆寫」的方式取代上一層變數的數值,以下方的程式碼為例,雖然 :root 定義了三個變數,但如果 div 裡也有同樣的變數名稱,則 div 裡的變數內容就會覆寫 :root 的變數內容,最後呈現的顏色就會是 div 裡變數定義的顏色。

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

<!-- HTML 程式碼 -->
<h1>oxxo.studio</h1>
<div>
  <h2>hello world!!</h2>
</div>
<div>
  <div>
    <h3>good morning!!</h3>
  </div>
</div>

<!-- CSS 程式碼 -->
<style>
  /* 全域變數 */
  :root {
    --color1: red;
    --color2: green;
    --color3: orange;
  }
  /* 區域變數如果名稱相同,就會覆寫內容 */
  div {
    --color2: blue;  /* 最後呈現藍色 */
    --color3: green; /* 最後呈現綠色 */
  }
  h1 {color: var(--color1);}
  h2 {color: var(--color2);}
  h3 {color: var(--color3);}
</style>

CSS 教學 - CSS 變數  ( CSS  ) - 區域變數覆寫規則

HTML 行內 CSS 變數

CSS 的變數除了寫在 CSS 的檔案裡,也可以寫在 HTML 標籤行內,寫在行內的變數由於最靠近要套用的元素,所以基本上一定會覆蓋之前的變數,下方的範例執行後,就會按照行內定義的變數內容,將文字都變成綠色。

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

<!-- HTML 程式碼 -->
<h1 style="--color1: green;">oxxo.studio</h1>
<div style="--color2: green;">
  <h2>hello world!!</h2>
</div>
<div style="--color3: green;">
  <div>
    <h3>good morning!!</h3>
  </div>
</div>

<!-- CSS 程式碼 -->
<style>
  /* 雖然定義了全域變數,但因為行內變數最接近套用的元素,所以會以行內變數為主 */
  :root {
    --color1: red;
    --color2: green;
    --color3: orange;
  }
  h1 {color: var(--color1);}
  h2 {color: var(--color2);}
  h3 {color: var(--color3);}
</style>

CSS 教學 - CSS 變數  ( CSS  ) - HTML 行內 CSS 變數

搭配 CSS media Queries

CSS 的變數非常適合搭配 media Queries 來使用,透過 CSS 變數,在不同 media 顯示尺寸之下,一次性的設定各種數值,避免不斷輸入重複的數值,下方的範例執行後,當網頁寬度小於 400px,所有文字都會呈現灰色,當寬度大於 400px,就會以彩色呈現。

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

<!-- HTML 程式碼 -->
<h1>oxxo.studio</h1>
<div>
  <h2>hello world!!</h2>
</div>
<div>
  <div>
    <h3>good morning!!</h3>
  </div>
</div>

<!-- CSS 程式碼 -->
<style>
  :root {
    --color1: red;
    --color2: green;
    --color3: orange;
  }
  @media (max-width:400px){
    :root{
      --color1: gray;
      --color2: gray;
      --color3: gray;
    }
  }
  h1 {color: var(--color1);}
  h2 {color: var(--color2);}
  h3 {color: var(--color3);}
</style>

CSS 教學 - CSS 變數  ( CSS  ) - 搭配 CSS media Queries

搭配 calc() 數學運算函式

CSS 變數也可以和 CSS 的 calc() 函式互相搭配,做出更多不同的變化效果,下面的例子會將三個 div 同時套用同一個 CSS 變數,並運用 calc() 函式計算寬度。

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

<!-- HTML 程式碼 -->
<div class="a">a</div>
<div class="b">b</div>
<div class="c">c</div>

<!-- CSS 程式碼 -->
<style>
  :root{
    --w: 50px;
  }
  div {
    border: 1px solid black;
    margin: 5px;
    height: 50px;
  }
  .a{
    width: calc(50vw + var(--w));
  }
  .b{
    width: calc(30vw + var(--w));
  }
  .c{
    width: calc(20vw + var(--w));
  }
</style>

CSS 教學 - CSS 變數  ( CSS  ) - 搭配 calc() 數學運算函式

使用 JavaScript 操控

如果運用 JavaScript 將寫入元素行內屬性的方法,就能利用行內的 CSS 變數控制樣式,寫入方法有下面幾種:

  • .style.getPropertyValue:讀取某個屬性。
  • .style.setProperty:設定某個屬性。
  • .style.cssText:覆寫整個 style 屬性。
  • .setAttribute:覆寫整個 style 屬性。

舉例來說,假設已經在 :root 設定變數數值,仍然可以使用 JavaScript 在元素裡添加行內變數,下方的範例執行後,h1 和 h2 的顏色最後會被 JavaScript 的行內變數內容所覆寫而呈現灰色。

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

<!-- HTML 程式碼 -->
<h1>oxxo.studio</h1>
<h2>hello world</h2>

<!-- CSS 程式碼 -->
<style>
  :root{
    --h1: red;
    --h2: green;
  }
  h1{
    color: var(--h1);
  }
  h2{
    color: var(--h2);
  }
</style>

<!-- JavaScript 程式碼 -->
<script>
  const h1 = document.querySelector('h1');
  h1.style.setProperty('--h1','#ccc');

  const h2 = document.querySelector('h2');
  h2.style.setProperty('--h2','#ccc');
</script>

CSS 教學 - CSS 變數  ( CSS  ) - 使用 JavaScript 操控

小結

CSS 變數是近年來撰寫 CSS 一定要使用的功能,透過 CSS 變數定義共用的寬度或字體樣式,可以讓整份 CSS 文件更加乾淨清楚且容易管理,趕緊運用 CSS 變數來改善自己的 CSS 吧!

意見回饋

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

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 )