# CSS 选择器

W3C 中对选择器的描述

# 后代 子元素 相邻元素

这三者长得比较像, 放在一起; 三个人选择的范围依次缩小;

# 后代选择器

div span {}
1

只要 div 标签下出现的 span , 都会被渲染;

# 子元素选择器

div > span {}
1

div 标签下所有的 第一级孩子 span 标签进行渲染;

# 相邻元素选择器

div + span {}
1

div 标签同级并且紧临span 标签, 将会被渲染;

除了 :focus 之外的四个人都属于链接伪类选择器;

WARNING

注意这几个人的顺序, 否则会有一些意想不到的东西出现;

TIP

一个通用的顺序:
:link > :visited > :focus > :hover > :active

a:hover 必须被置于 a:link 和 a:visited 之后, 才是有效的.
a:active 必须被置于 a:hover 之后, 才是有效的.

# :nth-child :nth-of-type

两个人都属于位置结构伪类选择器的范畴;

:nth-child 的选择范围要比 :nth-of-type 大;

前者可以无视标签类别和名称, 后者会对标签的名称和类别进行限定;

这两个选择器的下标从 1 开始, 都支持简单的公式进行计算;

TIP

当使用 vue v-for 标签的时候要注意子标签会被扩展, 下标无法直接确定, 使用 -1 可以定位到最后一个子标签;

# :nth-child 选择器

:nth-child(n) 选择器匹配属于其父元素的第 N 个子元素, 不论元素的类型.

这个选择器很容易理解成一个错误形式:

<!-- 尝试修改 两个 子 div 的样式 -->
<div class='a'>
    <span></span>
    <div></div>
    <div></div>
</div>

<style>
    .a {}
    /* 企图修改 class 为 a 的 div 下的两个 div 样式 */
    .a:nth-child(1) {}
    .a:nth-child(2) {}
</style>
1
2
3
4
5
6
7
8
9
10
11
12
13

WARNING

上面的代码是一个错误的示范

实际上, 这里的 1 将会指向 span , 2 会指向第 1 个子 div , 正确的写法是:

<div class='a'>
    <span></span>
    <div></div>
    <div></div>
</div>

<style>
    .a {}
    /* 正确修改 div 下的两个 div 样式 */
    .a div:nth-child(2) {}
    .a div:nth-child(3) {}
</style>
1
2
3
4
5
6
7
8
9
10
11
12

这里添加了在使用 nth-child 选择器时, 添加了 div , 并且修改了下标;

这个选择器在选择的过程中, 需要满足两个条件, 第一, 的确有这个下标的子标签; 第二, 这个下标应当满足 :nth-child 冒号前面的标签名称或类名的限制;

# :nth-of-type 选择器

:nth-of-type(n) 选择器匹配属于父元素的特定类型的第 N 个子元素的每个元素.

还是 :nth-child 选择器的例子:

<!-- 尝试修改 两个 子 div 的样式 -->
<div class='a'>
    <span></span>
    <div></div>
    <div></div>
</div>

<style>
    .a {}
    /* 修改 class 为 a 的 div 下的两个 div 样式 */
    .a div:nth-of-type(1) {}
    .a div:nth-of-type(2) {}
</style>
1
2
3
4
5
6
7
8
9
10
11
12
13

这个选择器选择的是, a 标签下, 某一个具体的 div 标签;

# CSS 伪元素

伪元素是一个假的元素, 但是它们对用户是可见的, 只能通过css来操作,

TIP

伪元素不会出现在DOM中

这个地方我们可以在看一下伪元素清除浮动的 CSS

.clear-float:after {
    content: '.';
    display: block;
    height: 0;
    clear: both;
    visibility: hidden;
}
1
2
3
4
5
6
7

.clear-float 将被作用在使用了浮动的子元素的父元素标签上,

WARNING

这里的 :after 实际上在需要清除浮动的父元素内部添加了一些内容, 而不是在父元素的同级后方添加内容;

在伪元素中如果没有 content 属性, 伪元素是无效的, 所以会有 content ;
默认情况下插入的伪元素是内联元素, 所以需要将其设置为 块级元素 才可以起到像 <div sytle="clear:both"></div> 的效果;

Last Updated: 2/4/2020, 8:43:36 AM