首頁 > web前端 > css教學 > CSS/CSS3中的原生變數var介紹

CSS/CSS3中的原生變數var介紹

一个新手
發布: 2017-10-26 09:33:51
原創
2643 人瀏覽過

使用語法

首先我們先來看一個範例:
html程式碼:


#
<p class="element">这是一段文字</p>
登入後複製

css程式碼:


.element {
  width:200px;
  height:200px;
  --main-bg-color: #000;
  color:#fff;
  background-color: var(--main-bg-color);
}
登入後複製

實現效果:

結果是該DOM元素背景變成了黑色。

CSS中原生的變數定義語法為:--*#,變數使用語法為:# #var(--*),其中*表示我們的變數名稱。關於命名這個東西,各種語言都有些顯示,例如CSS選擇器不能是數字開頭,JS中的變數是不能直接數值的,但是,在CSS變數中,這些限制通通沒有,例如:


:root{
    --main-bg-color: #000;
}.element {
    background-color: var(--main-bg-color);
}
登入後複製

注意:變數名稱不能包含#$,[,^,(,%等字符,普通字元限制在只要是「數字[0-9]」「字母[a-zA-Z] 」「下劃線_」與「短橫線- 」這些組合,但是可以是中文,日文或韓文,例如:


#
.element {
  width:200px;
  height:200px;
  --黑色: #000;
  color:#fff;
  background-color: var(--黑色);
}
登入後複製

css變數完整文法:
CSS變數所使用的完整語法為:var( [, ]? ),以中文表示就是:var( <自訂屬性名> [, <預設值]? )#,也即是如果我們沒有定義變數名稱,那麼就會使用後面的值作為其預設屬性值。不合法會出現什麼結果,看下面例子:


.element {
    background-color: var(--new-bg-color,#EE0000);
}
登入後複製

請問,此時的背景色是? ##A. transparent

B. 20px


#C. #369

  • D. #cd0000

  • 答案是:

  • A. transparent

  • CSS變數中,果實發現變數值是不合法的,例如上面背景色顯然不能是20px,則使用背景色的缺省值,也就是預設值代替,於是,上面CSS等同於:

  • ##
    body {
      --color: 20px;
      background-color: #369;
      background-color: var(--color, #cd0000);
    }
    登入後複製
css變數在js中的應用程式

看如下例子,html程式碼:#

body {
    --color: 20px;
    background-color: #369;
    background-color: transparent;
}
登入後複製
css程式碼:


<p id="jsDom">这是一段文字</p>
登入後複製

js程式碼:

#jsDom {
    --my-varwidth: 200px;
    background-color: #000;
    color:#fff;
    width:var(--my-varwidth);
    height:200px;
}
登入後複製

如果樣式是寫到行間呢?

#
var element = document.getElementById(&#39;jsDom&#39;);var curWidth = getComputedStyle(element).getPropertyValue("--my-varwidth");
console.log(curWidth); //200px//设置过后该DOM元素的宽度变为了300pxelement.style.setProperty("--my-varwidth", &#39;300px&#39;);
登入後複製

js程式碼:


<p id="jsDom" style="--my-varwidth:400px;width:var(--my-varwidth);">这是一段文字</p>
登入後複製

瀏覽器相容

瀏覽器的相容如圖所示:


到目前位置IE11也不支援該css變數。


說到這兒感覺這個css變數也是很強大的,那麼它跟預處理器比較,你覺得哪個比較好?下面講一下預處理器的劣勢。

預處理器劣勢

預處理器變數不是即時的

也許令新手驚訝的是,預處理器限制最常見的情況是Sass無法在媒體查詢中定義變數或使用@extend。

var element = document.getElementById(&#39;jsDom&#39;);var curWidth = element.style.getPropertyValue("--my-varwidth");
console.log(curWidth); //400px
登入後複製

上面程式碼將編譯為:

#
$gutter: 1em;
@media (min-width: 30em) {
     $gutter: 2em; 
} 
 .Container { 
     padding: $gutter; 
 }
登入後複製

上面結果可以看出來,媒體查詢區塊被丟棄,變數賦值被忽略。

由於無法在匹配@media規則的基礎上改變變量,所以唯一的選擇是為每個媒體查詢分配一個唯一的變量,並單獨編寫每個變體。

預處理器變數不能級聯

每當使用變量,作用域的問題就不可避免的出現。這個變數應該設定為全域變數嗎?是否應該限定其範圍為檔案或模組?是否應該限制在塊中?

由於CSS最終目的是為HTML加入樣式,事實證明還有另一種有效的方法給變數限定作用域:DOM元素。但由於預處理器不在瀏覽器中運行並且無法看到標記,它們不能這樣做。

假設有一個網站,面對偏好較大文字的用戶,就向


元素添加類別

user-setting-large-text

。當設定了這個類別時,應應用較大的$font-size變數賦值:

#

$font-size: 1em;
.user-setting-large-text {
    $font-size: 1.5em;
} body { 
    font-size: $font-size; 
}
登入後複製

但同样,就像上面的媒体块示例,Sass完全忽略了该变量的赋值,这意味着这是不可能发生的。编译后的代码如下:


body { 
    font-size: 1em;
}
登入後複製

预处理器变量不继承

虽然继承严格说来是级联的一部分,之所以把它单独分出来讲,是因为多次想调用这个特性却不得。

假设一种情况,要在DOM元素上基于其父元素应用的颜色而设置样式:


.alert {
    background-color: lightyellow;
}.alert.info {
    background-color: lightblue;
}.alert.error {
    background-color: orangered;
}.alert button {
    border-color: darken(background-color, 25%);
}
登入後複製

上面的代码并不是有效的Sass(或CSS),但你应该明白它想达到什么目的。

最后一句声明试图在

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板