CSS :is() 和 :where() 即將出現(xiàn)在瀏覽器中
現(xiàn)在,Safari(技術(shù)預(yù)覽版106)和Firefox(版本78)的預(yù)覽版均支持新的CSS :is() 和 :where() 偽類。 Chrome的實(shí)施仍然落后。
使用 :is() 減少重復(fù)
你可以使用 :is() 偽類來(lái)刪除選擇器列表中的重復(fù)項(xiàng)。
- /* BEFORE */
- .embed .save-button:hover,
- .attachment .save-button:hover {
- opacity: 1;
- }
- /* AFTER */
- :is(.embed, .attachment) .save-button:hover {
- opacity: 1;
- }
此功能主要在未處理的標(biāo)準(zhǔn)CSS代碼中有用。如果使用Sass或類似的CSS預(yù)處理程序,則可能更喜歡嵌套。
注意:瀏覽器還支持非標(biāo)準(zhǔn)的 :-webkit-any() 和 :-moz-any() 偽類,它們與 :is() 相似,但限制更多。WebKit在2015年棄用了 :-webkit-any() ,Mozilla已將Firefox的用戶代理樣式表更新為使用 :is() 而不是 :-moz-any()。
使用 :where() 來(lái)保持低特殊性
:where() 偽類與 :is() 具有相同的語(yǔ)法和功能。它們之間的唯一區(qū)別是 :where() 不會(huì)增加整體選擇器的特殊性(即某條CSS規(guī)則特殊性越高,它的樣式越優(yōu)先被采用)。
:where() 偽類及其任何參數(shù)都不對(duì)選擇器的特殊性有所幫助,它的特殊性始終為零。
此功能對(duì)于應(yīng)易于覆蓋的樣式很有用。例如,基本樣式表 sanitize.css 包含以下樣式規(guī)則,如果缺少 <svg fill>屬性,該規(guī)則將設(shè)置默認(rèn)的填充顏色:
- svg:not([fill]) {
- fill: currentColor;
- }
由于其較高的特殊性(B = 1,C = 1),網(wǎng)站無(wú)法使用單個(gè)類選擇器(B = 1)覆蓋此聲明,并且被迫添加 !important 或人為地提高選擇器的特殊性(例如 .share-icon.share-icon)。
- .share-icon {
- fill: blue; /* 由于特殊性較低,因此不適用 */
- }
CSS庫(kù)和基礎(chǔ)樣式表可以通過(guò)用 :where() 包裝它們的屬性選擇器來(lái)避免這個(gè)問(wèn)題,以保持整個(gè)選擇器的低特殊性(C=1)。
- /* sanitize.css */
- svg:where(:not([fill])) {
- fill: currentColor;
- }
- /* author stylesheet */
- .share-icon {
- fill: blue; /* 由于特殊性較高,適用 */
- }