帶有自定義屬性的大陷阱
最近我發現不少人(包括我自己)都被CSS自定義屬性的這個特性搞糊塗了,所以決定把它記錄下來。
讓我們在CSS中添加幾個自定義屬性:
html { --color-1: red; --color-2: blue; }
我們立即使用它們來創建一個背景漸變:
html { --color-1: red; --color-2: blue; --bg: linear-gradient(to right, var(--color-1), var(--color-2)); }
現在假設頁面上有兩個div:
<div></div> <div></div>
讓我們來設置它們的樣式:
div { background: var(--bg); }
這完全有效!太棒了!
現在讓我們修改一下樣式。我不希望它從紅色漸變到藍色,我希望它從綠色漸變到藍色。很簡單,我將紅色更新為綠色:
html { --color-1: red; --color-2: blue; --bg: linear-gradient(to right, var(--color-1), var(--color-2)); } div { background: var(--bg); } .variation { --color-1: green; }
無效! (警笛聲大作,喇叭聲震耳,家畜四處躲藏)。
朋友們,這不起作用。
據我理解,問題在於--bg
從未在任何div上聲明過。它可以使用--bg
,因為它在更高級別被聲明了,但是當它被使用時,它的值已經被鎖定。僅僅因為你更改了--bg
聲明時所使用的其他屬性,並不意味著該屬性會去尋找它被用作依賴項的所有位置並更新所有使用它的內容。
唉,這個解釋感覺不太對。但這已經是我能想到最好的解釋了。
解決方案?嗯,有幾個。
解決方案1:將變量作用域限制在使用它的位置。
你可以這樣做:
html { --color-1: red; --color-2: blue; } div { --bg: linear-gradient(to right, var(--color-1), var(--color-2)); background: var(--bg); } .variation { --color-1: green; }
現在--bg
在兩個div上都被聲明了,對--color-1
依賴項的更改確實有效。
解決方案2:使用逗號分隔設置大多數變量的選擇器。
假設你做了在:root
設置一堆變量的常見操作。然後你遇到了這個問題。你可以簡單地向主要聲明中添加額外的選擇器,以確保你命中正確的範圍。
html, div { --color-1: red; --color-2: blue; --bg: linear-gradient(to right, var(--color-1), var(--color-2)); } div { background: var(--bg); } .variation { --color-1: green; }
在其他一些可能不太牽強的例子中,它可能看起來像這樣:
:root, .button, .whatever-it-is-a-bandaid { --padding-inline: 1rem; --padding-block: 1rem; --padding: var(--padding-block) var(--padding-inline); } .button { padding: var(--padding); } .button.less-wide { --padding-inline: 0.5rem; }
解決方案3:全面模式
去他的——到處都放變量。
* { --access: me; --whereever: you; --want: to; --hogwild: var(--access) var(--whereever); }
這不是一個好方案。我最近聽到過一次聊天,其中一個中等規模的網站因頁面渲染延遲了500毫秒,因為頁面的每次繪製都需要計算所有屬性。它“有效”,但這是少數情況下你可以通過選擇器導致合法性能問題的例子之一。
解決方案4:引入新的“默認”屬性和回退
此處所有功勞都歸功於Stephen Shaw,我在他關於所有這些內容的探索中首先看到了這種混淆。
讓我們回到我們第一次演示這個問題的地方:
html { --color-1: red; --color-2: blue; --bg: linear-gradient(to right, var(--color-1), var(--color-2)); }
我們要做的是給自己兩樣東西:
- 一種覆蓋整個背景的方法
- 一種覆蓋漸變背景一部分的方法
所以我們要這樣操作:
html { --color-1: red; --color-2: blue; } div { --bg-default: linear-gradient(to right, var(--color-1), var(--color-2)); background: var(--bg, var(--bg-default)); }
請注意,我們根本沒有聲明--bg
。它只是坐在那裡等待一個值,如果它得到一個值,那就是“獲勝”的值。但如果沒有,它將回退到我們的--bg-default
。現在……
- 如果我設置
--color-1
或--color-2
,它將按預期替換漸變的那一部分(只要我在接觸到其中一個div的選擇器上執行此操作)。 - 或者,我可以將
--bg
設置為將整個背景重置為我想要的任何內容。
感覺是一種很好的處理方式。
有時CSS自定義屬性確實存在錯誤。但這並不是其中之一。即使對我來說它有點像錯誤,顯然它不是。只是你必須了解的那些事情之一。
以上是帶有自定義屬性的大陷阱的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

您是否曾經在項目上需要一個倒計時計時器?對於這樣的東西,可以自然訪問插件,但實際上更多

在元素個數不固定的情況下如何通過CSS選擇第一個指定類名的子元素在處理HTML結構時,常常會遇到元素個數不�...

關於Flex佈局中紫色斜線區域的疑問在使用Flex佈局時,你可能會遇到一些令人困惑的現象,比如在開發者工具(d...

格子呢是一塊圖案布,通常與蘇格蘭有關,尤其是他們時尚的蘇格蘭語。在Tartanify.com上,我們收集了5,000多個格子呢
