引人矚目的 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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...