CSS變量試玩兒


CSS很美妙,能夠為您的頁面穿上衣裳,各種各樣五彩斑斕的衣裳,但是對於開發者來說,他又不夠靈動,於是乎有了各種各樣的預處理器Sass、LESS、Stylus(筆者建議Sass的SCSS語法),這些預處理器可以很大程度的提高CSS的靈活性,增強CSS的代碼組織與維護。但是畢竟不是親生的,然后負責CSS開發的那些大牛們坐不住了,開始給CSS賦予一些新的特性,本文就來探討下CSS變量的進展與應用。
W3C的關於CSS變量的最新探索體現在CSS Custom Properties for Cascading Variables Module Level 1中,最新更新在2014年5月6日,目前為工作草案,所以本文章只為研究探索只用,所涉知識點存在修改的風險,W3C修改之后本文會同步更新。

所為何來

我們知道,一個網站或應用往往包含大量的CSS,這些CSS里的一些屬性值往往重復使用,比如網站使用的顏色體系,背景色、文字顏色、鏈接顏色等,這些重復使用的屬性值散落在大量的CSS文檔中,如果需要修改其中的一些值,例如改版顏色,那簡直是個噩夢,我們需要每個文件進行查找、替換,眼花繚亂、機械重復的大量操作難免出錯、難免頭大,所以CSS代碼的組織與維護已經成了困擾CSS使用的重要瓶頸。
當然,CSS預處理可以有效的解決這些問題,預處理器的使用已經成了事實上的行業標准,Sass正成為越來越多前端er的選擇。但是,我們需要部署編譯環境、需要讓開發工具支持Sass等,需要一些額外的工作。遇事不免暢想,如果有一天,我們可以像使用普通CSS那些使用預處理器?
於是便有了W3C的CSS Various。

剝繭抽絲

關於變量,不外乎定義和使用,接下來我們分別解析。

定義變量

我們把需要重復使用的值存放到一個自定義的屬性中,這個自定義的屬性用雙虛線開頭標識,如下面代碼所示。

/* 變量定義 */
:root {
  --main-color: #06c;
}
/* 變量使用 */
#foo h1 {
  color: var(--main-color);
}

變量名

自定義屬性名和變量名遵循CSS標識符的定義規則,可以包含字母數字(a-z,A-Z,0-9)、ISO 10646字符列表的U+00A0及以上字符、下划線(_)、連字符(-)等,不能以數字、連字符+數字、雙連字符開始。
CSS變量語法中,大小寫敏感,可以包含字母、數字、下划線、連字符,且最好不以數字、連字符開頭。

/* 正確的變量名 */
:root{
	--link-color: #06c;
	--_hover-color: #f6c;
	--toolTip_color: #ff0;
	--main_background_color: #333;
}
/* 下面兩個變量都有效,表示兩個變量 */
:element{
	--link-color:#06c;
	--Link-color:#66c;
}

變量值可以接受任何符合語法的值,它的默認值為" ",但是不能為"",否則會報錯。

變量的繼承和覆蓋

變量的聲明和使用遵循CSS的層疊特性,類似於普通編程語言里面的變量作用域。請看下面的代碼。

:root { --color: blue; }
div { --color: green; }
#alert { --color: red; }
* { color: var(--color); }

<p>I inherited blue from the root element!</p>
<div>I got green set directly on me!</div>
<div id='alert'>
  While I got red set directly on me!
  <p>I’m red too, because of inheritance!</p>
</div>

使用變量

我們可以通過var()的方式使用變量,但是不能在屬性名、選擇器中使用變量,只能在屬性值中使用變量,使用變量的語法如下所示。

/* 
 * var()接受兩個參數,自定義屬性名(變量名)、缺省值
 * 第一個參數custom-property-name調用變量
 * 第二參數可選,指定自定義變量無效時的缺省值。
 */
var() = var( <custom-property-name> [, <any-value> ]? )

/* for example */
/* In the component’s style: */
.component .header {
  color: var(--header-color, blue);
}
.component .text {
  color: var(--text-color, black);
}

/* In the larger application’s style: */
.component {
  --text-color: #080;
  /* header-color isn’t set,
     and so remains blue,
     the fallback value */
}

我們可以嵌套調用CSS變量。

/*one example */
:root {
  --main-color: #c06;
  --accent-background: linear-gradient(to top, var(--main-color), white);
}
/*another example */
<one><two><three /></two></one>
one   { --foo: 10px; }
two   { --bar: calc(var(--foo) + 10px); }
three { --foo: calc(var(--bar) + 10px); }

兼容並包

對於前端開發者來說,兼容並包永遠是一個難以企及的痛,作為一個具有“極客思維”的前端er,我們還是要努力。
首先來看看,CSS變量目前的慘不忍睹的兼容性,如下圖所示,數據來自caniuse
這里寫圖片描述
全線飄紅有木有,只有firefox認識,還怎么玩。
有兄弟說,我就要任性,就要玩怎么辦?老外寫了個補丁(polyfill),大家不妨一試。

只求甚解

綜上所述,CSS變量處於草案階段,瀏覽器兼容一般,今天寫這篇文章僅為開闊視野,儲備知識之用。商用還請大家使用Sass或LESS等預處理器。
如欲了解更多詳情,使用下面的列表乃求甚解。


致謝

前端開發whqet,關注前端開發,分享相關資源。csdn專家博客,王海慶希望能對您有所幫助。
本文原文鏈接,http://blog.csdn.net/whqet/article/details/43758285
歡迎大家訪問獨立博客http://whqet.github.io


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM