盤點(diǎn)CSS Selectors Level4中新增的選擇器
前言
CSS 選擇器在實(shí)踐中是非常常用的,無論是在寫樣式上或是在 JS 中選擇 DOM 元素都需要用到。在 CSS Selectors Level 4 中,工作組繼續(xù)為選擇器標(biāo)準(zhǔn)添加了更豐富的選擇器。下面我們來了解一下。
:is()
:is 是一個(gè)用于匹配任意元素的偽類,使用方法很簡(jiǎn)單,只需要將選擇器列表傳入即可,也就是說, :is() 的結(jié)果也就是傳入的選擇器列表中選中的元素。
那么這個(gè)選擇器有什么用呢?舉個(gè)例子:我需要對(duì)不同層級(jí)下的 h1 標(biāo)簽設(shè)置不同的字體大?。?/p>
/* Level 0 */
h1 {
font-size: 30px;
}
/* Level 1 */
section h1,
article h1,
aside h1,
nav h1 {
font-size: 25px;
}
/* Level 2 */
section section h1,
section article h1,
section aside h1,
section nav h1 {
font-size: 20px;
}
會(huì)發(fā)現(xiàn)我們需要寫很長(zhǎng)的列表才能區(qū)分覆蓋到不同層級(jí)中的 h1 標(biāo)簽,那么此時(shí) :is 就派上了用場(chǎng),前面說到, :is 即代表著參數(shù)里面的選擇選擇器列表選擇的元素,那么我們可以把上面的代碼進(jìn)行簡(jiǎn)化:
/* Level 0 */
h1 {
font-size: 30px;
}
/* Level 1 */
:is(section, article, aside, nav) h1 {
font-size: 25px;
}
/* Level 2 */
section :is(section, article, aside, nav) h1 {
font-size: 20px;
}
是不是一下子簡(jiǎn)潔了很多?是。
:is 也可以直接看做是類似選擇列表的語法糖,簡(jiǎn)化編寫步驟,瀏覽器會(huì)自動(dòng)將 :is 展開到簡(jiǎn)化之前的形式進(jìn)行解析。
使用 :is 時(shí)需要注意的
1、遇到不支持的選擇器
通常,在遇到不支持的選擇器時(shí),瀏覽器會(huì)直接將整條規(guī)則丟棄。例如,當(dāng)瀏覽器不支持 :unsupported 時(shí), :supported 是不會(huì)生效的。
:supported, :unsupported {
font-size: 12px;
}
而在 :is 中出現(xiàn)不支持的選擇器,則是相反的行為, :supported 仍然會(huì)被正確生效。
:is(:supported, :unsupported) {
font-size: 12px;
}
2、選擇器的權(quán)重
整個(gè) :is 選擇器的權(quán)重由傳入的選擇器列表中的權(quán)重最高的選擇器決定
:is(span, #id) {
font-size: 12px;
}
#id 選擇器擁有 (1, 0 ,0) 的權(quán)重,而 span 只有 (0, 0, 1),所以最終去匹配 <span></span> 、 <div id="id"></p> 、 <span id="id"></span> 都是使用 (1, 0, 0) 的權(quán)重值。
3、偽元素不能在 :is 中使用
瀏覽器支持情況

