九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
CSS變量(自定義屬性)實踐指南

Sass和Less這樣的預(yù)處理器,讓我們的CSS代碼保持良好的結(jié)構(gòu)和可維護性。像變量、混合(mixins)、循環(huán)控制等特性,增強了動態(tài)編寫CSS的能力,從而減少重復(fù)代碼,也加快了我們開發(fā)速度。

近年來,一些動態(tài)特性開始作為規(guī)范的一部分,出現(xiàn)在CSS語言中。CSS變量(CSS variables),或者用它的官方稱謂,叫作自定義屬性(custom properties),已經(jīng)可用,并且有非常棒的瀏覽器支持,而CSS mixins也正在取得進展。

在本文,你將學會如何使用CSS變量,并把它集成到你的CSS開發(fā)流程中,讓你的樣式表更好維護,且減少重復(fù)。

讓我們現(xiàn)在就開始吧!

什么是CSS變量?

如果你曾使用過某種編程語言,那么你已經(jīng)很熟悉變量這個概念了。變量用于存儲和更新你的程序所需要的值,以便使它運行。

例如,考慮下面的JavaScript代碼:

let number1 = 2;

let number2 = 3;

let total = number1 + number2;

console.log(total); // 5

number1 = 4;               

total = number1 + number2;

console.log(total); // 7


total
同樣是變量,存儲著number1number2之和。在這里它的值就是5。你可以動態(tài)地修改變量里的值,并在程序中使用它們。在上面的代碼中,我把number1的值更新為4,然后再進行求和。使用相同的變量,這個時候total里存儲的值就是5,而不再是7了。nubmer1
和 number2是兩個變量,分別存儲著數(shù)字2和3。

使用變量的妙處在于,它可以讓你在一個地方存儲值,并且讓你在后面能以各種理由去更新它。

在程序中,你不需要為不同的值再添加額外的字符表示:任何值的更新都發(fā)生在同一個地方。正如,在你定義的變量上

CSS在很大程度上是一種聲明式的語言,而缺少動態(tài)能力。你也許會認為,讓CSS擁有變量,幾乎讓上面的說法自相矛盾。

如果前端開發(fā)僅僅是關(guān)于文字游戲,那可以這么說。幸運的是,Web的編程語言很像生活中的語言,它們會隨著周圍環(huán)境和實踐需要而不斷進化與適應(yīng)。CSS也同樣如此。

簡單的說,變量已經(jīng)成為CSS世界中激動人心的事實,并且你即將親自看到,對于這個厲害的新技術(shù),學習和使用起來都非常直觀。

使用CSS變量有什么好處?

使用CSS變量的好處,跟在其他編程語言中使用變量的好處沒什么大的區(qū)別。

規(guī)范是這樣描述這一點的

使用CSS變量,給看似隨機的值加上富有信息的名字,從而使得大文件更容易閱讀和編輯,更少出錯。因為,你只需要在自定義屬性中改變一次值,所有應(yīng)用了這個變量的地方都會自動跟著一起改變。

W3C 規(guī)范,換句話說,通過給變量起一個對你來說在項目中有意義的名字,你能更容易的管理和維護你的代碼。

例如,當你為項目中的主色調(diào)設(shè)置一個變量名--primary-color,那么你后面再修改這個主色調(diào)時,只需要改動一處,而不需要在不同位置的多個CSS文件中去手動修改多次值。

CSS變量和預(yù)處理器中的變量有什么不同?

你可能已經(jīng)在CSS預(yù)處理器中嘗試過使用變量而帶來的好處了,比如Sass和Less。

預(yù)處理器讓你能設(shè)置變量,以及在函數(shù)、循環(huán)、數(shù)學計算等等地方中使用它們。這是否意味著CSS變量已經(jīng)無關(guān)緊要了呢?

那可未必,主要是因為,CSS變量與預(yù)處理器中的變量其實是不同的東西。

