![HTML5 移动Web开发从入门到精通(微课精编版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/739/26542739/b_26542739.jpg)
2.6 伪选择器
伪选择器包括伪类选择器和伪对象选择器,伪选择器能够根据元素或对象的特征、状态、行为进行匹配。
伪选择器以冒号(:)作为前缀标识符。冒号前可以添加限定选择符,限定伪类应用的范围,冒号后为伪类和伪对象名,冒号前后没有空格。
CSS伪类选择器有以下两种用法方式。
单纯式
E:pseudo-class { property:value}
其中E为元素,pseudo-class为伪类名称,property是CSS的属性,value为CSS的属性值。例如:
a:link {color:red;}
混用式
E.class:pseudo-class{property:value}
其中.class表示类选择符。把类选择符与伪类选择符组成一个混合式的选择器,能够设计更复杂的样式,以精准匹配元素。例如:
a.selected:hover {color: blue;}
CSS3支持的伪类选择器具体说明如表2.1所示,CSS3支持的伪对象选择器具体说明如表2.2所示。
表2.1 伪类选择器列表
![](https://epubservercos.yuewen.com/F4799D/15056702905210706/epubprivate/OEBPS/Images/Figure-T50_46650.jpg?sign=1739524974-djFAg35xt7lEcl0Yj7bNXC3TxKJBA7wU-0-1152aa22d2ee630085eca519ea897f86)
表2.2 伪对象选择器列表
![](https://epubservercos.yuewen.com/F4799D/15056702905210706/epubprivate/OEBPS/Images/Figure-T51_46651.jpg?sign=1739524974-jRjnhzSVB89Lsp8Obyaj9JHHUUf8Cphx-0-57c784ce9433af6898ca23f7061bff6c)
由于CSS3伪选择器众多,下面仅针对CSS3中新增的伪类选择器进行说明,其他选择器请读者参考CSS3参考手册详细了解。
2.6.1 结构伪类
结构伪类是根据文档结构的相互关系来匹配特定的元素,从而减少文档元素的class属性和ID属性的无序设置,使得文档更加简洁。
结构伪类形式多样,但用法固定,以便设计各种特殊样式效果,结构伪类主要包括下面几种,简单说明如下。
:fist-child:第一个子元素。
:last-child:最后一个子元素。
:nth-child():按正序匹配特定子元素。
:nth-last-child():按倒序匹配特定子元素。
:nth-of-type():在同类型中匹配特定子元素。
:nth-last-of-type():按倒序在同类型中匹配特定子元素。
:first-of-type:第一个同类型子元素。
:last-of-type:最后一个同类型子元素。
:only-child:唯一子元素。
:only-of-type:同类型的唯一子元素。
:empty:空元素。
【示例1】下面的示例设计了排行榜栏目列表样式,效果如图2.17所示。在列表框中为每个列表项定义相同的背景图像。
![](https://epubservercos.yuewen.com/F4799D/15056702905210706/epubprivate/OEBPS/Images/Figure-P52_17885.jpg?sign=1739524974-5PgxJ34oRGa8ZExfy6jabUkDpbdCp5ZK-0-f8f6c3b221ed0d0b562b768aec50a17d)
图2.17 设计推荐栏目样式
设计列表结构,代码如下。
![](https://epubservercos.yuewen.com/F4799D/15056702905210706/epubprivate/OEBPS/Images/Figure-P52_46654.jpg?sign=1739524974-wISSBCFULPL0KrrqymsrsU0mg6p3tYR3-0-35098447bb44ba0703b5c299e8aee068)
设计的列表样式请参考本节示例源代码。下面结合本示例分析结构伪类选择器的用法。
1. :first-child
【示例2】如果设计第一个列表项前的图标为1,且字体加粗显示,则使用:first-child匹配。
![](https://epubservercos.yuewen.com/F4799D/15056702905210706/epubprivate/OEBPS/Images/Figure-P52_46656.jpg?sign=1739524974-UTKoB7cVJcEU3YXKRLIuGW88UzkwM5Uj-0-88c43dbe1c6dc394037f0137c51331fe)
2. : last-child
【示例3】如果单独给最后一个列表项定义样式,就可以使用:last-child来匹配。
#wrap li:last-child {background-position:2px -277px;}
显示效果如图2.18所示。
3. :nth-child()
:nth-child()可以选择一个或多个特定的子元素。它有如下多种用法。
![](https://epubservercos.yuewen.com/F4799D/15056702905210706/epubprivate/OEBPS/Images/Figure-P53_17927.jpg?sign=1739524974-pgxPJKqVEWekLXySjF5WbLQCFaNYrVJG-0-d3ee61853e1fc44b344c7801487b1959)
在:nth-child()中,参数length为一个整数,n表示一个从0开始的自然数。
:nth-child()可以定义值,值可以是整数,也可以是表达式,用来选择特定的子元素。
【示例4】下面6个样式分别匹配列表中第2 ~ 7个列表项,并分别定义它们的背景图像Y轴坐标位置,显示效果如图2.19所示。
![](https://epubservercos.yuewen.com/F4799D/15056702905210706/epubprivate/OEBPS/Images/Figure-P53_46658.jpg?sign=1739524974-cAZRrBmk0JYCwJL20MQidTrpSo7rIYcO-0-eafeef9a0f70a6e0aedad8b451e679f8)
![](https://epubservercos.yuewen.com/F4799D/15056702905210706/epubprivate/OEBPS/Images/Figure-P53_17930.jpg?sign=1739524974-yVrqZOKcrBVOqdOSrMh2dxFsf9bu6NP6-0-25e74023ea6c0733a446864540ce3d60)
图2.18 设计最后一个列表项样式
![](https://epubservercos.yuewen.com/F4799D/15056702905210706/epubprivate/OEBPS/Images/Figure-P53_17931.jpg?sign=1739524974-aDZycUfTRkNwSYbHE66mmHfc9nj4oCon-0-47980f04a22afbfeba48192a91993f25)
图2.19 设计每个列表项样式
注意,这种函数参数用法不能引用负值,也就是说li:nth-child(-3)是不正确的使用方法。
:nth-child(n)
在:nth-child(n)中,n是一个简单的表达式,它取值是从0开始计算的,到什么时候结束是不确定的,需结合文档结构而定,如果在实际应用中直接这样使用的话,将会选中所有子元素。
【示例5】在上面的示例中,如果在li中使用:nth-child(n),那么将选中所有的li元素。
#wrap li:nth-child(n) {text-decoration:underline;}
则这个样式类似于:
#wrap li {text-decoration:underline;}
其实,nth-child(n)是这样计算的:
n=0:表示没有选择元素。
n=1:表示选择第一个li元素。
n=2:表示选择第二个li元素。
依此类推,这样下来就选中了所有的li元素。
:nth-child(2n)
【示例6】:nth-child(2n)是:nth-child(n)的一种变体,使用它可以选择n的2倍数,当然其中2可以换成需要的数字,分别表示不同的倍数。
#wrap li:nth-child(2n) {font-weight:bold;}
等价于:
#wrap li:nth-child(even) {font-weight:bold;}
预览效果如图2.20所示。
![](https://epubservercos.yuewen.com/F4799D/15056702905210706/epubprivate/OEBPS/Images/Figure-P54_17960.jpg?sign=1739524974-gL6m39jx58b3cXijtJoomP7gvNZUvZz8-0-96dc82700fd00cd845a6ae5a386769c9)
图2.20 设计偶数行列表项样式
其实现过程如下。
当n=0,则2n=0,表示没有选中任何元素。
当n=1,则2n=2,表示选择了第二个li元素。
当n=2,则n=4,表示选择了第四个li元素。
依此类推。
如果是2n,这样与使用even命名class定义样式所起到的效果是一样的。
:nth-child(2n-1)
【示例7】:nth-child(2n-1)是在:nth-child(2n)基础上演变来的,既然:nth-child(2n)表示选择偶数,那么在它的基础上减去1就变成奇数选择。
#wrap li:nth-child(2n-1) {font-weight:bold;}
等价于:
#wrap li:nth-child(odd) {font-weight:bold;}
其实现过程如下。
当n=0,则2n-1=-1,表示没有选中任何元素。
当n=1,则2n-1=1,表示选择第一个li元素。
当n=2,则2n-1=3,表示选择第三个li元素。
依此类推。
其实这种奇数效果,还可以使用:nth-child(2n+1)和:nth-child(odd)来实现。
:nth-child(n+5)
【示例8】:nth-child(n+5)是从第五个子元素开始选择。
li:nth-child(n+5) {font-weight:bold;}
其实现过程如下。
当n=0,则n+5=5,表示选中第五个li元素。
当n=1,则n+5=6,表示选择第六个li元素。
依此类推。
可以使用这种方法选择需要开始选择的元素位置,也就是说换了数字,起始位置就变了。
:nth-child(-n+5)
【示例9】:nth-child(-n+5)刚好和:nth-child(n+5)相反,是选择第五个前面的子元素。
li:nth-child(-n+5) {font-weight:bold;}
其实现过程如下。
当n=0,则-n+5=5,表示选择了第五个li元素。
当n=1,则-n+5=4,表示选择了第四个li元素。
当n=2,则-n+5=3,表示选择了第三个li元素。
当n=3,则-n+5=2,表示选择了第二个li元素。
当n=4,则-n+5=1,表示选择了第一个li元素。
当n=5,则-n+5=0,表示没有选择任何元素。
:nth-child(5n+1)
:nth-child(5n+1)是实现隔几选一的效果。
【示例10】如果是隔三选一,则定义的样式如下。
li:nth-child(3n+1) {font-weight:bold;}
其实现过程如下。
当n=0,则3n+1=1,表示选择了第一个li元素。
当n=1,则3n+1=4,表示选择了第四个li元素。
当n=2,则3n+1=7,表示选择了第七个li元素。
设计效果如图2.21所示。
![](https://epubservercos.yuewen.com/F4799D/15056702905210706/epubprivate/OEBPS/Images/Figure-P56_18025.jpg?sign=1739524974-1oCuwGCLDWtsmDFK8EdomGFJOMlkPJim-0-10dc5b0c5bb9c4a29c5fe176e89f827f)
图2.21 设计隔三选一行列表项样式
4. :nth- last-child()
【示例11】:nth-last-child()与:nth-child()相似,但作用与:nth-child不一样,:nth-last-child()只是从最后一个元素开始计算,来选择特定元素。
li:nth-last-child(4) {font-weight:bold;}
上面代码表示选择倒数第四个列表项。
其中:nth-last-child(1)和:last-child所起的作用是一样的,都表示选择最后一个元素。
另外,:nth-last-child()与:nth-child()用法相同,可以使用表达式来选择特定元素,下面来看几个特殊的表达式所起的作用。
:nth-last-child(2n)表示从元素后面计算,选择的是偶数个数,反过来说就是选择元素的奇数,与前面的:nth-child(2n+1)、:nth-child(2n-1)、:nth-child(odd)所起的作用是一样的。例如:
li:nth-last-child(2n) { font-weight:bold;} li:nth-last-child(even) {font-weight:bold;}
等价于:
li:nth-child(2n+1) {font-weight:bold;} li:nth-child(2n-1) {font-weight:bold;} li:nth-child(odd) {font-weight:bold;}
:nth-last-child(2n-1)刚好与上面相反,从后面计算选择的是奇数,而从前面计算选择的就是偶数了,例如:
li:nth-last-child(2n+1) {font-weight:bold;} li:nth-last-child(2n-1) {font-weight:bold;} li:nth-last-child(odd) {font-weight:bold;}
等价于:
li:nth-child(2n) {font-weight:bold;} li:nth-child(even) {font-weight:bold;}
总之,:nth-last-child()和nth-child()的使用方法是一样的,只不过它们的区别是::nth-child()是从元素的第一个开始计算,而:nth-last-child()是从元素的最后一个开始计算,它们的计算方法都是一样的。
5. :nth-of-type()
:nth-of-type()类似:nth-child(),不同的是它只计算选择器中指定的那个元素。它适合用于过滤中包含了多种不同类型的子元素。
【示例12】在div#wrap中包含有p、li、img等元素,但现在只需要选择p元素,并让它每隔一个p元素就有不同的样式,可以简单地写成:
div#wrap p:nth-of-type(even) { font-weight:bold;}
其实,这种用法与:nth-child()是一样的,也可以使用:nth-child()来实现,唯一不同的是:nth-of-type()指定了元素的类型。
6. :nth-last-of-type()
:nth-last-of-type()与:nth-last-child()用法相同,但它指定了子元素的类型,除此之外,语法形式和用法基本相同。
7. :first-of-type和:last-of-type
:first-of-type和:last-of-type类似于:first-child和:last-child,不同之处是它们指定了元素的类型。
8. :only-child和:only-of-type
:only-child表示一个元素是它的父元素的唯一一个子元素。
【示例13】在文档中设计HTML结构,代码如下。
![](https://epubservercos.yuewen.com/F4799D/15056702905210706/epubprivate/OEBPS/Images/Figure-P57_46693.jpg?sign=1739524974-dLt5pUaIxQwDfPEeG3Ylo44ipYZlSA1J-0-7de0e846a1b10afb1788bd43a6155fba)
如果需要在div.post只有一个p元素的时候,改变这个p元素的样式,可以使用:only-child来实现。例如:
.post p {font-weight:bold;} .post p:only-child {background: red;}
此时div.post只有一个子元素p时,它的背景色将会显示为红色。
:only-of-type表示一个元素包含很多个子元素,而其中只有一个子元素是唯一的,那么使用这种选择方法就可以选中这个唯一的子元素。例如:
![](https://epubservercos.yuewen.com/F4799D/15056702905210706/epubprivate/OEBPS/Images/Figure-P57_46697.jpg?sign=1739524974-yYephxLIkeKryPk0FHuoLHgqhyVsnnMZ-0-23e2bc453180868338e070675fa4d2ea)
如果只想选择上面结构块中的p元素,可以这样写:
.post p:only-of-type{background-color:red;}
9. :empty
:empty是用来选择没有任何内容的元素,这里没有内容指的是一点内容都没有,包括空格。
【示例14】下面的示例有3个段落,其中一个段落什么都没有,完全是空的。
![](https://epubservercos.yuewen.com/F4799D/15056702905210706/epubprivate/OEBPS/Images/Figure-P58_46701.jpg?sign=1739524974-Fub4QIuUfpqOjqldWExkQjsz5ozo9LtK-0-12c2eedafa8f70b873c8beafbdbed1c8)
如果想设计这个p元素不显示,可以这样来写:
.post p:empty {display: none;}
2.6.2 否定伪类
:not()表示否定选择器,即过滤掉not()匹配的特定元素。
【示例】下面的示例为页面中所有段落文本设置字体大小为24像素,然后使用:not(.author)排出第一段文本,设置其他段落文本的字体大小为14像素,显示效果如图2.22所示。
![](https://epubservercos.yuewen.com/F4799D/15056702905210706/epubprivate/OEBPS/Images/Figure-P58_46705.jpg?sign=1739524974-1vpTRAggRtOeKpPomYMSJDeEAaLA7sjp-0-e5b6a403cc284fc94b218e645c25a3b7)
![](https://epubservercos.yuewen.com/F4799D/15056702905210706/epubprivate/OEBPS/Images/Figure-P58_18125.jpg?sign=1739524974-rgCHC45gcphwdQ0MZRGwJ4oqucigQnTf-0-945318c9784851405949a8c75a4d6bbf)
图2.22 否定伪类的应用
2.6.3 状态伪类
CSS3包含3个UI状态伪类选择器,简单说明如下。
: enabled:匹配指定范围内所有可用UI元素。
:disabled:匹配指定范围内所有不可用UI元素。
:checked:匹配指定范围内所有可用UI元素。
【示例】下面的示例设计了一个简单的登录表单,效果如图2.23所示。在实际应用中,当用户登录完毕,不妨通过脚本把文本框设置为不可用(disabled="disabled")状态,这时可以通过:disabled选择器让文本框显示为灰色,以告诉用户该文本框不可用了,这样就不用设计“不可用”样式类,并把该类添加到HTML结构中。
![](https://epubservercos.yuewen.com/F4799D/15056702905210706/epubprivate/OEBPS/Images/Figure-P59_18182.jpg?sign=1739524974-ys6ZyYKRaPFo279kjqxb8CkwQZGON4mr-0-321808ac989fa596961e8efa21f9a4a3)
图2.23 设计登录表单样式
第1步,新建一个HTML文档,在文档中构建一个简单的登录表单结构,代码如下。
![](https://epubservercos.yuewen.com/F4799D/15056702905210706/epubprivate/OEBPS/Images/Figure-P59_46709.jpg?sign=1739524974-DEkFWxjFKPiHq9lrSAgHvrwbyzM7Pio9-0-97a89a75c4c83803284277d08088ccd3)
在这个表单结构中,使用HTML的disabled属性分别定义两个不可用的文本框对象。
第2步,内建一个内部样式表,使用属性选择器定义文本框和密码域的基本样式。
![](https://epubservercos.yuewen.com/F4799D/15056702905210706/epubprivate/OEBPS/Images/Figure-P59_46711.jpg?sign=1739524974-mRrwCCE1N0Pz7FmwSGULtLy7Us9rc0kN-0-d3ee4a26e92de7c3f285adf528dde320)
第3步,利用属性选择器,分别为文本框和密码域定义内嵌标识图标。
input[type="text"] { background:url(images/name.gif) no-repeat 2px 2px; } input[type="password"] { background:url(images/password.gif) no-repeat 2px 2px; }
第4步,使用状态伪类选择器,定义不可用表单对象显示为灰色,以提示用户该表单对象不可用。
![](https://epubservercos.yuewen.com/F4799D/15056702905210706/epubprivate/OEBPS/Images/Figure-P59_46715.jpg?sign=1739524974-nseEoW62VXA1kXpxoL9OymmNAixCfeej-0-8730222ecd960bf921fc00403ac91347)
2.6.4 目标伪类
目标伪类选择器类型形式如E:target,它表示选择匹配E的所有元素,且匹配元素被相关URL指向。该选择器是动态选择器,只有当存在URL指向该匹配元素时,样式效果才有效。
【示例】下面的示例设计了当单击页面中的锚点链接,跳转到指定标题位置时,该标题会自动高亮显示,以提醒用户,当前跳转的位置,效果如图2.24所示。
![](https://epubservercos.yuewen.com/F4799D/15056702905210706/epubprivate/OEBPS/Images/Figure-P60_46717.jpg?sign=1739524974-DiSkZDakY29clCmwhNm2j2Q0wE1bEOEV-0-f5e9958dadfb56322a0bc89e93e80b02)
![](https://epubservercos.yuewen.com/F4799D/15056702905210706/epubprivate/OEBPS/Images/Figure-P60_18248.jpg?sign=1739524974-2xYsMYxbPPNcKjwxuDAnmuWvSHMhWbS2-0-f28bc455a9092f06fea1ca4d6a5d7dc6)
图2.24 目标伪类样式应用效果