必須了解的CSS變量(var)

2018-06-19 18:40 更新
      看到文章標題《必須了解的CSS變量(var)》,你是不是感到很奇怪,CSS居然有變量(var)了?

你沒看錯,CSS真的有變量(var),而且兼容性還不賴:

使用過CSS預處理,比如Less的伙伴們相信對變量并不陌生了,Less是這樣定義變量的:

@blue{

  color: blue;

}


.box{

  color: @blue;

}


而在CSS中,也早就有變量了,就是currentColor,它表示當前的文字顏色:

:root{

  color: red;

}

div{

  color: currentColor;

}

div.blue{

  color: blue;

}


<div class="blue">字體是藍色的</div>

<div>字體是紅色的</div>

從上面的代碼運行結(jié)果來看,如果當前元素設置了文字的顏色(color)時,currentColor指的是當前文字的顏色,否則會繼承其祖先元素中最靠近當前元素的設置了文字顏色的元素的顏色(color)。

閑話聊完了,現(xiàn)在真正進入今天的正題,來看看CSS中如何定義和使用原生變量。

1、定義和使用

1.1 變量定義

CSS中原生變量的定義語法:

--variableName: variableValue;

variableName表示自定義變量名,variableValue表示屬性值。

變量名稱(variable-name)的規(guī)范:
  • 以“--”雙橫杠開頭,后面可以是數(shù)字[0-9]、字母[a-zA-Z]、下劃線_短橫線-這些組合,甚至是中文也行,但不能包含$、[、^、(、%等字符。
  • 大小寫是敏感的
  • 定義只能在聲明塊{}里面

看下面的例子:

:root{

  --1: red; /*有效的*/

  --background-color: blue; /*有效的*/

  --font_size: 20px; /*有效的*/

  --寬度: 100px; /*有效的*/

  --$color: red; /*無效的*/

}

--color: red; /*無效的*/

當然,并不是只能在:root根元素(這里定義的變量是全局的)里定義,你可以在任意的HTML元素里(相當于局部變量,在其他地方不能用)定義:

div{

  --1: purple;

}


需要注意的是,當你定義多個同名的變量時,變量的覆蓋規(guī)則會是由CSS選擇器的權(quán)重來決定的。比如:

:root{ --color: green;}

.box{ --color: yellow;}

#box{ --color: orange;}

 *{ color: var(--color);}


<span>我是綠色,繼承根元素</span>

<div class="box">我是黃色,通過類設置的</div>

<div id="box">

  我是橙色,通過ID設置的(權(quán)重最大)

</div>


1.2 變量使用

相信細心的伙伴們在上面的例子,已經(jīng)發(fā)現(xiàn)變量如何使用。

語法:

cssPropertyName: var(--variableName [, declarationValue]);

var()會返回--variableName的值,declarationValue表示默認值,也就是當--variableName沒有定義的時候,取declarationValue的值。

:root{

  --color-name: 20px;

}

div{

  --color: red;

  color: var(--color);

}

span{

  color: var(--color, yellow);

}

p{

  color: var(--color-name, green);

}


<div>我是紅色,自己設置的</div>

<span>我是黃色的,由于沒發(fā)現(xiàn)變量--color,因此取默認值</span>

<p>我是黑色,并不是綠色</p>

這里需要注意兩點:
  • var()第二個參數(shù)不需要雙引號單引號括起,括起無效(反正我的測試是這樣的)。
  • var()的默認值起作用僅限于變量未定義,像上面例子中,--color-name等于20px,然后賦給color只會失效,而不會取默認值

當然,我們還可以結(jié)合強大的calc()來使用自定義變量:

div{

  --width: 20px;

  width: calc(100% - var(--width));

}

在瀏覽器上,我們還可以實時調(diào)試:



變量之間還可以相互傳遞,也就是相互賦值,類似JavaScript中的變量一樣:

:root{

  --red: red;

  --color: var(--red);

}

div{

  color: var(--color);

}

<div>我是紅色的</div>


使用限制:
  • CSS自定義屬性變量是不能用作CSS屬性名稱的,比如:var(--color): red;
  • 不能用作背景地址,比如:url(var(--url));
  • 由于var()后面會默認跟隨一個空格,因此在其后面加單位是無效的,比如:--size:20; font-size: var(--size)px會解析成font-size: 20 px;

2、檢測瀏覽器是否支持
有兩種方式檢測瀏覽器是否支持自定義屬性

  • 使用@supports方法

@supports ( (--size: 0)) {

  /* 支持 */

}

@supports ( not (--size: 0)) {

 /* 不支持 */

}


  • 使用JavaScript

if(window.CSS && window.CSS.supports && window.CSS.supports('--size', 0)) {

  /* 支持 */

}else{

  /* 不支持 */

}


3、使用JavaScript操作原生屬性變量

我們可以很方便的使用window.getComputedStyle方法來使讀寫自定義屬性變量(對于window.getComputedStyle,在這里就不多講,我默認你已經(jīng)知道了)

獲?。?/div>

var rootStyles = getComputedStyle(document.documentElement);

var value = rootStyles.getPropertyValue('--variableName');


// 獲取某個元素中定義的屬性變量

value = element.style.getPropertyValue('--variableName');

修改:

element.style.setProperty('--variableName', value);

document.documentElement.style.setProperty('--variableName', value);


實例:

div{

  color: var(--color);

}


<div>我是紅色的,由JavaScript設置</div>


<script>

  document.documentElement.style.setProperty('--color', 'red');

</script>


相信通過這篇文章,你會對CSS自定義屬性變量有一定的了解,當然,個人能力有限,如果你有更多的關于CSS var()的文章或看法,歡迎在下方評論告知。


參考文章:



以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號