![CSS3网页设计从入门到精通(微课精编版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/800/26846800/b_26846800.jpg)
2.5 伪类选择器
伪类选择器是一种特殊的类选择器,它的用处就是可以对不同状态或行为下的元素定义样式,这些状态或行为是无法通过静态的选择器匹配的,具有动态特性。
2.5.1 伪选择器概述
伪选择器包括伪类选择器和伪对象选择器,伪选择器能够根据元素或对象的特征、状态、行为进行匹配。
伪选择器以冒号(:)作为前缀标识符。冒号前可以添加限定选择符,限定伪类应用的范围,冒号后为伪类和伪对象名,冒号前后没有空格。
CSS伪类选择器有两种用法。
1. 单纯式
E:pseudo-class {property:value}
其中E为元素,pseudo-class为伪类名称,property为CSS的属性,value为CSS的属性值。例如:
a:link {color:red;}
2. 混用式
E.class:pseudo-class{property:value}
其中.class表示类选择符。把类选择符与伪类选择符组成一个混合式的选择器,能够设计更复杂的样式,以精准匹配元素。例如:
a.selected:hover {color: blue;}
CSS3支持的伪类选择器具体说明如表2.4所示,CSS3支持的伪对象选择器具体说明如表2.5所示。
由于CSS3伪选择器众多,下面仅针对CSS3中新增的伪类选择器进行说明,其他选择器请读者参考CSS3参考手册详细了解。
2.5.2 结构伪类
结构伪类是根据文档结构的相互关系来匹配特定的元素,从而减少文档元素的class属性和ID属性的无序设置,使得文档更加简洁。
结构伪类形式多样,但用法固定,以便设计各种特殊样式效果。结构伪类主要包括下面几种。
:first-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.15所示。在列表框中为每个列表项定义相同的背景图像。
![](https://epubservercos.yuewen.com/F92AA6/15289822105524506/epubprivate/OEBPS/Images/Figure-P45_16157.jpg?sign=1739549500-gK8uZBbpSi6bjUSMnjpib38lFdmDmUcZ-0-c50781183eb3dfb7f536667a08042403)
图2.15 排行榜栏目样式
设计列表结构如下:
![](https://epubservercos.yuewen.com/F92AA6/15289822105524506/epubprivate/OEBPS/Images/Figure-P45_86052.jpg?sign=1739549500-Uy41EgkGzPqKsrPyjBBlqfTIUnDJhCdX-0-4afcda745924079b3092eaeb4ec7b8d6)
设计的列表样式请参考本节示例源代码。下面以示例1为基础分析结构伪类选择器的用法。
1. :first-child
【示例2】设计第一个列表项前的图标为1,且字体加粗显示。
使用:first-child匹配,代码如下:
![](https://epubservercos.yuewen.com/F92AA6/15289822105524506/epubprivate/OEBPS/Images/Figure-P45_86053.jpg?sign=1739549500-n53aPTZut8lFjq59eYcMo1O6AJeMtkr4-0-8b0578a2a6d379852a6d694e0378ae8e)
2. : last-child
【示例3】单独给最后一个列表项定义样式。
使用:last-child来匹配,代码如下:
#wrap li:last-child {background-position:2px -277px;}
显示效果如图2.16所示。
![](https://epubservercos.yuewen.com/F92AA6/15289822105524506/epubprivate/OEBPS/Images/Figure-P46_16358.jpg?sign=1739549500-tMNPmNSSHGbd4b2Yk5lLn1jDquZbH0HJ-0-58416c490ed48cce8f0133caf9501e86)
图2.16 设计最后一个列表项样式
3. :nth-child()
:nth-child()可以选择一个或多个特定的子元素。该函数有多种用法:
![](https://epubservercos.yuewen.com/F92AA6/15289822105524506/epubprivate/OEBPS/Images/Figure-P46_86054.jpg?sign=1739549500-F9SQ7pIASuoX94TxEnyNltj8p5srebOX-0-36574968d5ee91685491d9587c4bb0ea)
在nth-child()函数中,参数length和n均为整数。
:nth-child()可以定义值,值可以是整数,也可以是表达式,用来选择特定的子元素。
【示例4】下面6个样式分别匹配列表中第2~7个列表项,并分别定义它们的背景图像Y轴坐标位置,显示效果如图2.17所示。
![](https://epubservercos.yuewen.com/F92AA6/15289822105524506/epubprivate/OEBPS/Images/Figure-P46_86055.jpg?sign=1739549500-umnpUSydIolOxBn2toNVcGd9gXMhWAsf-0-d791afdb0c44df90a28dcf02d38e0e99)
![](https://epubservercos.yuewen.com/F92AA6/15289822105524506/epubprivate/OEBPS/Images/Figure-P46_16359.jpg?sign=1739549500-21F8nTBqjtbAxjT8MkQs7tkwGohnZExs-0-c1a35ddfaa591d12629ec52e4967cb89)
图2.17 设计每个列表项样式
注意::nth-child()函数的参数不能引用负值,如li:nth-child(-3)是不正确的使用方法。
(1):nth-child(n)
在:nth-child(n)中,n是一个简单的表达式,其取值从0开始计算,到什么时候结束是不确定的,须结合文档结构而定,如果在实际应用中直接这样使用,将会选中所有子元素。
在示例4中,如果在li中使用:nth-child(n),那么将选中所有的li元素:
#wrap li:nth-child(n) {text-decoration:underline;}
这个样式类似于:
#wrap li {text-decoration:underline;}
其实,nth-child()是这样计算的:
n=0表示没有选择元素。
n=1表示选择第1个li。
n=2表示选择第2个li。
依此类推,这样下来就选中了所有的li。
(2):nth-child(2n)
:nth-child(2n)是:nth-child(n)的一种变体,使用它可以选择n的倍数(其中2可以换成需要的数字,分别表示不同的倍数)。
#wrap li:nth-child(2n) {font-weight:bold;}
等价于:
#wrap li:nth-child(even) {font-weight:bold;}
预览效果如图2.18所示。
![](https://epubservercos.yuewen.com/F92AA6/15289822105524506/epubprivate/OEBPS/Images/Figure-P47_16437.jpg?sign=1739549500-8XvGyk9aqcYExmLmcDzuRzBMZbLknemJ-0-107d87f45cd8fec7a06f2e70a76a389d)
图2.18 设计偶数行列表项样式
其实现过程如下:
当n=0,则2n=0,表示没有选中任何元素。
当n=1,则2n=2,表示选择第2个li。
当n=2,则2n=4,表示选择第4个li。
依此类推。
如果是2n,则与使用even命名class定义样式所起到的效果是一样的。
(3):nth-child(2n-1)
: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,表示选择第1个li。
当n=2,则2n-1=3,表示选择第3个li。
依此类推。
奇数效果还可以使用:nth-child(2n+1)和:nth-child(odd)来实现。
(4):nth-child(n+5)
:nth-child(n+5)选择器是从第5个子元素开始选择。
li:nth-child(n+5) {font-weight:bold;}
其实现过程如下:
当n=0,则n+5=5,表示选择第5个li。
当n=1,则n+5=6,表示选择第6个li。
依此类推。
可以使用这种方法设置需要开始选择的元素位置,也就是说更改数字,可更改起始位置。
(5):nth-child(-n+5)
:nth-child(-n+5)选择器刚好和:nth-child(n+5)选择器相反,它选择第5个元素前面的子元素。
li:nth-child(-n+5) {font-weight:bold;}
其实现过程如下:
当n=0,则-n+5=5,表示选择第5个li。
当n=1,则-n+5=4,表示选择第4个li。
当n=2,则-n+5=3,表示选择第3个li。
当n=3,则-n+5=2,表示选择第2个li。
当n=4,则-n+5=1,表示选择第1个li。
当n=5,则-n+5=0,表示没有选择任何元素。
(6):nth-child(5n+1)
:nth-child(5n+1)选择器是实现隔几选一的效果。如果是隔三选一,则定义的样式如下:
li:nth-child(3n+1) {font-weight:bold;}
其实现过程如下:
当n=0,则3n+1=1,表示选择第1个li。
当n=1,则3n+1=4,表示选择第4个li。
当n=2,则3n+1=7,表示选择第7个li。
设计效果如图2.19所示。
![](https://epubservercos.yuewen.com/F92AA6/15289822105524506/epubprivate/OEBPS/Images/Figure-P48_16471.jpg?sign=1739549500-HbslOQhXidEfYT0xItOPwO9KTUuMNBAT-0-8ea9efe73020666dfd4a51bb25da8977)
图2.19 设计隔三选一行列表项样式
4. :nth- last-child()
:nth-last-child()选择器与:nth-child()相似,但作用与:nth-child不一样,:nth-last-child()是从最后一个元素开始计算,来选择特定元素。
li:nth-last-child(4) {font-weight:bold;}
上面代码表示选择倒数第4个列表项。
其中: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)所起的作用是一样的。如:
![](https://epubservercos.yuewen.com/F92AA6/15289822105524506/epubprivate/OEBPS/Images/Figure-P49_86056.jpg?sign=1739549500-ozAVJLMBq2kuCJjx7z6DiHKXdCj8YbxC-0-41352d583831d4d0f567d5fe3ff266bb)
等价于:
![](https://epubservercos.yuewen.com/F92AA6/15289822105524506/epubprivate/OEBPS/Images/Figure-P49_86057.jpg?sign=1739549500-lq2WE5e9OlslTIrSLl0g9DFf4wumVH6J-0-3af62cc0e6bbbbc835c274cf0b697fed)
:nth-last-child(2n-1)选择器刚好与:nth-last-child(2n)相反,它从后面计算选择的是奇数,而从前面计算选择的就是偶数位了,如:
![](https://epubservercos.yuewen.com/F92AA6/15289822105524506/epubprivate/OEBPS/Images/Figure-P49_86058.jpg?sign=1739549500-0fZBeFRFulfIGX4usqiGfpdVepsrO43j-0-1c5945ccb7fc6d5f1fd166be4fd1f9da)
等价于:
![](https://epubservercos.yuewen.com/F92AA6/15289822105524506/epubprivate/OEBPS/Images/Figure-P49_86059.jpg?sign=1739549500-AASScAnuEg6Cf37589rKrEdJ7uMlGRkD-0-0bf9cc674855ba1f2b024c4794c69448)
总之,:nth-last-child()和nth-child()使用方法是一样的,只不过:nth-child()是从元素的第一个开始计算,而:nth-last-child()是从元素的最后一个开始计算,它们的计算方法都是一样的。
5. :nth-of-type()
:nth-of-type()类似于:nth-child(),不同的是它只计算选择器中指定的那个元素。:nth-of-type()选择器用来定位元素中包含好多不同类型的子元素时很有用处。
【示例5】在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表示一个元素是它的父元素的唯一子元素。
【示例6】在文档中设计如下HTML结构。
![](https://epubservercos.yuewen.com/F92AA6/15289822105524506/epubprivate/OEBPS/Images/Figure-P49_86060.jpg?sign=1739549500-wEIyuDxr9vspyHkU01ebSAr6XgJ434KH-0-93c867f2515e4811b0de9864ede712b1)
如果需要使div.post只有一个p元素时,改变p的样式,可以使用:only-child选择器来实现。
![](https://epubservercos.yuewen.com/F92AA6/15289822105524506/epubprivate/OEBPS/Images/Figure-P50_86062.jpg?sign=1739549500-I9eNXlMcWW2JgtEpL8U4nSSUiGXmf8k4-0-ba64c837a94fd29e097ea7d629e1af90)
此时若div.post只有一个子元素p,那么它的背景色将会显示为红色。
:only-of-type表示一个元素包含很多个子元素,而其中只有一个子元素是唯一的,那么使用这种选择方法就可以选中这个唯一的子元素。例如:
![](https://epubservercos.yuewen.com/F92AA6/15289822105524506/epubprivate/OEBPS/Images/Figure-P50_86063.jpg?sign=1739549500-el2AlFSWRwY7jxcjIa4sSJay5UTaPuLE-0-af4a730c7d0a2c230063bce867468ea8)
如果只想选择上面结构块中的p元素,就可以这样写:
.post p:only-of-type{background-color:red;}
9. :empty
:empty用来选择没有任何内容的元素,这里没有内容指的是一点内容都没有,包括空格。
【示例7】以下有3个段落,其中一个段落什么都没有,完全是空的:
![](https://epubservercos.yuewen.com/F92AA6/15289822105524506/epubprivate/OEBPS/Images/Figure-P50_86064.jpg?sign=1739549500-mvZSnq2KXicl37Kw6zujPiC5Emd0sm65-0-2e8766c279f348f0515c8e76b6804e53)
如果想设计这个p不显示,那就可以这样来写:
.post p:empty {display: none;}
2.5.3 否定伪类
:not()表示否定选择器,即过滤掉not()函数匹配的特定元素。
【示例】下面示例为页面中所有段落文本设置字体大小为24px,然后使用:not(.author)排除第一段文本,设置其他段落文本的字体大小为14px,显示效果如图2.20所示。
![](https://epubservercos.yuewen.com/F92AA6/15289822105524506/epubprivate/OEBPS/Images/Figure-P50_86065.jpg?sign=1739549500-3nltNtow5QzkEcywZRh5V256elhqQjq7-0-3a1213750ef27bb168382161179f91fb)
![](https://epubservercos.yuewen.com/F92AA6/15289822105524506/epubprivate/OEBPS/Images/Figure-P51_16803.jpg?sign=1739549500-3cLYIR56YKpinJ52ALyRG0mRxPM7upHS-0-8aaccd6652ac990b96c31e50002584ba)
图2.20 否定伪类的应用
2.5.4 状态伪类
CSS3包含3个UI状态伪类选择器,简单说明如下。
: enabled:匹配指定范围内所有可用UI元素。
:disabled:匹配指定范围内所有不可用UI元素。
:checked:匹配指定范围内所有可用UI元素。
【示例】下面示例设计一个简单的登录表单,效果如图2.21所示。在实际应用中,当用户登录完毕,不妨通过脚本把文本框设置为不可用(disabled="disabled")状态,这时可以通过:disabled选择器让文本框显示为灰色,以告诉用户该文本框已不可用,这样就不用设计“不可用”样式类,并把该类添加到HTML结构中。
![](https://epubservercos.yuewen.com/F92AA6/15289822105524506/epubprivate/OEBPS/Images/Figure-P51_16808.jpg?sign=1739549500-QP3rRFUsF375hrCQYuW3EcaTuHof6xcu-0-5dd77b36d4b299805af9f5d7bdbc6454)
图2.21 设计登录表单样式
【操作步骤】
第1步,新建一个文档,在文档中构建一个简单的登录表单结构。
![](https://epubservercos.yuewen.com/F92AA6/15289822105524506/epubprivate/OEBPS/Images/Figure-P51_86067.jpg?sign=1739549500-LqT67sKXi0C3Odlk3MK9Q9pWnU15FjqP-0-9abd417151e76b41ac69f7ed411c6507)
在这个表单结构中,使用HTML的disabled属性分别定义两个不可用的文本框对象。
第2步,内建一个内部样式表,使用属性选择器定义文本框和密码域的基本样式。
![](https://epubservercos.yuewen.com/F92AA6/15289822105524506/epubprivate/OEBPS/Images/Figure-P52_86068.jpg?sign=1739549500-tVpQbl0sJy7xpB8LIU3z0IODh6xK2kmI-0-b88cc6c18aea51461a49b766f1e4be9e)
第3步,利用属性选择器,分别为文本框和密码域定义内嵌标识图标。
![](https://epubservercos.yuewen.com/F92AA6/15289822105524506/epubprivate/OEBPS/Images/Figure-P52_86069.jpg?sign=1739549500-K4CzW7FQXBlmDCHwfRgbQiXT15m8GIwa-0-86d4c9938ac2996497f78b488820a440)
第4步,使用状态伪类选择器,定义不可用表单对象显示为灰色,以提示用户该表单对象不可用。
![](https://epubservercos.yuewen.com/F92AA6/15289822105524506/epubprivate/OEBPS/Images/Figure-P52_86070.jpg?sign=1739549500-5LWBEyQgbLqwildSLGZcsbI49QIPCAtg-0-f479cfd36dae8b16cc9e96950d9229fa)
2.5.5 目标伪类
目标伪类选择器类型形式如E:target,它表示选择匹配E的所有元素,且匹配元素被相关URL指向。该选择器是动态选择器,只有当存在URL指向该匹配元素时,样式效果才有效。
【示例】下面示例设计当单击页面中的锚点链接,跳转到指定标题位置时,该标题会自动高亮显示,以提醒用户当前跳转的位置,效果如图2.22所示。
![](https://epubservercos.yuewen.com/F92AA6/15289822105524506/epubprivate/OEBPS/Images/Figure-P52_86071.jpg?sign=1739549500-d4JQEFWwhxoAKlocmLLSiDrXKgDmaUEV-0-a9f9c30854b6d068268fb0250cee139d)
![](https://epubservercos.yuewen.com/F92AA6/15289822105524506/epubprivate/OEBPS/Images/Figure-P53_17109.jpg?sign=1739549500-Do92y9Lr43al8C5FxVepyDT6MLskxnzh-0-fc27eb5378c5d6a4ea9c7fa207f9d89f)
图2.22 目标伪类样式应用效果
2.5.6 动态伪类
动态伪类是一类行为类样式,只有当用户与页面进行交互时有效。包括以下两种形式。
锚点伪类,如:link、:visited。
行为伪类,如:hover、:active和:focus。
【示例】下面示例使用动态伪类选择器设计一组3D动态效果的按钮样式,效果如图2.23所示。
![](https://epubservercos.yuewen.com/F92AA6/15289822105524506/epubprivate/OEBPS/Images/Figure-P53_17114.jpg?sign=1739549500-6QMtnjdn4RDWzNVP4DF7lSI73NMHPkGI-0-9fd3504a0cff7d5ae35be3d6e9d48a78)
图2.23 设计3D按钮样式
【操作步骤】
第1步,设计一个HTML文档结构。创建一个新的HTML文档,并添加一个列表,在列表项中包含基本的锚链接。不需要任何额外的<div>或者<span>标签,也不用添加id和class属性,一切效果都通过CSS进行控制。结构代码如下:
![](https://epubservercos.yuewen.com/F92AA6/15289822105524506/epubprivate/OEBPS/Images/Figure-P53_86072.jpg?sign=1739549500-2G6VWoTN5RZQGQnagD9HpssARvDILffT-0-217b1b0f5417747ea5557aa11d1ab83c)
为了演示不同色彩风格的按钮样式,可以定义主题样式类,通过给每一个按钮应用不同的主题样式,可以充分发挥CSS的优势和便捷之处。
第2步,新建内部样式表,定义基本的按钮类样式。
![](https://epubservercos.yuewen.com/F92AA6/15289822105524506/epubprivate/OEBPS/Images/Figure-P54_86073.jpg?sign=1739549500-v8IEqZpiUfJBSh8eGjnEXMaotHVvpIZl-0-2c1f5b783c0007f202632d0f6dae7fbd)
第3步,为按钮类样式增加行为样式,让按钮实现动态效果。这里主要使用了:hover伪类选择器。例如,为灰色系按钮设计鼠标经过时的动态样式效果,主要包括字体颜色和背景色的变化,以及边框线的变换,以模拟立体效果。
![](https://epubservercos.yuewen.com/F92AA6/15289822105524506/epubprivate/OEBPS/Images/Figure-P54_86074.jpg?sign=1739549500-tbvvmagBT3J6bJFjTEll3gzZv2n7d6Js-0-56a9025b51873b4dbd3c65df749c49b4)
第4步,定义双边框样式。通过预览会发现现在的按钮边框显得比较单薄,需要为按钮定义粗边框的底部效果,同时还需要增加一点点行间距,因此这里使用了:before和:after伪类样式。
![](https://epubservercos.yuewen.com/F92AA6/15289822105524506/epubprivate/OEBPS/Images/Figure-P54_86075.jpg?sign=1739549500-lPqM30N49CXIRcbx4Xd3I0Yh0TeUSsHT-0-3a61d63da235fd5d1e4d439becfea749)
第5步,为了彰显按钮的金属特质,不妨借助CSS3的特效定义圆角效果。
a.button {border-radius: 3px;}
第6步,为边框定义阴影效果。
![](https://epubservercos.yuewen.com/F92AA6/15289822105524506/epubprivate/OEBPS/Images/Figure-P54_86076.jpg?sign=1739549500-uYA2z5Ejkm1cIlWnterMs73zvDMVMvbV-0-dfd07918b779aef38803d0a3d0728b3b)
第7步,定义鼠标经过和访问过按钮伪类状态类样式,设计渐变背景色特效。
![](https://epubservercos.yuewen.com/F92AA6/15289822105524506/epubprivate/OEBPS/Images/Figure-P55_86078.jpg?sign=1739549500-g1cazSrWsNMOEIdhICcGmRjzrMCoZ9NG-0-a65f5d209970c36b2591cc838d53e4d3)
第8步,利用:active伪类选择器定义对象激活状态的样式效果。
![](https://epubservercos.yuewen.com/F92AA6/15289822105524506/epubprivate/OEBPS/Images/Figure-P56_86078.jpg?sign=1739549500-09cLt0kr0BMjzCKKWNIV7lT5F4lErlfV-0-16657fa0a7b1395fa5fc1edf1b8a57d7)