1.什么是复合选择器
在CSS中,可以根据选择器的类型把选择器分为基础选择器 和 复合选择器, 复合选择器是建立在基础选择器之上,对基础选择器进行组合形成的。基础选择器的相关知识可以参考之前的博客。
复合选择器是由两个或多个基础选择器,通过不同的方式组合形成的,主要包括:后代选择器 ,子选择器 ,并集选择器 和 伪类选择器。
2. 后代选择器
后代选择器又称为包含选择器,可以选择父元素里面子元素。其写法就是把外层标签写在前面,内层标签写在后面,中间用空格分隔,当标签发生嵌套时,内层标签就成为外层标签的后代。
其语法格式为:
元素1 元素2 {样式声明;}
例如,页面中同时含有ul
标签和ol
标签,我只想让ul
标签里面的文本变为粉色,可以这样定义CSS:
<style>
ul li {
color:pink;
}
</style>
<ol>
<li>我是ol标签的li</li>
<li>我是ol标签的li</li>
</ol>
<ul>
<li>我是ul标签的li</li>
<li>我是ul标签的li</li>
</ul>
这时就能看到ul
标签里的文本就会变成粉色,而ol
标签里面的文本就不会发生变化。需要注意的是,这里的元素1和元素2均属于基础选择器中的标签选择器,也可以替换成其他基础选择器,比如类选择器。更换成类选择器后的代码如下:
<style>
.nav2 .pink {
color:pink;
}
</style>
<ol class="nav">
<li class="pink">我是ol标签的li</li>
<li class="pink">我是ol标签的li</li>
</ol>
<ul class="nav2">
<li class="pink">我是ul标签的li</li>
<li class="pink">我是ul标签的li</li>
</ul>
也同样可以实现上述效果。后代选择器需要注意以下几点:
- 元素1和元素2之间必须要用空格隔开。
- 元素1是父级,元素2是子级,最终选择的是元素2。
- 元素2可以是儿子,也可以是孙子,只要是元素1的后代即可。
- 元素1和元素2可以是任何基础选择器。
3. 子选择器
子元素选择器(子选择器)只能选择作为某元素的最近一级子元素,简单理解就是选择亲儿子元素。其基本语法为:
元素1>元素2 {样式说明;}
这里给出一个简单案例:
<style>
.nav > a {
color:pink;
}
</style>
<div class="nav">
<a href="#">我是儿子</a>
<p>
<a href="#">我是孙子</a>
</p>
</div>
这时只有第一个a
标签内的文本会变成粉色。子选择器需要注意以下几点:
- 元素1和元素2中间用大于号隔开。
- 元素1必须是父级,元素2是子级,最终选择的是元素2.
- 元素2必须是亲儿子,其孙子,重孙之类都不归他管。
4. 并集选择器
并集选择器可以选择多组标签,同时为它们定义样式,通常用于集体声明,语法规范为:
元素1,元素2 {样式声明;}
一个简单的例子:
<style>
p, div{
color:pink;
}
</style>
<div>
雪之下雪乃
</div>
<p>
由比滨结衣
</p>
并集选择器是各选择器通过英文逗号 ,
连接而成,任何形式的选择器都可以作为并集选择器的一部分。
5.伪类选择器
伪类选择器 用于向某些选择器添加特殊效果,比如给链接添加效果,或者选择第1个元素,第n个元素。伪类选择器书写的最大特点是用冒号(:) 表示,比如 :hover, :first-child。
5.1 链接伪类选择器
类别 | 选择对象 |
---|---|
a:link |
选择所有未被访问的链接 |
a:visited |
选择所有已被访问的链接 |
a:hover |
选择鼠标指针位于其上的链接 |
a:active |
选择活动链接(鼠标按下未弹起的链接) |
一个简单的例子,定义CSS如下:
<style>
a:link {
color:black;
text-decoration: none;
}
a:visited {
color:pink;
}
</style>
上述代码实现的效果是,未点击链接时,链接是黑色,点击链接后,链接变成粉色。同理,a:active
和 a:hover
的使用方式相同。
注意事项:
- 为了确保生效,请按照LVHA的顺序声明:link,visited,hover,active。
- a 链接在浏览器中有默认样式,所以实际开发都需要给链接单独指定样式(给body指定颜色不会影响到a)。
5.2 :focus伪类选择器
:focus 伪类选择器 用于选取获得焦点的表单元素。焦点就是光标,一般情况input类表单元素才能获取,因此这个选择器主要针对表单元素来说的。
input:focus {
background-color:pink;
}
5.3 其他伪类选择器
:first-child
选择器用于选取属于其父元素的首个子元素的指定选择器。例如:
a:first-child {
color:pink;
}
个人理解是,会选出含有a
标签子元素的标签,将其中的第一个标签设置为粉色。当我们HTML代码如下时:
<p>
<span>我在span里面</span>
<span><a>第一个链接</a></span>
<a>第二个链接</a>
<a>第三个链接</a>
</p>
<p>
<a>第一个链接</a>
<a>第二个链接</a>
</p>
两个p
标签里面的 “第一个链接” 都将显示红色。:first-child
也可以搭配复合选择器使用,如下所示:
p:first-child a {
color:pink;
}
<body>
<p>
<span><a>第一个链接</a></span>
<a>第二个链接</a>
<a>第三个链接</a>
</p>
<p>
<a>第一个链接</a>
<a>第二个链接</a>
</p>
</body>
这时,第一个p
标签中的所有a
标签都会变成红色(p标签是body的子标签),第二个p
标签不会发生改变。
::after(:after)
通常搭配content
使用,表示在选定标签后面加上content
的内容。同理,::before(:before)
会在选定标签前面加上content
的内容 。
q::before {
content: "«";
color: blue;
}
q::after {
content: "»";
color: red;
}
6. 小结
选择器 | 作用 | 特征 | 使用情况 | 隔开符号及用法 |
---|---|---|---|---|
后代选择器 | 用来选择后代元素 | 可以是子孙后代 | 较多 | 空格分隔,.nav a |
子代选择器 | 选择最近一级元素 | 只选亲儿子 | 较少 | 大于分隔,.nav>a |
并集选择器 | 选择某些相同样式的元素 | 可以用于集体声明 | 较多 | 逗号分隔,.nav,a |
链接伪类选择器 | 选择不同状态的链接 | 跟链接相关 | 较多 | LVHA |
:focus选择器 | 选择获得光标的表单元素 | 跟表单相关 | 较少 | input:focus |