selector:hover 表示匹配鼠标经过的selector选择器元素。
应用场景:
鼠标经过元素时的样式变化,Tips提示,下拉列表和过渡动画等
细节优化:
注意事项:
:hover不适用于移动端,虽然也能触发,但消失并不敏捷,体验反而奇怪。
selector:active 表示匹配激活状态的selector选择器元素(通过鼠标主键点击或触屏触摸的过程中触发样式,结束后还原样式),支持任意html元素。
应用场景:
链接和按钮点击过程中的样式设置
注意事项:
(1)IE浏览器中,:active无法冒泡
(2)IE浏览器中,和
:标签触发active样式后无法还原
(3)移动端Safari浏览器下,:active伪类默认无效,可通过touch事件代替
(4)键盘无法触发:acitve伪类样式,按Enter键会触发点击事件
selector:focus 表示匹配聚焦状态的selector选择器元素。
有效范围:
应用场景:
常用于表单元素聚焦时的边框高亮显示
注意事项:
使用:focus来修改按钮的样式时,建议按钮就用button元素,而非span或div标签模拟的按钮。因为考虑到纯键盘无鼠标的场景,button元素可以通过键盘Tab触发聚焦,而span或div元素不行
selector:focus-within 表示当前selector选择器元素或者其子元素聚焦时都会匹配(而focus只会匹配对应元素本身)。说明子元素聚焦可以让父元素的样式变化
应用场景:
用于表单form或列表元素中设置子表单或子元素的一些通用样式
示例:
form表单中任一表单元素聚集时让所有表单元素前面文字高亮
<form class="form">
<label for="username">用户名:label><input id="username" type="text"/><br>
<label for="password">密码:label><input id="password" type="text"/>
form>
form:focus-within label{
color:darkblue;
text-shadow: 0 0 1px;
}
应用场景:
selector:focus-visible 匹配的场景是:元素聚焦,同时浏览器认为聚焦轮廓应该显示。
经典场景是一些元素(比如a元素)我们认为在点击时不应该有轮廓,而键盘访问时应该有轮廓。而此时当你遇到某个元素点击和键盘访问时都有轮廓时,你想修改成前面那样就可以用这个伪类。
换句话说:focus-visible可以判断是由键盘还是鼠标触发的聚焦行为
:focus:not(:focus-visible){
/*这里的focus-visible可以看作匹配是键盘聚焦*/
/*所以这里匹配不是键盘引发的聚焦行为(比如鼠标触发)*/
outline: 0;
}
selector:link 表示匹配页面上href链接没有被访问过的a元素
注意事项:
该伪类已基本被a标签所代替,直接设置a标签的样式即可
selector:visited 表示匹配页面上访问过的a元素
注意实项:
:visited支持的CSS属性有限,比如不支持before和after这类伪元素(即不支持a:visited::before或after)
使用:visited设置颜色时,UI表现上不支持本透明。要么纯色,要么全透明,例如不支持color:rgba(255,0,0,0.3)
使用:visited时,如果设置了某个属性的样式,目标元素原本使用:visited前并没有设置过该属性的样式,则该样式无效。即只能重置修改,不可凭空新建
示例:
a{
color:blue
}
a:visited{
color:yellow;
/*此时background-color不生效*/
background-color: red;
}
a{
color:blue;
background-color: green;
}
a:visited{
color:yellow;
/*此时background-color生效*/
background-color: red;
}
selector:any-link 表示匹配所有设置了href属性的链接元素以及匹配:link伪类和:visited的元素
应用场景:
:any-link是真正意义上的链接伪类
注意实项:
selector:target 表示匹配URL锚点对应的元素。例如http://xxx.com/#detail
,则可设置CSS样#detail:target
对应通过锚点链接跳转到id为detail的元素时的元素样式
注意实项:
即使部分浏览器支持a元素的name属性就是锚点值,点击时也会触发锚点跳转,但是考虑兼容性,还是建议统一用href来跳转锚点
用于表单元素是否禁用状态的切换,匹配是否设置了disabled属性的表单元素
应用场景:
注意实项:
用于匹配输入框元素是否只读还是可读可写,匹配是否设置了readonly属性的输入框元素
注意事项:
textarea[readonly]
来匹配一个输入框如果placeholder内容显示 ,则该伪类会匹配它
应用场景:
可通过该伪类判断输入框是否被输入了内容,并配合伪元素来显示提示信息:
<input placeholder="请输入姓名" type="text"><small>small>
input:placeholder-shown+small::before{
content:' 尚未输入内容'
}
该伪类匹配处于默认状态的表单元素
应用场景:
常用于匹配处于设置了selected属性的下拉框option元素,设置了checked属性的单复选框元素,添加额外样式让用户更加清楚默认值是什么。例如该伪类配合伪元素给一些默认值设置额外的提示信息来增强体验
注意事项:
该伪类匹配处于默认选中状态的单,复选框元素
注意事项:
为什么应该用:checked伪类而不是属性选择器[checked]:
该伪类匹配有效性验证是否通过的表单元素
应用场景:
HTML5中给表单元素提供了required(必输项),pattern(输入值正则匹配)等验证属性,当输入的内容并不符合这些属性规则时,就会匹配:invalid伪类,反之匹配:valid伪类
注意事项:
由于页面一加载便会执行CSS,如果我们设置了:invalid匹配样式,例如一些红色的警告提示样式,一进页面就显示这些会影响用户体验。鉴于此,新推出一个:user-invalid伪类,但是浏览器兼容性很差。还可通过js脚本来控制。
该伪类匹配是否设置了required属性的表单元素。只要表单元素没有设置required属性,就会匹配:optional伪类
对于XHTML和HTML文档,该伪类匹配的就是html根元素标签
应用场景:
由于现如今浏览器对CSS变量的支持,对于类似整站颜色,布局尺寸这样的变量,业界约定俗成变量由:root伪类负责,而html选择器负责样式
。虽然他俩实质是一样的。例如:
:root{
--blue:#2486ff;
--red:#f4615c;
--layerWidth:1190px
}
html{
overflow: auto;
}
注意事项:
:root伪类与html标签选择器的区别:
:empty选择器选择每个没有任何子级(包括文本节点)的元素。
应用场景:
注意事项:
selector:first-child 表示匹配作为其父元素的第一个子元素的selector元素
selector:last-child 表示匹配作为其父元素的最后一个子元素的selector元素
应用场景:
这两个伪类最常用于对列表元素的第一个/最后一个子元素的通用样式的重置。例如除了最后一个子元素,其他子元素都添加底部边框。
li{
border-bottom: 1px solid #cccccc;
}
li:last-child{
border-bottom:none
}
该伪类匹配没有任何兄弟元素的元素,或者说是父元素中唯一子元素的元素
注意事项:
selector:nth-child(n) 表示匹配第n个子元素的selector元素
selector:nth-last-child(n) 表示匹配从后往前数的第n个子元素的selector元素
应用场景:
这两个伪类适用于内容动态,无法确定的匹配场景(如通过异步请求获取的列表数据)。例如一些列表数据奇偶数子元素的背景颜色不同,前N个子元素的高亮显示等场景。如果数据是纯静态的,建议还是使用类名或属性选择器进行匹配
相关语法:
二者相关语法是统一的,以nth-child为例:
selector:nth-child(odd或even)
表示匹配作为其父元素的第奇数/偶数个子元素的selector元素
selector:nth-child(An+B)
表示匹配符合对应规则的子元素。
其中A,B,n均为不为负的整数,但A前面可以添加负号。
示例:
nth-child(5n)匹配第5,10,15…个子元素
nth-child(3n+4)匹配第4,7,10…个子元素
nth-child(-n+3)匹配前3个子元素
nth-last-child(-n+3)匹配最后3个子元素
注意事项:
selector:first-of-type 表示匹配与selector元素标签类型一致的第一个子元素
selector:last-of-type 表示匹配与selector元素标签类型一致的最后一个子元素
dl>:first-of-type{
color:red
}
<dl>
<dt>哈哈dt>
<dd>嘿嘿dd>
dl>
可以发现,dt和dt均匹配了该伪类,因为dt和dd都是dl的子元素中各自同类型标签元素的第一个子元素
selector::only-of-type匹配子元素中标签类型与selector元素一致且只有一个的selector元素,该伪类应用场景较少。
注意事项:
匹配:only-child的元素一定匹配:only-of-type,反之则不一定
selector:nth-of-type(n) 表示匹配与selector元素标签类型一致的子元素集合里第n个子元素
selector:nth-last-of-type(n) 表示与selector元素标签类型一致的子元素集合里的从后往前数的第n个子元素
相关语法:
与nth-child和nth-last-child伪类类似,这两个伪类也具有相同的语法格式。
应用场景:
主要适用于特定标签组合并且组合不断重复的场景,例如dl标签的子标签dt和dd的组合
注意事项:
:nth-of-type()和nth-last-of-type()这两个伪类的匹配范围是所有相同标签的相邻元素,而nth-child和nth-last-child伪类则匹配所有相邻元素,无视元素类型
、
selector:not()是否定伪类,如果selector元素与()里的选择器不匹配,则会匹配该伪类
应用场景:
使用:not()伪类不仅便于理解,而且保护了原有选择器的优先级,利于维护。它的经典场景适用于一些CSS样式的重置,比如对通用样式的一些例外和特殊情况的处理
注意事项:
:is()伪类可以把括号中的选择器依次分配出去,对于那种复杂的有很多逗号分隔的选择器非常有用
示例:
.test>img,.test1>img,.test2>img,.test3>img{
}
可以通过is伪类简写成下面这样:
:is(.test,.test1,.tes2,.test3)>img{
}
注意事项:
:is()伪类自身优先级为0,最终的优先级由()里参数优先级最高的那个选择器决定
示例:
:is(#article,.section) p{
}
由于id选择器(#article)优先级大于class类选择器(.section),这段选择器的最终优先级等同于#article p
:where()伪类的含义,语法和作用与:is()伪类一致,唯一的区别在于:where()的最终优先级(包括括号里的选择器)始终为0
示例:
:where(#article,#section) .content的最终优先级等同于.content
文章参考资料:张鑫旭《CSS选择器世界》