引人矚目的 CSS 變數(CSS Variable)

来源:http://www.cnblogs.com/coco1s/archive/2016/11/16/6068522.html
-Advertisement-
Play Games

這是一個令人激動的革新。 CSS 變數,顧名思義,也就是由網頁的作者或用戶定義的實體,用來指定文檔中的特定變數。 更準確的說法,應該稱之為 CSS 自定義屬性 ,不過下文為了好理解都稱之為 CSS 變數。 一直以來我們都知道,CSS 中是沒有變數而言的,要使用 CSS 變數,只能藉助 SASS 或者 ...


這是一個令人激動的革新。

CSS 變數,顧名思義,也就是由網頁的作者或用戶定義的實體,用來指定文檔中的特定變數。

更準確的說法,應該稱之為 CSS 自定義屬性 ,不過下文為了好理解都稱之為 CSS 變數。

一直以來我們都知道,CSS 中是沒有變數而言的,要使用 CSS 變數,只能藉助 SASS 或者 LESS 這類預編譯器。

但是新的草案發佈之後,直接在 CSS 中定義和使用變數已經不再是幻想了,像下麵這樣,看個簡單的例子:

// 聲明一個變數:
:root{
  --bgColor:#000;
}

這裡我們藉助了上篇文章 結構性偽類 中的 :root{ } 偽類,在全局 :root{ } 偽類中定義了一個 CSS 變數,取名為 --bgColor 。

定義完了之後則是使用,假設我要設置一個 div 的背景色為黑色:

.main{
  background:var(--bgColor);
}

這裡,我們在需要使用之前定義變數的地方,通過 var(定義的變數名) 來調用。

Demo戳我 -- CSS 變數簡單示例

 

CSS 變數的層疊與作用域

CSS 變數是支持繼承的,不過這裡說成級聯或者層疊應該更貼切。

在 CSS 中,一個元素的實際屬性是由其自身屬性以及其祖先元素的屬性層疊得到的,CSS 變數也支持層疊的特性,當一個屬性沒有在當前元素定義,則會轉而使用其祖先元素的屬性。在當前元素定義的屬性,將會覆蓋祖先元素的同名屬性。

其實也就是作用域,通俗一點就是局部變數會在作用範圍內覆蓋全局變數。

:root{
  --mainColor:red;
}

div{
  --mainColor:blue;
  color:var(--mainColor);
}

上面示例中最終生效的變數是 --mainColor:blue

另外值得註意的是 CSS 變數並不支持 !important 聲明。

 

CSS 變數的組合

CSS 變數也可以進行組合使用。看看下麵的例子:

<div></div>

CSS 如下:

:root{
  --word:"this";
  --word-second:"is";
  --word-third:"CSS Variable";
}

div::before{
  content:var(--word)' 'var(--word-second)' 'var(--word-third);
}

上面 div 的內容將會顯示為this is CSS Variable。

Demo戳我 -- CSS變數的組合使用

 

CSS 變數與計算屬性 calc( )

更有趣的是,CSS 變數可以結合 CSS3 新增的函數 calc( ) 一起使用,考慮下麵這個例子:

<div> CSS Varialbe </div>

CSS 如下:

:root{
  --margin: 10px;
}

div{
  text-indent: calc(var(--margin)*10)
}

上面的例子,CSS 變數配合 calc 函數,得到的最終結果是 text-indent:100px 。

calc( )也是一個處於實驗中的功能,使用需要慎重。

Demo戳我 -- CSS 變數與 Calc 函數的組合

 

CSS 變數的用途

CSS 變數的出現,到底解決了我們哪些實際生產中的問題?列舉一些:

1、代碼更加符合 DRY(Don‘t repeat yourself)原則。

一個頁面的配色,通常有幾種主要顏色,同一個顏色值在多個地方用到。之前的 LESS、SASS預處理器的變數系統就是完成這個的,現在 CSS 變數也能輕鬆做到。

:root{
  --mainColor:#fc0;
}
// 多個需要使用到的 --mainColor 的地方
.div1{
  color:var(--mainColor);
}
.div2{
  color:var(--mainColor);
}

2、精簡代碼,減少冗餘,響應式媒體查詢的好幫手

一般而言,使用媒體查詢的時候,我們需要將要響應式改變的屬性全部重新羅列一遍。

