CSS Variable Study

CSS變量能幫助我們干什么

在一些命令式編程語言中,像Java薇搁、C++亦或是JavaScript,通過變量我們能夠跟蹤某些狀態(tài)屡拨。變量是一種符號只酥,關(guān)聯(lián)著一個特定的值,變量的值能隨著時間的推移而改變呀狼。
在像CSS這種聲明式語言中裂允,隨著時間而改變的值并不存在,也就沒有所謂變量的概念了哥艇。
CSS 引入了一種層級變量的概念绝编,從而能夠從容應(yīng)對可維護(hù)性的挑戰(zhàn)。這就會使得在整個 CSS tree 中都可以象征性的引用一個變量

一貌踏、什么是CSS變量

CSS 變量當(dāng)前有兩種形式:

變量十饥,就是擁有合法標(biāo)識符和合法的值∽嫒椋可以被使用在任意的地方逗堵。可以使用var()函數(shù)使用變量眷昆。例如:var(--example-variable)會返回--example-variable所對應(yīng)的值
自定義屬性蜒秤。這些屬性使用--where的特殊格式作為名字。例如--example-variable: 20px;即使一個css聲明語句亚斋。意思是將20px賦值給--example-varibale變量

二作媚、變量的聲明

變量的命名

變量聲明使用兩根連詞線--表示變量,$color是屬于Sass的語法帅刊,@color是屬于Less的語法纸泡,為避免沖突css原生變量使用--)

注意: 變量名大小寫敏感,--header-color--Header-Color是兩個不同變量

聲明方式

CSS變量聲明的方式非常簡單赖瞒,如下女揭,聲明了一個名叫color的CSS變量蚤假。

  • 在css文件中寫
  • 寫在html標(biāo)簽的inline-style里
  • 用JS給某個元素聲明,方法.style.setProperty
body{
  --color: red;
}
<body style="--color: red;"></body>
document.getElementsByTagName('body')[0].style.setProperty('--color', 'red')
變量值的類型

如果變量值是一個字符串田绑,可以與其他字符串拼接

--bar: 'hello';
--foo: var(--bar)' world';


body:after {
  content: '--screen-category : 'var(--screen-category);
}

如果變量值是數(shù)值勤哗,不能與數(shù)值單位直接連用,必須使用calc()函數(shù),將它們連接

.foo {
  --gap: 20;
  /* 無效 */
  margin-top: var(--gap)px;
}

.foo {
  --gap: 20;
  margin-top: calc(var(--gap) * 1px);
}

如果變量值帶有單位掩驱,就不能寫成字符串


/* 無效 */
.foo {
  --foo: '20px';
  font-size: var(--foo);
}

