:is()
匹配列表中任意一个选择器可以选择的元素。:matches() 重命名之后的写法。兼容写法::-webkit-any()、:-moz-any()。
语法
1 | :is( <forgiving-selector-list> ) |
:is() 伪类函数不能选择伪元素
1 | some-element::before, some-element::after { |
不能使用 :is() 简写:
1 | some-element:is(::before, ::after) { |
forgiving-selector
原谅选择器解析可以避免选择器列表失效。在 CSS 中使用选择器列表时,如果任何选择器无效,则整个列表都被视为无效。而当使用 :is() 或 :where() 选择器列表时,如果一个选择器解析失败,则将忽略不正确或不受支持的选择器并使用其他选择器。下面代码即使在浏览器不支持 :unsupported 时,仍然会正确解析并匹配 :valid。
1 | :is(:valid, :unsupported) { |
下面代码在浏览器不支持 :unsupported 时将被忽略,即使它们支持 :valid。
1 | :valid, :unsupported { |
:where()
与 :is() 语法和作用相同,区别是 :where() 的优先级总是为 0 ,:is() 的优先级是由它的选择器列表中优先级最高的选择器决定的。
示例
在下面这个例子中,我们有两篇文章,每篇文章都包含一个部分、一个旁白和一个页脚。然后定义了不同的样式:
1 | :is(section.is-styling, aside.is-styling, footer.is-styling) a { |
如果我们稍后想使用简单的选择器覆盖页脚中链接的颜色:
1 | footer a { |
因为类选择器比元素选择器具有更高的优先级,:is() 的优先级是由它的选择器列表中优先级最高的选择器决定的,所以这不会对 :is() 选择器中页脚链接的样式覆盖。但是,:where() 选择器的优先级总是为 0,因此 :where() 选择器中页脚链接的样式将被覆盖。
:has(selector)
匹配包含(相对于 selector 的 :scope)指定选择器的元素。可以认为 selector 的前面有一个看不见的 :scope 伪类(a:has(a > img)这样的写法是不合法的)。它的强大之处是,可以实现父选择器和前面兄弟选择器的功能。支持所有的 CSS 选择符。
语法
1 | :has( <forgiving-relative-selector-list> ) |
示例
需要升级你的浏览器到以下版本:
参考资料
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 张坤的博客!
评论