.main {
	width: 1000px;
	margin-left: 100px;
}
@media screen and (min-width:1480px) {
	.main {
		width: 800px;
		margin-left: 50px;
	}
}

即便是 LESS 和 SASS 也無法做到更加簡便,不過 CSS 變數的出現讓媒體查詢更加的簡單:

:root { 
  --mainWidth:1000px;
  --leftMargin:100px;
}

.main {
  width: var(--mainWidth);
  margin-left: var(--leftMargin);
}

@media screen and (min-width:1480px) {
	:root { 
	  --mainWidth:800px;
	  --leftMargin:50px;
	}
}

看上好像是代碼多了,多了一層定義的環節,只是我這裡示例的 CSS 改變的樣式屬性較少,當媒體查詢的數量達到一定程度,使用 CSS 變數從代碼量及美觀程度而言都是更好的選擇。

3、方便的從 JS 中讀/寫,統一修改

CSS 變數也是可以和 JS 互相交互。

:root{
  --testMargin:75px;
}
//  讀取
var root = getComputedStyle(document.documentElement);
var cssVariable = root.getPropertyValue('--testMargin').trim();

console.log(cssVariable); // '75px'

// 寫入
document.documentElement.style.setProperty('--testMargin', '100px');

 

與傳統 LESS 、SASS 等預處理器變數比較

相較於傳統的 LESS 、SASS 等預處理器變數,CSS 變數的優點在於:

  1. CSS 變數的動態性,能在頁面運行時更改,而傳統預處理器變數編譯後無法更改

  2. CSS 變數能夠繼承,能夠組合使用,具有作用域

  3. 配合 Javascript 使用,可以方便的從 JS 中讀/寫

 

Can I Use?

當然,上述示例正常顯示的前提是你使用的瀏覽器已經支持了 CSS 變數:

當你看到這篇文章的時候,可能已經有了改觀,可以戳進去看看 CANIUSE 。

參考文獻:

MDN--使用CSS變數

Why I'm Excited About Native CSS Variables

 

本文收錄在我的 CSS系列文章 ,感興趣的可以戳進去看看。

到此本文結束,如果還有什麼疑問或者建議,可以多多交流,原創文章,文筆有限,才疏學淺,文中若有不正之處,萬望告知。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 轉自:http://blog.sina.com.cn/s/blog_6d63cf160102vbsg.html 只需要加入 ...
  • 只需在jquery.validate.js 文件中在446行附近找到return $([]).add(this.currentForm.elements).filter(":input")更換成 ...
  • 1、實現方法 2、註意的問題 1、實現方法 利用css分欄,一個整體的div id為wrap ,包含三個div,分別代表左欄(wrap-1)、中欄(wrap-m)、右欄(wrap-r) 通過float屬性使wrap-1 位於左邊,wrap-r位於右邊,再通過margin屬性進一步完善邊框的距離,添加 ...
  • 微信 小程式 drawImage wx.canvasToTempFilePath wx.saveFile 獲取設備寬高 尺寸問題 ...
  • JS中的事件處理(事件綁定)就是讓某種或某些事件觸發某些活動。有兩種常見的形式,分別是DOM Level 0 和DOM Level 2。這兩種方式最大的區別就在於DOM 0級事件處理只能用於事件冒泡,而DOM 2級事件處理卻可以通過設置第三個參數來分別支持事件冒泡和事件捕獲。 DOM 0級事件處理一 ...
  • value 屬性為 input 元素設定值。 對於不同的輸入類型,value 屬性的用法也不同: type="button", "reset", "submit" - 定義按鈕上的顯示的文本 type="text", "password", "hidden" - 定義輸入欄位的初始值 type="c ...
  • 一、篩選沒有選中的覆選框:not("input:checked") 二、匹配有VARCHAR的字元串:".*VARCHAR.*?" 三、json取值的兩種方法 一個對象,有兩種取裡面值的方法,拿裡面的KEY做例子 第一種:data.KEY 第二種:data['KEY'] 相信我,瞭解這兩種方法絕對比 ...
  • 1. 可以說幾乎每個做過Web開發的人都問過,到底元素的ID和Name有什麼區別阿?為什麼有了ID還要有Name呢?! 而同樣我們也可以得到最classical的答案:ID就像是一個人的身份證號碼,而Name就像是他的名字,ID顯然是唯一的,而Name是可以重覆的。 上周我也遇到了ID和Name的問 ...
一周排行
    -Advertisement-
    Play Games
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...