這里查的數(shù)據(jù)是 :matches , :matches 即為 :is 的前身,在 CSS Selector Level 4 中,我們所熟知的 :not 也支持選擇器列表作為參數(shù)使用了,而功能上 :matches 則與 :not 是相對(duì)的,所以為了成對(duì), :matches 改名為 :is
:where()
:where 選擇器是 :is 選擇器的無權(quán)重版本。前面提到, :is 的權(quán)重是由里邊的選擇器列表的最高權(quán)重決定的, :where 則不關(guān)心里邊的權(quán)重,它的權(quán)重直接為0。
.class:where(#id) {
font-size: 12px;
}
如上面的例子,整個(gè)樣式規(guī)則權(quán)重為 (0, 1, 0),只有 .class 貢獻(xiàn)了權(quán)重值。
在未來, :where 選擇器可能會(huì)支持指定權(quán)重值的選項(xiàng)
:scope
:scope 選擇器為它后面的選擇器提供了參考點(diǎn),在 CSS 中,默認(rèn) :scope 代表的即為 :root 。而在使用 JavaScript 進(jìn)行選擇元素時(shí),例如 querySelector 調(diào)用,可以用來限定選擇器的選擇范圍。
<div class="outer">
<div class="select">
<div class="inner">
</div>
</div>
</div>
你會(huì)發(fā)現(xiàn),我本來只想查 .select 里面的 .outer .inner ,這明顯不符合預(yù)期,那么使用 :scope 可以解決此問題。
var select = document.querySelector('.select');
var inner = select.querySelectorAll('.outer .inner');
inner.length; // 1, 不是 0
:any-link
該選擇器用于選擇所有包含 href 屬性的鏈接,在 HTML5 中,這些鏈接包含 a 、 area 以及 link 標(biāo)簽。
:local-link
:local-link 和 :any-link 的作用是相同的,但 :local-link 附加了一個(gè)限制,它只能選擇到鏈接的絕對(duì)地址是和當(dāng)前頁(yè)面的域名相匹配的,也就是說,如果一個(gè)鏈接的 href 是站外鏈接,將不會(huì)被 :local-link 選擇到。
:target-within
我們都知道,在 URL 中可以用過 #anchor 的形式,讓瀏覽器定位到 id 為 #anchor 或者 name 為 anchor 的錨點(diǎn)上, 當(dāng)命中一個(gè)錨點(diǎn)時(shí),我們可以使用 :target 選擇到當(dāng)前命中的那個(gè)元素。
現(xiàn)在有一個(gè)場(chǎng)景,我的某個(gè) section 容器的邊框需要在其里邊的某個(gè)錨點(diǎn)命中時(shí)改變邊框顏色,此時(shí)我們可以對(duì)這個(gè)容器使用 :target-within 選擇到這個(gè) section ,也就是說,這個(gè) section 內(nèi)部的某個(gè)元素必須能被 :target 選中。
:focus-within
:focus-within 與 :target-within 的效果是相同的,但它僅在該容器元素內(nèi)有元素被聚焦時(shí)能被選中,也就是說,這個(gè)容器內(nèi)部的某個(gè)元素必須能被 :focus 選中。
:focus-visible
當(dāng)一個(gè)元素被聚焦,能被 :focus 選中并且瀏覽器需要在該元素上顯示聚焦效果時(shí)(例如瀏覽器中輸入框聚焦時(shí)默認(rèn)顯示的外框),該元素才能被這個(gè)選擇器選中。
有了這個(gè)選擇器,就能用于自定義聚焦樣式。
:dir()
該選擇器用于根據(jù)語言的書寫方向進(jìn)行選擇,例如常見的左到右書寫形式(left-to-right)則可以使用 :dir(ltr) 進(jìn)行選擇;右到左的書寫形式則可以使用 :dir(rtl) 進(jìn)行選擇。如果給定的值是 auto ,那么會(huì)選中符合 ltr 或 rlt 順序的元素。
:blank
該選擇器用于選擇輸入框值為空的元素。
:user-invalid
該選擇器用于選擇未通過驗(yàn)證的輸入框,例如在 max 和 min 范圍之外的輸入框,標(biāo)明了 required 但值為空的輸入框。
:indeterminate
該選擇器用于選擇狀態(tài)未確定的元素,例如在 radio 和 checkbox 元素中,它們的值可以是是 checked 或者 unchecked ,如果沒有顯式地設(shè)定,它們的狀態(tài)都是未確定的。
時(shí)間線相關(guān)選擇器
時(shí)間線相關(guān)的選擇器用于在某些與時(shí)間進(jìn)度相關(guān)的功能上使用,例如文字閱讀器閱讀的時(shí)間軸,或是在視頻回放中用視頻時(shí)間顯示 WebVTT 字幕等。
:current()
當(dāng)前正在被閱讀器閱讀的元素或正在被顯示的字幕。
article:current(p) {
background: yellow;
}
:past()
已經(jīng)被閱讀過或顯示過的元素。
:future()
將要被閱讀或顯示的元素。
總結(jié)
通過豐富選擇器的語法,可以使得我們?cè)趯?shí)踐中更容易地去選擇元素并確定樣式。同時(shí)也能避免一些不必要的hack。
參考鏈接
https://developer.mozilla.org/en-US/docs/Web/CSS/:is
https://www.w3.org/TR/selectors-4/#changes-level-3
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
這篇文章主要介紹了css3的focus-within選擇器的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)2020-05-11
這篇文章主要介紹了CSS選擇器中的正則表達(dá)式使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)2020-03-11
這篇文章主要介紹了巧用CSS屬性值正則匹配選擇器,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)2020-03-11- 這篇文章主要介紹了css選擇器四大類:基本、組合、屬性、偽類的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-14
- 這篇文章主要介紹了css復(fù)雜選擇器及css字體樣式、顏色屬性,復(fù)雜選擇有三種,每種方法通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2020-01-19

詳解如何使用CSS3中的結(jié)構(gòu)偽類選擇器和偽元素選擇器
這篇文章主要介紹了詳解如何使用CSS3中的結(jié)構(gòu)偽類選擇器和偽元素選擇器,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面2020-01-06- 這篇文章主要介紹了CSS3 新增選擇器的實(shí)例,需要的朋友可以參考下2019-11-13

css3 偽類選擇器快速?gòu)?fù)習(xí)小結(jié)
如果說 css 作為前端開發(fā)的基本功, 那么 "選擇器" 就是基礎(chǔ)中的基礎(chǔ),本文介紹了css3 偽類選擇器快速?gòu)?fù)習(xí),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工2019-09-10- 這篇文章主要介紹了CSS 樣式的使用方式、選擇器 的相關(guān)資料,需要的朋友可以參考下2019-08-12
這篇文章主要介紹了CSS 中的六個(gè)重要選擇器(三秒就可以記住),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-27







