零.序言
前兩天在逛 blog 的時候看見一些內聯樣式新奇的寫法時很納悶,雖然說不上多么熟練,但是從來沒見過 --color: brown 這樣的寫法,百度一番之后仍然沒啥頭緒,今天偶然看到一篇文章之后才知道這是 css 變量,不禁感嘆自從 V8 引擎之后花樣越來越多。經過翻查總結(也沒啥總結的,翻過文檔之后挺簡單的),記錄如下:
一、基本用法
變量聲明:
變量聲明的時候,變量名之前加上兩根連詞線(--)即可。例如:
body { --foo: #7F583F; --bar: #F7EFD2; }
大小寫敏感、變量名等這些參考 js 變量名規則肯定不會錯,而變量名中存儲的值的書寫規則仍然采用 css 的規則,如: --x: 20px 30px 而不是 --x: '20px 30px' 。
變量使用:var() 函數
var() 函數是用來讀取變量,如下例:
a { --foo:#f1f2f5; --bar: red; color: var(--foo); text-decoration-color: var(--bar); }
var() 函數有第二個參數,表示變量的默認值,如果該變量不存在(第一個參數),那么就使用這個默認值。並且,第一個參數后面的全部算第二個參數,不管有多少個逗號,比如:
var(--font-stack, "Roboto", "Helvetica"); var(--pad, 10px 15px 20px);
另外, var() 函數也可作為其他變量的值,但也僅作為其他變量的值使用:
:root { --primary-color: red; --logo-text: var(--primary-color); /* 無效 */ var(--primary-color): green; }
作用域:
同一個 CSS 變量,可以在多個選擇器內聲明。讀取的時候,優先級最高的聲明生效。這與 CSS 的”層疊”(cascade)規則是一致的。
<style> :root { --color: blue; } // 這個選擇器等價於 html {} div { --color: green; } #alert { --color: red; } * { color: var(--color); } </style> <p>猜我的顏色是什么</p> // blue <div>猜我的顏色是什么</div> // green <div id="alert">猜我的顏色是什么</div> // red
二、能幫助我們干什么?
我個人的感覺就像是一個先行性方案,潛力很大,能用的地方很多,輪子慢慢造,目前我碰到的用處有:
- 方便維護;(這樣說感覺很籠統)
- 響應式布局;(稍微減少了點代碼量)
- 配合 calc() 函數,完成計算;
- ...
三、js 的支持
js 中對於 css 的變量操作如下:
// 設置變量 document.body.style.setProperty('--primary', '#7F583F’); // 讀取變量 document.body.style.getPropertyValue('--primary').trim(); // '#7F583F' // 刪除變量 document.body.style.removeProperty('--primary');
如下例:
const docStyle = document.documentElement.style; document.addEventListener('mousemove', (e) => { docStyle.setProperty('--mouse-x', e.clientX); docStyle.setProperty('--mouse-y', e.clientY); });
四、其他
css 變量提供了 css 與 js 通信的一個新的渠道,自由性相應變廣了。
只是就目前來講,我們需要注意各大瀏覽器的兼容性,攤手。