CSS 自定義屬性 -- 使用 JS 和不使用 JS

你曾想過(guò)在頁(yè)面加載過(guò)后修改 SassLess變量值么? 我曾經(jīng)嘗試過(guò), 但并沒(méi)有成功, 因?yàn)?code>當(dāng)預(yù)處理的代碼編譯成了 CSS, 它的變量就不再是變量了, 然而, 自定義屬性就沒(méi)有這樣的限制.

在該系列的文章中, 我曾提及過(guò)自定義屬性它最牛扳的特性就是它的動(dòng)態(tài)性. 它的強(qiáng)大我們一眼就能對(duì)比出來(lái), 預(yù)處理變量在編譯后就成了固定值, 而自定義屬性可以在頁(yè)面加載后繼續(xù)更改變量的值.

本篇文章我們將一起來(lái)看如何通過(guò)用戶交互和 JavaScipt 來(lái)做一些帥氣的改變.

不用 JS 來(lái)更改 CSS 自定義屬性

大多數(shù)的動(dòng)態(tài)特效貌似多多少少都需要點(diǎn) JavaScipt, 所以, 我們就從一個(gè)簡(jiǎn)單的例子入手, 使用自定義屬性改變 :hover 的效果

我們給一個(gè) div 一個(gè) width 和 height, 然后, 定義一個(gè)值為 #ccc 的自定義屬性 background. 接著, 我們用 var 函數(shù) 設(shè)置 background-color, 并給它 1s 的 transition.

div {
 width: 15em;
 height: 15em;

  --background: #ccc;
  background-color: var(--background);
  transition: background-color 1s;
}

為了改變 background color, 我們?cè)俅味x --background 的值

div:hover {
  --background: #cce;
}

雖然, 上面的例子不用自定義屬性也可以輕松的實(shí)現(xiàn), 但如果我們的改變?cè)龆? 使用自定義屬性書寫的代碼明顯要更干凈, 更可讀

使用 JS 來(lái)更改 CSS 自定義屬性

用 JavaScipt 來(lái)更改自定義屬性的值將會(huì)變的特別有趣.

首先, 我們必須要知道如何獲取自定義屬性的值, 和如何設(shè)置

獲取自定義屬性的值

要獲取自定義屬性的值, 你要知道兩個(gè) JavaScipt 函數(shù): window.getComputedStylegetPropertyValue, 前者可以獲取元素所有 CSS 屬性的值, 后者可以獲取特定屬性的值.

let style = window.getComputedStyle(element, [pseudoElt]);
var value = style.getPropertyValue(property);

如果你是 JavaScipt 方向, 那么上面的代碼你肯定不陌生. 如果你并不熟悉, 可以參考下面的示例

首先, 我們使用 :root 定義一個(gè)全局變量

:root {
 --color: red
}

接著, 我們使用 getComputedStyle()getPropertyValue() 方法來(lái)讀取 color 的值.

var styles = getComputedStyle(document.documentElement);  // 獲取 root 的樣式
var colorValue = styles.getPropertyValue('--color');      // 獲取 --color 的值

現(xiàn)在 colorValue 的值就為 --color 的值, 不信你可以在控制臺(tái)中打印

console.log(colorValue);  // red

如何設(shè)置自定義屬性的值

要設(shè)置自定義屬性的值, 你要用到 style.setProperty 這個(gè)方法

style.setProperty(propertyName, value, priority);

setProperty 有三個(gè)參數(shù), 前兩個(gè)是屬性名稱和屬性的值, 其中, 屬性值可以為空, 第三個(gè) priority 是可選的, 允許你設(shè)置 important, CSS 準(zhǔn)則建議, 盡量不設(shè)置該屬性

設(shè)置一個(gè)新值比讀取一個(gè)值更簡(jiǎn)單, 因?yàn)槟悴恍枰獙⒅当4娴阶兞恐?

document.documentElement.style.setProperty('--color', 'green');

事實(shí)上, 在設(shè)置新值前, 該屬性可以不存在. 你可以在 setProperty中初始化自定義屬性.

移除自定義屬性

還有一個(gè) removeProperty() 方法可以移除自定義屬性, 如果你不想要了的話

var oldValue = style.removeProperty(property);

使用 Color Picker 更改顏色值

接下來(lái), 我們就一起來(lái)實(shí)踐一下. 為了便于大家理解, 我們不做忒復(fù)雜.

首先, 我們創(chuàng)建一個(gè)空的 div, 用于顯示用戶輸入的顏色

<div></div>
<input type="color" id="div-bkgd" value="#cccccc">