這些不同基于一個事實:CSS變量是瀏覽器中直接可用的CSS屬性,而預(yù)處理中的變量是用于編譯成常規(guī)的CSS代碼,瀏覽器其實對它們一無所知。

這意味著,你可以在樣式表中,在內(nèi)聯(lián)樣式中,在SVG的標簽中直接更新CSS變量,甚至可以在運行時用JavaScript直接修改它。而你是無法對預(yù)處理器中的變量做上面這些操作的。CSS變量開啟了一個充滿可能性的新世界大門。

不是說你必須要在兩者間做出選擇:沒有什么東西限制你,你可以同時使用CSS變量和預(yù)處理變量,并享有它們各自帶來的巨大好處。

CSS變量:語法

雖然本文為了簡潔,我使用了CSS變量(CSS variables)這個稱呼,但官方的規(guī)范把它們稱作作為級聯(lián)變量的CSS自定義屬性(CSS custom properties for cascading variables)。*CSS自定義屬性(CSS custom property)*的部分看起來像這樣:

--my-cool-background#73a4f4;

在自定義屬性前添加雙橫線前綴,然后像給普通CSS設(shè)值一樣,給自定義屬性設(shè)值。在上面的代碼中,我給一個叫做--my-cool-backgroud的自定義屬性設(shè)置了一個顏色值。

而 級聯(lián)變量(cascading variable) 的部分,由通過val()來使用你的自定義屬性組成,開起來像這樣:

var(--my-cool-background);

自定義屬性作用于CSS選擇器中,val()可被當成一個真正的CSS屬性一樣使用。

:root {

    --my-cool-background: #73a4f4;

}

/* CSS文件的其他部分 */

#foo {

    background-color: var(--my-cool-background);

}

上面的代碼片段把--my-cool-background這個自定義屬性的作用域定義在:root這個偽類中,這讓該自定義屬性能被全局訪問到(即在標簽內(nèi)部的任何地方)。

然后,使用val()函數(shù)把ID為foo的容器的background-color設(shè)置為自定義屬性的值,這時該容器就有了淺藍的背景色。

這還沒完。你可以用同樣的淺藍色,給多個HTML標簽的多種可以設(shè)置顏色值的地方設(shè)值,比如設(shè)置它們的color和border-color。

方法很簡單,就是通過var(--my-cool-background)拿到自定義屬性的值,然后給合適的CSS屬性設(shè)置上去。(當然,在事情變得復(fù)雜之前,我建議思考一下你的CSS變量命名規(guī)范):

p {

    color: var(--my-cool-background);

}


你還可以從通過利用CSS變量獲得另一個CSS變量的值。

--top-color: orange;

--bottom-color: yellow;

--my-gradient: linear-gradient(var(--top-color), 

var(--bottom-color));


上面的代碼創(chuàng)建了一個--my-gradient變量,是一個漸變樣式,它的值被設(shè)為--top-color的值和--bottom-color的值組合的結(jié)果?,F(xiàn)在,你可以在任何時候修改你的漸變樣式,僅僅是修改變量的值就可以了,而不再需要在樣式表里滿文件地去找用到這個漸變樣式地方。

最后,你可以在CSS變量中加入一個或多個備用值(fallback value/s),例如:

var(--main-color, #333); 

上面的代碼中,#333是一個備用值。當自定義屬性值無效或未指定(unset)時,如果這時也沒有指定備用值,那么被繼承的(inherited)屬性值將會被使用。

CSS變量是區(qū)分大小寫的

與普通CSS屬性不同,CSS變量是區(qū)分大小寫的。

例如,var(--foo)var(--FOO)是在求兩個不同的自定義屬性值,分別是--foo--FOO的。

CSS變量受級聯(lián)關(guān)系影響

和普通CSS屬性一樣,CSS變量是可繼承的。例如,我們定義了一個屬性,值為blue:  

:root {

    --main-color: blue;

}

當你在另一個元素里,為改自定義屬性設(shè)置了一個新值時,那么所有該元素的子元素都會繼承那個新值。當你給任意在標簽里的元素指定--main-color變量時,它們都會繼承到blue這個值。

:root {

    --main-color: blue;

}

.alert {

    --main-color: red;

}

p {

    color: var(--main-color);

}

<--! html="" --="">

 

   

 

 

   

     

blue 的段落

     

       

red 的段落

     

   

 

在div標簽中擁有.alert類的段落會是紅色,因為它的值繼承自局部作用域里的--main-color。在上面的標簽中,第一個p段落會繼承到全局的--main-color值,它是藍色。

知道目前這些規(guī)則差不多夠了。讓我們開始寫代碼吧!

如何在SVG中使用CSS變量

CSS變量和SVG配合得很好。你可以使用CSS變量去修改SVG中的樣式,以及和呈現(xiàn)相關(guān)的屬性。

舉個例子,假設(shè)你想讓你的SVG圖標能跟隨其所在父容器而擁有不同的顏色。你可以把CSS變量的作用域限定在父容器中,然后給變量設(shè)置想要的顏色,那么里面的圖標就會繼承父容器的顏色值。下面是相關(guān)代碼:

/* inline SVG symbol for the icon */

 

   

stroke='var(--icon-color)' stroke-width='15' />

   

text-anchor='middle' style='font-size:250px;'>x

 

 

/* first instance of the icon */

 

注意到SVG symbol中,circle元素里的stroke屬性和text元素里的fill屬性:它們都使用了CSS變量,這里是--icon-color。它被定義在:rootCSS文件的選擇器中,像這樣:  

上面的代碼使用了標簽,它讓你創(chuàng)建一SVG圖形的不可見的版本。然后再使用標簽生成一個可見的副本。這種方法可以讓你根據(jù)自己的喜好創(chuàng)建任意多個自定義的圖標,也就是通過它的ID(#close-icon)指向那個。

這比一遍又一遍地寫重復(fù)的代碼創(chuàng)建圖形更加簡便。如果你想提高這方便的技術(shù),Massimo Cassandro在他的Build Your Own SVG Icons中提供了一個快速教程。

:root {

    --icon-color: black;

}


這是當前圖標看起來的樣子:

這時,如果你把同樣的SVG圖標放在不同的父容器中,并且在父容器上,給你的CSS變量設(shè)置各自的局部值,那么你就會得到不同顏色的圖標,并且不用給你的樣式表添加多余的規(guī)則。這很酷!

為了展示這一點,我們把同樣的圖標放在一個有.success類的div里:

   

       

   


現(xiàn)在,讓--icon-color變量局部化,即把它放在.success中,并設(shè)置一個green值。我們來看看發(fā)生的變化:

/* css */

.success {

    --icon-color: green;

}


這個圖標的顏色就變成了綠色:  

  

來看看一個完整的示例:

 

 

 

 

 

 

   

     

stroke-width='15' />

     

 style='font-size:250px;'>x

   

 


 

   

Default Icon

   

     

     

   


   

     

Danger Icon

     

       

       

     

   


   

     

Success Icon

     

       

       

     

   


   

     

Alert Icon

     

       

       

     

   


如何在@keyframes中使用CSS變量

CSS變量可以在CSS動畫中使用,即可用于常規(guī)HTML元素,也可以用于內(nèi)聯(lián)的SVG。只需要記得,你得知道讓什么元素動,把它視為目標元素,然后創(chuàng)建對該目標元素的選擇器,在選擇器的作用范圍中定義你的CSS變量,然后,使用val()獲取這些變量,把它們設(shè)置到@keyframes代碼塊中。

例如,讓SVG中.bubble類里面的元素動起來,你的CSS可能會看起來像這樣:

.bubble {

  --direction-y: 30px;

  --transparency: 0;

  animation: bubbling 3s forwards infinite;

}

 

@keyframes bubbling {

  0% {

    transform: translatey(var(--direction-y));

    opacity: var(--transparency);

  }

  40% {

    opacity: calc(var(--transparency) + 0.2);

  }

  70% {

    opacity: calc(var(--transparency) + 0.1);

  }

  100% {

    opacity: var(--transparency);

  }

}


這個例子簡潔的地方在于,利用CSS屬性,你可以簡單的修改相應(yīng)選擇器里變量值而調(diào)整動畫,而不需要挨個去查找@keyframes里的屬性了。注意到這是如何借助CSS的calc(),并用var()函數(shù)進行計算的。它們增強了你代碼的靈活性。

如何通過JavaScript操作CSS變量

另一個超級酷的事情就是,你可以直接通過JavaScript代碼訪問CSS變量。

假設(shè)在你的CSS文件中,有一個叫做--left-pos的變量,作用在.sidebar選擇器中,值為100px

.sidebar {

    --left-pos: 100px;

}

那么,通過JavaScript獲取--left-pos值,會像下面這樣:

// 緩存你即將操縱的元素

const sidebarElement = document.querySelector('.sidebar');

// 緩存sidebarElement的樣式于cssStyles中

const cssStyles = getComputedStyle(sidebarElement);

// 獲取 --left-pos CSS變量的值

const cssVal = String(cssStyles.getPropertyValue('--left-pos')).trim();

// 將CSS 變量的值打印到控制臺: 100px

console.log(cssVal);

如果想通過JavaScript設(shè)置CSS變量的值,你可以像這樣:那么,通過JavaScript獲取--left-pos值,會像下面這樣:

sidebarElement.style.setProperty('--left-pos', '200px');

請看看CodePen中的如下示例,你可以交互式地點擊側(cè)邊欄,修改blend mode屬性和背景色。這些實現(xiàn)只用到了CSS變量和JavaScript。上面的代碼將sidebar元素中--left-pos變量的值設(shè)置為200px。

CSS變量的瀏覽器支持

除了IE11(它不支持CSS變量),所有主流瀏覽器都對CSS變量有全面地支持。

對于不支持CSS變量的瀏覽器,一個變通的方案是使用具有虛擬查詢條件

(dummy conditional query)的@supports代碼塊:

section {

    color: gray;

}

@supports(--css: variables) {

    section {

        --my-color: blue;

        color: var(--my-color, 'blue');

    }

}

對于上面的代碼,在Chrome和其他支持CSS變量的瀏覽器中,

標簽里的文本將是藍色:考慮到@supports在IE/Edge里也起作用,上面的方法是可行的。如果你在val()函數(shù)中使用了備用值,那么你的代碼將更加可靠,它能在兼容性不好的瀏覽器中實現(xiàn)優(yōu)雅降級。

IE11中,由于它不支持CSS變量,頁面將顯示灰色文本:

此方法的一個缺點是,如果你大量使用CSS變量,而那些不支持CSS變量的瀏覽器在你的項目中有很高的適配優(yōu)先級,那么相應(yīng)的代碼會變得很復(fù)雜,對于維護來說,甚至是噩夢。

在這種情況下,你可以選擇使用帶有cssnext的PostCSS,它能讓你在CSS代碼中使用最新的特性,并且讓原本不支持這些屬性的瀏覽器,也能運行這些代碼(有點像JavaScript轉(zhuǎn)換器做的事情)。

本文完~

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
CSS中的變量使用詳解
關(guān)于 Web 應(yīng)用的內(nèi)聯(lián) css 和 scss 文件里的 var 關(guān)鍵字用法
深入學習CSS自定義屬性(CSS變量)
你可能不知道的10個CSS新功能(2021版)
【譯】CSS變量的正確使用方法
less學習筆記
更多類似文章 >>
生活服務(wù)
熱點新聞
分享 收藏 導長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服