CSS 的邏輯組合偽類有 4 種,分別是::not()、:is()、:where()和:has()。
否定偽類:not()
否定偽類,是在元素與括號里面的參數不匹配的時候,就會對這個偽類進行匹配。比如::not(span):{color:red}
,這就會匹配不是 span 元素的其他所有元素,包括 html 和 body。
否定偽類:not()的幾個特點:
- :not()的優先級是 0,因為它的優先級是由括號里面的參數來定的;
- :not()偽類可以同時判斷多個選擇器,比如
input:not(:disabled):not(:read-only) {}??
,表示匹配不屬于禁用狀態同時也不處于只讀狀態的 input 元素; - not()支持多個表達式,比如:
.cs-li:not(li, dd) {}??
,還有另外一種寫法:.cs-li:not(li):not(dd) {}??
。但是這兩種寫法,要考慮兼容性問題; - :not()也支持選擇符,比如:
input:not(.a > .b) { border: red solid; }??
;
:is()
:is()偽類,是把括號里面的選擇都分配出去。語法如下:
:is(article) p {}
:is(article, section) p {}
:is(.article[class], section) p {}
.some-class:is(article:not([id]), section) p {}??
is 這個偽類最大的作用,就是在簡化選擇器。比如我們要設置多個 div 內的圖片樣式,樣式代碼如下:
.div-a > img,
.div-b > img,
.div-c > img,
.div-d > img {display: block;width: 100%; height: 100%;border-radius: 50%;
}??
通過 is 偽類來簡化一下:
:is(.div-a,.div-b,.div-c,.div-d)>img{display: block;width: 100%; height: 100%;border-radius: 50%;
}
:where()偽類的功能和 is 是一樣的,只是它的優先級一直都是 0,會忽略括號內參數的優先級。比如::where(.article, section) p {}??
的優先級就是 p 標簽的優先級。
關聯偽類:has()
has()偽類,就是匹配某個選擇器。例如:a:has(span) { color:red }??
,a 元素內的 span 標簽的字體顏色設置為 red。
這就是 CSS 經常遇到的幾個邏輯偽類。