接下來(lái), 我們?cè)谌謩?chuàng)建一個(gè) --background 自定義屬性, 初始化為 #ccc, 給 div 一個(gè) width, heightmargin, 用 var() 函數(shù)給 background 賦值, 然后簡(jiǎn)單設(shè)置 input 的樣式.

:root {
 --background: #ccc;
}

div {
 width: 20em;
 height: 20em;
 margin: 1em auto;
 background: var(--background);
}

input {
 display: block;
 width: 10em;
 margin: 1em auto;
}

最后, 我們使用 document.querySelector() 獲取 input 元素, 給該元素添加一個(gè)事件監(jiān)聽器, 監(jiān)聽用戶輸入的變化, 然后用 setProperty 將輸入的值賦給自定義屬性 --background.

var colorInput = document.querySelector("#div-bkgd");

colorInput.addEventListener("change", function() {
 document.documentElement.style.setProperty("--background", this.value);
});

大功告成, 你可以在復(fù)制代碼在瀏覽器中運(yùn)行查看效果. 另外值得注意的是, color input 并不支持所有瀏覽器, 像在 IESafari 中就無(wú)法工作.

額外的示例

為了便于大家理解, 上面的例子都比較簡(jiǎn)單, 下面提供了一些比較復(fù)雜的應(yīng)用, 幫助大家快速掌握.

總結(jié)

自定義屬性JavaScipt 或其他腳本語(yǔ)言結(jié)合, 你會(huì)瞬間墜入自定義屬性的愛河

原文鏈接: CSS Custom Properties—Dynamic Changes With And Without Javascript

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子忘晤,更是在濱河造成了極大的恐慌挑围,老刑警劉巖谷市,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件爽撒,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡猩系,警方通過(guò)查閱死者的電腦和手機(jī)甲锡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)羽戒,“玉大人缤沦,你說(shuō)我怎么就攤上這事∫壮恚” “怎么了缸废?”我有些...
    開封第一講書人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我企量,道長(zhǎng)测萎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任届巩,我火速辦了婚禮硅瞧,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘恕汇。我一直安慰自己腕唧,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開白布瘾英。 她就那樣靜靜地躺著枣接,像睡著了一般。 火紅的嫁衣襯著肌膚如雪缺谴。 梳的紋絲不亂的頭發(fā)上但惶,一...
    開封第一講書人閱讀 49,185評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音湿蛔,去河邊找鬼膀曾。 笑死,一個(gè)胖子當(dāng)著我的面吹牛煌集,可吹牛的內(nèi)容都是我干的妓肢。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼苫纤,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼碉钠!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起卷拘,我...
    開封第一講書人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤喊废,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后栗弟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體污筷,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年乍赫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瓣蛀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡雷厂,死狀恐怖惋增,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情改鲫,我是刑警寧澤诈皿,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布林束,位于F島的核電站,受9級(jí)特大地震影響稽亏,放射性物質(zhì)發(fā)生泄漏壶冒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一截歉、第九天 我趴在偏房一處隱蔽的房頂上張望胖腾。 院中可真熱鬧,春花似錦怎披、人聲如沸胸嘁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)性宏。三九已至,卻和暖如春状飞,著一層夾襖步出監(jiān)牢的瞬間毫胜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工诬辈, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留酵使,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓焙糟,卻偏偏與公主長(zhǎng)得像口渔,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子穿撮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容

  • 原文地址:It’s Time To Start Using CSS Custom Properties 作者:Se...
    穆如清風(fēng)化雨閱讀 1,594評(píng)論 0 10
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理缺脉,服務(wù)發(fā)現(xiàn),斷路器悦穿,智...
    卡卡羅2017閱讀 134,601評(píng)論 18 139
  • 問(wèn)答題47 /72 常見瀏覽器兼容性問(wèn)題與解決方案攻礼? 參考答案 (1)瀏覽器兼容問(wèn)題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,728評(píng)論 1 92
  • 2017年3月15日 星期三 陰 拖延癥又犯了,好幾天沒(méi)寫日記栗柒,又欠下好幾篇礁扮,得趕緊補(bǔ)起來(lái)。 最近...
    玉豆閱讀 122評(píng)論 0 0
  • 孩子進(jìn)入青春期后瞬沦,他就站在了人生節(jié)點(diǎn)上太伊。有些話,你不跟他說(shuō)逛钻,沒(méi)有人會(huì)跟他說(shuō)僚焦。做父母的,需要好好工作绣的;做孩子的叠赐,需要...
    陽(yáng)光心靈成長(zhǎng)工作室閱讀 2,208評(píng)論 0 1