/* 有效 */
.foo {
  --foo: 20px;
  font-size: var(--foo);

注意: 變量值只能用作屬性值,不能用作屬性名

.foo {
  --side: margin-top;
  /* 無效 */
  var(--side): 20px;
}

上面代碼中冬竟,變量--side用作屬性名欧穴,這是無效的

三、CSS變量的繼承&作用域

自定義屬性同樣支持繼承泵殴。一個元素上沒有定義自定義屬性涮帘,該自定義屬性的值會繼承其父元素

class="one">
  <div class="two">
    <div class="three">
    </div>
    <div class="four">
    </div>
  <div>
</div>

定義下面的CSS:

.two { --test: 10px; }
.three { --test: 2em; }

在這個例子中,var(--test)的結(jié)果是:

  • class="two" 對應(yīng)的節(jié)點: 10px
  • class="three" 對應(yīng)的節(jié)點: element: 2em
  • class="four" 對應(yīng)的節(jié)點: 10px (inherited from its parent)
  • class="one" 對應(yīng)的節(jié)點: 無效值, 即此屬性值為未被自定義css變量覆蓋的默認(rèn)值

最頂層的作用域就是:root

四笑诅、響應(yīng)式

div {
  --color: #7F583F;
  --bg: #F7EFD2;
}

.mediabox {
  color: var(--color);
  background: var(--bg);
}

@media screen and (min-width: 768px) {
  body {
    --color:  #F7EFD2;
    --bg: #7F583F;
  }
}

五调缨、與預(yù)處理器的不同

1、預(yù)處理器變量不是實時的

$color:#7F583F;

@media screen and (min-width: 768px) {
    $color: #F7EFD2;
}

.mediabox {
    background: $color;
}

編譯結(jié)果

.mediabox {
  background: #7F583F; 
}

2吆你、預(yù)處理器不能限定作用域

$zcolor:blue;
.ulbox {
    $zcolor:red;
}
ul{
    color: $zcolor;
}

編譯為

ul {
  color: blue; 
}

3弦叶、預(yù)處理器變量不可互操作

原生的CSS自定義屬性可以與任何CSS預(yù)處理器或純CSS文件一起使用

六、JS操作變量

CSS 變量可以和 JS 互相交互

:root{
  --testMargin:70px;
}
//  讀取
var root = getComputedStyle(document.documentElement);
var cssVariable1 = root.getPropertyValue('--testMargin').trim();
console.log(cssVariable1); // '70px'
 
// 寫入
document.documentElement.style.setProperty('--testMargin', '100px');
var cssVariable2 = root.getPropertyValue('--testMargin').trim();
console.log(cssVariable2);  // '100px'

// 刪除
document.documentElement.style.removeProperty('--testMargin');
var cssVariable3 = root.getPropertyValue('--testMargin').trim();
console.log(cssVariable3); // '70px'

七妇多、兼容性

檢測瀏覽器是否支持CSS自定義屬性的方法

/*css*/

@supports ( (--a: 0)) {
    /* supported */
}

@supports ( not (--a: 0)) {
    /* not supported */
}
// Js

if (window.CSS && window.CSS.supports && window.CSS.supports('--a', 0)) {
    alert('CSS properties are supported');
} else {
    alert('CSS properties are NOT supported');
}

https://caniuse.com/#search=css%20var

總結(jié)

相較于傳統(tǒng)的 LESS 伤哺、SASS 等預(yù)處理器變量,CSS 變量的優(yōu)點在于:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市械巡,隨后出現(xiàn)的幾起案子刹淌,更是在濱河造成了極大的恐慌,老刑警劉巖坟比,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件芦鳍,死亡現(xiàn)場離奇詭異,居然都是意外死亡葛账,警方通過查閱死者的電腦和手機(jī)柠衅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來籍琳,“玉大人菲宴,你說我怎么就攤上這事贷祈。” “怎么了喝峦?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵势誊,是天一觀的道長。 經(jīng)常有香客問我谣蠢,道長粟耻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任眉踱,我火速辦了婚禮挤忙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘谈喳。我一直安慰自己册烈,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布婿禽。 她就那樣靜靜地躺著赏僧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪扭倾。 梳的紋絲不亂的頭發(fā)上淀零,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天,我揣著相機(jī)與錄音吆录,去河邊找鬼窑滞。 笑死,一個胖子當(dāng)著我的面吹牛恢筝,可吹牛的內(nèi)容都是我干的哀卫。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼撬槽,長吁一口氣:“原來是場噩夢啊……” “哼此改!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起侄柔,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤共啃,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后暂题,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體移剪,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年薪者,在試婚紗的時候發(fā)現(xiàn)自己被綠了纵苛。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖攻人,靈堂內(nèi)的尸體忽然破棺而出取试,到底是詐尸還是另有隱情,我是刑警寧澤怀吻,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布瞬浓,位于F島的核電站,受9級特大地震影響蓬坡,放射性物質(zhì)發(fā)生泄漏猿棉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一屑咳、第九天 我趴在偏房一處隱蔽的房頂上張望铺根。 院中可真熱鬧,春花似錦乔宿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至臣缀,卻和暖如春坝橡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背精置。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工计寇, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人脂倦。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓番宁,卻偏偏與公主長得像,于是被迫代替她去往敵國和親赖阻。 傳聞我的和親對象是個殘疾皇子蝶押,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容