共计 9017 个字符,预计需要花费 23 分钟才能阅读完成。
- 作者:陈大鱼头
- github:KRISACHAN
前言
CSS 选择器是 CSS 世界中十分重要的一环。
在 CSS 2 之后,所有的 CSS 属性都是按模块去保护的。
CSS 选择器也是如此,然而现在也曾经公布了第四版 —— CSS Selectors Level 4,这一版最早的草案公布于 2011 年 09 月 29 日,最初更新是 2018 年 11 月 21 日。
上面让咱们一起来看看 Level 4 新推出的一些选择器。
注释
上面咱们依照类型来划分
逻辑组合(Logical Combinations)
在这个分类下,咱们有以下四个选择器:
:not()
其实 :not()
不算是新标签,不过在 Level 4 里,减少了多选的性能,代码如下:
/* 除了.left, .right, .top 之外所以的 div 的盒子模型都会变成 flex
*/
div:not(.left, .right, .top) {display: flex;}
/* 等价于 */
div:not(.left), div:not(.right), div:not(.top) {display: flex;}
兼容性如下:
.png)
额。。。还不能用
:is()
:is()
伪类将选择器列表作为参数,并抉择该列表中任意一个选择器能够抉择的元素。这对于以更紧凑的模式编写大型选择器十分有用。
看个栗子:
/* 抉择 header, main, footer 里的任意一个悬浮状态的段落(p 标签) */
:is(header, main, footer) p:hover {
color: red;
cursor: pointer;
}
/* 等价于 */
header p:hover,
main p:hover,
footer p:hover {
color: red;
cursor: pointer;
}
兼容如下:
.png)
:where()
:where()
伪类承受选择器列表作为它的参数,将会抉择所有能被该选择器列表中任何一条规定选中的元素。
其实就是跟 :is()
,惟一不同的就是 :where()
的优先级总是为 0,然而 :is() 的优先级是由它的选择器列表中优先级最高的选择器决定的。
代码如下:
<style>
:is(section.is-styling, aside.is-styling, footer.is-styling) a {color: red;}
:where(section.where-styling, aside.where-styling, footer.where-styling) a {color: orange;}
footer a {color: blue;}
</style>
<article>
<h2>:is()-styled links</h2>
<section class="is-styling">
<p>Here is my main content. This <a href="https://mozilla.org">contains a link</a>.
</section>
<aside class="is-styling">
<p>Here is my aside content. This <a href="https://developer.mozilla.org">also contains a link</a>.
</aside>
<footer class="is-styling">
<p>This is my footer, also containing <a href="https://github.com/mdn">a link</a>.
</footer>
</article>
<article>
<h2>:where()-styled links</h2>
<section class="where-styling">
<p>Here is my main content. This <a href="https://mozilla.org">contains a link</a>.
</section>
<aside class="where-styling">
<p>Here is my aside content. This <a href="https://developer.mozilla.org">also contains a link</a>.
</aside>
<footer class="where-styling">
<p>This is my footer, also containing <a href="https://github.com/mdn">a link</a>.
</footer>
</article>
:is()
跟 :where()
比照效果图如下:
兼容性如下:
.png)
:has()
:has()
伪类代表一个元素,其给定的选择器参数(绝对于该元素的 :scope)至多匹配一个元素。
:has()
承受一个选择器组作为参数。在以后标准中 :has()
并未列为实时选择器配置的一部分,意味着其不能用于样式表中。
语法如下:
// 上面的选择器只会匹配间接蕴含 <img> 子元素的 <a> 元素
a:has(> img)
// 上面的选择器只会匹配其后紧跟着 <p> 元素的 <h1> 元素:h1:has(+ p)
兼容性如下:
.png)
嗯,全红。。。
语言伪类(Linguistic Pseudo-classes)
:dir()
:dir()
伪类匹配特定文字书写方向的元素。在 HTML 中, 文字方向由 dir
属性决定。其余的文档类型可能有其余定义文字方向的办法。
:dir()
并不等于应用 [dir=…]
属性选择器。后者匹配 dir
的值且不会匹配到未定义此属性的元素,即便该元素继承了父元素的属性;相似的,[dir=rtl]
或 [dir=ltr]不会匹配到 dir 属性的值为 auto 的元素。而
:dir()
会匹配通过客户端计算后的属性, 不论是继承的 dir 值还是 dir 值为 auto 的。
例子如下:
<style>
:dir(ltr) {background-color: yellow;}
:dir(rtl) {background-color: powderblue;}
</style>
<div dir="rtl">
<span>test1</span>
<div dir="ltr">test2
<div dir="auto">עִבְרִית</div>
</div>
</div>
成果如下:
兼容性如下:
.png)
又是一片红。。
:lang()
:lang()
伪类基于元素语言来匹配页面元素。
例子如下:
/* 下例示意抉择文本语言带有 -TN 的 div 元素 (ar-TN, fr-TN). */
div:lang(*-TN) {background-color: green}
浏览器反对状态:没有一个反对的。
地位伪类(Location Pseudo-classes)
:any-link
:any-link
伪类 选择器代表一个有链接锚点的元素,而不论它是否被拜访过,也就是说,它会匹配每一个有 href 属性的 <a>
、<area>
或 <link>
元素。因而,它会匹配到所有的 :link
或 :visited
。
例子如下:
<style>
a:any-link {
border: 1px solid blue;
color: orange;
}
/* WebKit 内核浏览器 */
a:-webkit-any-link {
border: 1px solid blue;
color: orange;
}
</style>
<a href="https://example.com">External link</a><br>
<a href="#">Internal target link</a><br>
<a>Placeholder link (won't get styled)</a>
成果如下:
兼容性如下:
:local-link
:local-link
伪类能够独自格式化本地链接(原文是local links
)(外部链接)。
例子如下:
a:local-link {text-decoration: none;}
成果 & 兼容性
没有一个浏览器是反对的,看不到成果
:target-within
:target-within
伪类实用于 :target
所匹配的元素,以及它 DOM 节点内所有匹配的元素。
例子如下:
div:target-within {border: 2px solid black;}
成果 & 兼容性
没有一个浏览器是反对的,看不到成果
:scope
:scope
伪类示意作为选择器要匹配的作用域的元素。不过目前它等效于 :root
。
因为尚未有浏览器反对 CSS 的部分作用域。
例子如下:
:scope {background-color: lime;}
兼容性如下:
浏览器算法不反对,兼容有跟没没区别~
用户行为伪类(User Action Pseudo-classes)
:focus-visible
当元素匹配 :focus
伪类并且客户端 (UA) 的启发式引擎决定焦点该当可见 (在这种状况下很多浏览器默认显示“焦点框”。) 时,:focus-visible
伪类将失效。
这个选择器能够无效地依据用户的输出形式 (鼠标 vs 键盘) 展现不同模式的焦点。
例子如下:
<style>
input, button {margin: 10px;}
.focus-only:focus {outline: 2px solid black;}
.focus-visible-only:focus-visible {outline: 4px dashed darkorange;}
</style>
<input value="Default styles"><br>
<button>Default styles</button><br>
<input class="focus-only" value=":focus only"><br>
<button class="focus-only">:focus only</button><br>
<input class="focus-visible-only" value=":focus-visible only"><br>
<button class="focus-visible-only">:focus-visible only</button>
成果如下:
兼容性如下:
目前只有 Chrome 67+ 兼容 …
:focus-within
:focus-within
伪类实用于 :focus
所匹配的元素,以及它 DOM 节点内所有匹配的元素。
例子如下:
<style>
form {
border: 1px solid;
color: gray;
padding: 4px;
}
form:focus-within {
background: #ff8;
color: black;
}
input {margin: 4px;}
</style>
成果如下:
工夫尺寸伪类(Time-dimensional Pseudo-classes)
:current
&& :past
&& :future
这个伪类选择器会抉择 HTML5
中<video>
的语言渲染以及播放过程中的工夫维度绝对元素。所有相干的选择器都像 :matches()
。这几个伪类选择器的区别在于:past
会抉择 :current
所选的元素之前的所有节点。所以,:future
就是指之后的所有节点了。
例子如下:
/* Current */
:current(p, span) {background-color: yellow;}
/* Past */
:past,
/* Future */
:future {display: none;}
兼容性如下:
目前没有任何浏览器反对
输出伪类(The Input Pseudo-classes)
:read-only
与 :read-write
:read-only
伪类选择器示意以后元素是用户不可批改的。
:read-write
伪类选择器示意以后元素是用户可批改的。这个伪类选择器能够应用在一个可输出的元素或 contenteditable
元素(HTML5 属性)。
例子如下:
<style>
:read-only {
font-size: 20px;
color: green;
}
:read-write {
border: 1px solid orange;
font-size: 18px;
}
</style>
<input type="text" placeholder='text here'>
<input type="tel" placeholder='number here'>
<select>
<option>1</option>
<option>2</option>
</select>
成果如下:
兼容性如下:
:placeholder-shown
:placeholder-shown
伪类 在 <input>
或 <textarea>
元素显示 placeholder text 时失效。
例子如下:
<style>
input {
border: 2px solid black;
padding: 3px;
}
input:placeholder-shown {border-color: silver;}
</style>
<input placeholder="Type something here!">
成果如下:
兼容性如下:
:default
:default
伪类选择器 示意一组相干元素中的默认表单元素。
该选择器能够在 <button>
, <input type="checkbox">
, <input type="radio">
, 以及 <option>
上应用。
例子如下:
<style>
input:default {box-shadow: 0 0 2px 1px coral;}
input:default + label {color: coral;}
</style>
<input type="radio" name="season" id="spring">
<label for="spring">Spring</label>
<input type="radio" name="season" id="summer" checked>
<label for="summer">Summer</label>
<input type="radio" name="season" id="fall">
<label for="fall">Fall</label>
<input type="radio" name="season" id="winter">
<label for="winter">Winter</label>
成果如下:
兼容性如下:
:indeterminate
:indeterminate
伪类选择器示意状态不确定的表单元素。
它反对:
-
<input type="checkbox">
元素,其indeterminate
属性被 JavaScript 设置为true
。 -
<input type="radio">
元素, 表单中领有雷同name
值的所有单选按钮都未被选中时。 - 处于不确定状态的
<progress>
元素
例子如下:
<style>
input, span {background: red;}
:indeterminate, :indeterminate + label {background: lime;}
progress {margin: 4px;}
progress:indeterminate {
opacity: 0.5;
background-color: lightgray;
box-shadow: 0 0 2px 1px red;
}
</style>
<div>
<input type="checkbox" id="checkbox">
<label for="checkbox">Background should be green</label>
</div>
<br />
<div>
<input type="radio" id="radio">
<label for="radio">Background should be green</label>
</div>
<br />
<progress></progress>
<script>
'use strict'
const inputs = document.querySelectorAll('input')
inputs.forEach(input => {input.indeterminate = true})
</script>
成果如下:
兼容性如下:
:valid
与 :invalid
判断有效性的伪类选择器(:valid
和 :invalid
)匹配无效或有效,<input>
或<form>
元素。
:valid
伪类选择器示意值通过验证的<input>
,这通知用户他们的输出是无效的。
:invalid
伪类选择器示意值不通过通过验证的<input>
,这通知用户他们的输出是有效的。
例子如下:
<style>
input:valid {outline: 1px solid green;}
input:invalid {outline: 1px solid red;}
</style>
输出文字:<input type="text" pattern="[\w]+" required />
<br />
输出电话号码:<input type="tel" pattern="[0-9]+" required />
成果如下:
兼容性如下:
:in-range
与 :out-of-range
如果一个工夫或数字 <input>
具备 max
或min
属性,那么 :in-range
会匹配到输出值在指定范畴内的 <input>
,:out-of-input
则匹配输出值不在指定范畴的<input>
。如果没有规定范畴,则都不匹配。
例子如下:
<style>
li {
list-style: none;
margin-bottom: 1em;
}
input {border: 1px solid black;}
input:in-range {background-color: rgba(0, 255, 0, 0.25);
}
input:out-of-range {background-color: rgba(255, 0, 0, 0.25);
border: 2px solid red;
}
input:in-range + label::after {content: 'okay.';}
input:out-of-range + label::after {content: 'out of range!';}
</style>
<form action=""id="form1">
<ul>Values between 1 and 10 are valid.
<li>
<input id="value1" name="value1" type="number" placeholder="1 to 10" min="1" max="10" value="12">
<label for="value1">Your value is </label>
</li>
</ul>
</form>
成果如下:
兼容性如下:
:required
与 :optional
伪类选择器 :required
和:optional
匹配了 <input>
,<select>
, 或 <textarea>
元素。
:required
示意“必填”
:optional
示意“可选”
例子如下:
<style>
input:required {border: 1px solid orange;}
input:optional {border: 1px solid green;}
</style>
必填的:<input type="text" required>
<br />
可选的:<input type="text">
成果如下:
兼容性如下:
:required
的兼容性在下面有。
:blank
:blank
伪类选择器 用于匹配如下节点:
- 没有子节点;
- 仅有空的文本节点;
- 仅有空白符的文本节点。
有点相似于 :empty
,然而比:empty
宽松,目前还是没有任何一款浏览器反对。
:user-invalid
:user-invalid
伪类选择器匹配输出谬误的元素。不过跟其它的输出伪类不同的是,它仅匹配用户输出时的谬误,而不是静默状态下的谬误,这样就会比拟人性化,惋惜,目前还是没有任何一款浏览器反对。
树型伪类(Tree-Structural pseudo-classes)
:nth-child
与 :nth-last-child
:nth-child
与 :nth-last-child
并不是 Level 4 才推出的伪类选择器,然而在 Level 4 里 新增了在元素组里匹配的性能。
语法如下::nth-child/nth-last-child(An + B [of S] ?)
例子如下:
:nth-child(-n+3 of li.important)
下面的例子通过传递选择器参数,抉择与之匹配的第 n 个元素,这里示意 li.important
中前三个子元素。
它跟以下规定不同:
li.important:nth-child(-n+3)
这里示意的时候如意前三个子元素方才是 li.important
时能力被抉择失去。
兼容性如下:
(鱼头注:牛皮,Safari 竟然弯道超车了,不过别的浏览器不反对,也没啥用 …)
网格选择器(Grid-Structural Selectors)
||
||
组合器抉择属于某个表格行的节点。
例子如下:
<style>
col.selected || td {
background: gray;
color: white;
font-weight: bold;
}
</style>
<table border="1">
<colgroup>
<col span="2"/>
<col class="selected"/>
</colgroup>
<tbody>
<tr>
<td>A
<td>B
<td>C
</tr>
<tr>
<td colspan="2">D</td>
<td>E</td>
</tr>
<tr>
<td>F</td>
<td colspan="2">G</td>
</tr>
</tbody>
</table>
下面的例子能够使 C,E 与 G 单元格变灰。
很惋惜,目前还是没有任何浏览器给予反对。
:nth-col()
与 :nth-last-col()
伪类选择器 :nth-col()
与 :nth-last-col()
示意抉择正向或反向的表格行的节点。
语法和 :nth-child
与 :nth-last-child
相似,只不过它是抉择表格内的元素。
目前还是没有任何浏览器反对。
最初
总结
以上便是 CSS 选择器 Level 4 里新出的所有选择器,其实都是十分有用的,尽管有些选择器的浏览器反对度并不乐观的。
心愿各大浏览器厂商能够赶快减少对它们的反对吧。
参考资料
- can i use
- MDN
- Selectors Level 4 W3C Working Draft