CSS 變數教程

阮一峰發表於2017-05-09

今年三月,微軟宣佈 Edge 瀏覽器將支援 CSS 變數。

這個重要的 CSS 新功能,所有主要瀏覽器已經都支援了。本文全面介紹如何使用它,你會發現原生 CSS 從此變得異常強大。

一、變數的宣告

宣告變數的時候,變數名前面要加兩根連詞線(--)。

上面程式碼中,body選擇器裡面宣告瞭兩個變數:--foo--bar

它們與colorfont-size等正式屬性沒有什麼不同,只是沒有預設含義。所以 CSS 變數(CSS variable)又叫做“CSS 自定義屬性”(CSS custom properties)。因為變數與自定義的 CSS 屬性其實是一回事。

你可能會問,為什麼選擇兩根連詞線(--)表示變數?因為$foo被 Sass 用掉了,@foo被 Less 用掉了。為了不產生衝突,官方的 CSS 變數就改用兩根連詞線了。

各種值都可以放入 CSS 變數。

變數名大小寫敏感,--header-color--Header-Color是兩個不同變數。

二、var() 函式

var()函式用於讀取變數。

var()函式還可以使用第二個引數,表示變數的預設值。如果該變數不存在,就會使用這個預設值。

第二個引數不處理內部的逗號或空格,都視作引數的一部分。

var()函式還可以用在變數的宣告。

注意,變數值只能用作屬性值,不能用作屬性名。

上面程式碼中,變數--side用作屬性名,這是無效的。

三、變數值的型別

如果變數值是一個字串,可以與其他字串拼接。

利用這一點,可以 debug(例子)。

如果變數值是數值,不能與數值單位直接連用。

上面程式碼中,數值與單位直接寫在一起,這是無效的。必須使用calc()函式,將它們連線。

如果變數值帶有單位,就不能寫成字串。

四、作用域

同一個 CSS 變數,可以在多個選擇器內宣告。讀取的時候,優先順序最高的宣告生效。這與 CSS 的”層疊”(cascade)規則是一致的。

下面是一個例子

藍色

綠色
紅色

上面程式碼中,三個選擇器都宣告瞭--color變數。不同元素讀取這個變數的時候,會採用優先順序最高的規則,因此三段文字的顏色是不一樣的。

這就是說,變數的作用域就是它所在的選擇器的有效範圍。

上面程式碼中,變數--foo的作用域是body選擇器的生效範圍,--bar的作用域是.content選擇器的生效範圍。

由於這個原因,全域性的變數通常放在根元素:root裡面,確保任何選擇器都可以讀取它們。

五、響應式佈局

CSS 是動態的,頁面的任何變化,都會導致採用的規則變化。

利用這個特點,可以在響應式佈局的media命令裡面宣告變數,使得不同的螢幕寬度有不同的變數值。

六、相容性處理

對於不支援 CSS 變數的瀏覽器,可以採用下面的寫法。

也可以使用@support命令進行檢測。

七、JavaScript 操作

JavaScript 也可以檢測瀏覽器是否支援 CSS 變數。

JavaScript 操作 CSS 變數的寫法如下。

這意味著,JavaScript 可以將任意值存入樣式表。下面是一個監聽事件的例子,事件資訊被存入 CSS 變數。

那些對 CSS 無用的資訊,也可以放入 CSS 變數。

上面程式碼中,--foo的值在 CSS 裡面是無效語句,但是可以被 JavaScript 讀取。這意味著,可以把樣式設定寫在 CSS 變數中,讓 JavaScript 讀取。

所以,CSS 變數提供了 JavaScript 與 CSS 通訊的一種途徑。

八、參考連結

相關文章