本文的標題是如何寫出讓別人看不懂的選擇器,但是本意不是希望大家去寫如此複雜的選擇,一些複雜(怪異)的選擇器在一些特定場景下也許有著妙用,又或者寫出這種選擇器是基於當時的特殊背景。
通過這些案例,我們窺見一些 CSS 選擇器的有意思之處。從中得到一些有益經驗。
五花八門的偽類疊加
首先來看第一類,在單個選擇器中,疊加各種偽元素。
像是這個:
a:not(main *:not(:is(h2, h3) > *)) {
color: red;
}
這個選擇器不認真看個一分鐘根本不知道它到底是個啥。(認真看也不一定知道...)
它混入了比較新的兩個偽類選擇器
:not()
:用來匹配不符合一組選擇器的元素。由於它的作用是防止特定的元素被選中,它也被稱為反選偽類(negation pseudo-class):is()
:將選擇器列表作為引數,並選擇該列表中任意一個選擇器可以選擇的元素。
當然,對於它的拆解:
a:not(main *)
:選擇不是<main>
標籤下的所有 a 標籤main *:not(:is(h2, h3) > *)
:選擇<main>
標籤下所有不是<h2>
、<h3>
子元素的元素
所以合起來就是:選擇所有不是 <main>
標籤下的 <a>
標籤以及所有 <main>
下面不是 <h2>
、<h3>
下的子 <a>
以外的所有 <a>
標籤。
假設有如下 HTML
<main>
<a href="">main>a</a>
<h1><a href="">main>h1>a</a></h1>
<h2><a href="">main>h2>a</a></h2>
<h2><p><a href="">main>h2>p>a</a></p></h2>
<h3><a href="">main>h3>a</a></h3>
</main>
<h1><a href="">h1>a</a></h1>
<h2><a href="">h2>a</a></h2>
<h3><a href="">h3>a</a></h3>
<a href="">a</a>
結果如下:
對於這個 CSS 選擇器,是可以通過正常寫法還原的,只是程式碼量稍微多一點點,正常而言,還是不建議寫這麼複雜的選擇器。
這裡僅僅是一個例子,多層不同的偽類巢狀,對於程式碼可讀性是災難性的。
神奇的特殊字元
好了,某天你又碰到了這樣一個選擇器:
#\~\!\@\$\%\^\&\*\(\)\_\+-\=\,\.\/\'\;\:\?\>\<\\\[\]\{\}\|\`\# {
color: red;
}
Oh My God。我想你的第一反應一定是這個選擇器真能生效?
不好意思,它還真能生效,CSS 中的 CSS 類名中允許使用除 NUL
之外的任何字元。
感興趣可以看看這個:Which characters are valid in CSS class names/selectors?
所以,上述的選擇器,是可以匹配這樣的標籤的:
<div id="~!@$%^&*()_+-=,./';:?><\[]{}|`#">Lorem</div>
當然,既然如此,我們還可以寫出這樣的選擇器:
<div id="????">真滴牛啤</div>
#???? {
padding: 10px;
color: red;
}
emmm,沒錯,這也是可以生效的:
所以,不是特別皮糙肉厚,極不建議大家在 CSS 類名中摻入除了 -
以及 _
以外的其他特殊字元。
自身的多重重疊
下面這個選擇器,也有點意思,特殊關頭倒是可以寫寫。像是這樣一個選擇器:
div.g-text-color.g-text-color.g-text-color.g-text-color.g-text-color {
color: red;
}
為什麼會出現這種選擇器呢?大部分情況是為了提升優先順序。
我們都知道,CSS 不同選擇器之間是存在優先順序高低的。
有這樣一種場景舉個例子,有的時候,我們在業務中引入了元件庫,使用了它的一個按鈕,但是又想改變其中的某些樣式。給它加了一個類名,在對應類名新增了覆蓋樣式後發現沒有生效。
原因就在於定義樣式的選擇器優先順序不夠高。
這個時候,我們就可以通過自己疊加自己的方式,提升選擇器的權重。
div.g-text-color.g-text-color.g-text-color
的權重,就會比 div.g-text-color.g-text-color
更高。所以某些極端情況下,就出現了上述的選擇器。
當然,正常情況下,也是不推薦寫這種讓人頭大的選擇的。
總結一下
坑爹的選擇器還有很多,本文僅僅是舉了冰山一角。從如何寫出讓別人看不懂的選擇器中,我們能知道 CSS 選擇器是存在非常多細節的。知道那些不好的,能幫助我們更好的寫出漂亮且正確的選擇器。
好了,本文到此結束,希望對你有幫助 ?
更多精彩 CSS 效果可以關注我的 CSS 靈感
更多精彩 CSS 技術文章彙總在我的 Github -- iCSS ,持續更新,歡迎點個 star 訂閱收藏。
如果還有什麼疑問或者建議,可以多多交流,原創文章,文筆有限,才疏學淺,文中若有不正之處,萬望告知。