css: 组合选择器

 组合选择器:后代选择器、子元素选择器、兄弟选择器、交集选择器和并集选择器这几种复合选择器

一、后代选择器

后代选择器的语法是用空格分隔的多个选择器组合,它的作用是在 A 选择器的后代元素中找到 B 选择器所指的元素。它的语法形式就是:“选择器 A 选择器 B” ,例如:

<!-- HTML -->
<div class="page">
    <div class="article">
        <h1>我是标题部分</h1>
        <p>黑化肥发灰,灰化肥发黑</p>
        <p>黑化肥发灰会挥发;灰化肥挥发会发黑</p>
        <p>黑化肥挥发发灰会花飞;灰化肥挥发发黑会飞花</p>
    </div>
    <p class="footer">版权 © tuituitech.com</p>
</div>

// CSS:
.page p{
    font-size: 18px;
}

上面的例子中就是一个标准的后代选择器,“.page p” 就表示在 .page 选定的区域里去找 p 标签。上面的后代选择器就会把 class 为 page 元素里面的所有 p 元素的字体都改成 18px。后代选择器最主要的目的是在给元素加一个范围的限制,上面例子中如果直接用一个标签选择器 p 效果也是一样的,但这样容易影响到页面里其他部分的 p 元素,所以前面加个 .page 给它限定住。

我们要注意,后代选择器是可以叠加使用的。假如我们只想限定 class=“article” 元素里的 p 标签字号是 18px,也可以用下面的方式:

// CSS:
.page .article p{
    font-size: 18px;
}

Tips:后代选择器通常用来限制选择器生效的范围,防止因为选择器使用不当或者对元素命名出现重复造成的样式冲突。

二、元素选择器

子元素选择器和后代选择器类似,也是为选择器限定范围。不同的是子元素选择器只找子元素,而不会把所有的后代都找一遍。它的语法是 “选择器 A> 选择器 B”,例如:

<!-- HTML -->
<div class="page">
    <div class="article">
        <h1>我是标题部分</h1>
        <p>黑化肥发灰,灰化肥发黑</p>
        <p>黑化肥发灰会挥发;灰化肥挥发会发黑</p>
        <p>黑化肥挥发发灰会花飞;灰化肥挥发发黑会飞花</p>
    </div>
    <p class="footer">版权 © tuituitech.com</p>
</div>

// CSS:
.page > p{
    color: grey;
}

用 “.page> p” 这个选择器就会把 .page 元素里面的 .footer 元素的字体变成灰色,但不会对 .article 元素下的 p 元素产生影响。

子元素选择器也是可以叠加使用的,还按上面的例子,假如我们想使用子元素选择器仅设置 .article 元素里面的 p 元素样式,我们就可以用下面的选择器来实现:

// CSS:
.page > .article > p{
    color: black;
}

Tips:
子元素选择器的作用和后代选择器相似,也是用来限制选择器生效的范围。它和后代选择器不同的是:
1. 子元素选择器只匹配子元素,不会匹配后代元素。在有确定的父子关系时,尽量使用子元素选择器,效率会比后代选择器高。
2. 使用子元素选择器还可以避免对非直接后代的样式影响,在只想给子元素设置样式时会比后代选择器安全。

三、兄弟选择器

在 CSS 中,还有一种选择器是用来选取同级元素的,叫做兄弟选择器。兄弟选择器有两种,一种是相邻兄弟选择器,另外一种是通用兄弟选择器。

  • 相邻兄弟选择器

相邻兄弟选择器是用来选取某个元素紧邻的兄弟元素,它的语法是 “选择器 A + 选择器 B”,表示找到与 A 元素相邻的 B 元素。其实就是对选择器 B 加上 “紧邻着选择器 A” 的限制。一下面的代码为例:

<!-- HTML -->
<div class="article">
    <p>黑化肥与灰化肥</p>
    <h1>我是标题部分</h1>
    <p>黑化肥发灰,灰化肥发黑</p><!--生效-->
    <p>黑化肥发灰会挥发;灰化肥挥发会发黑</p>
    <p>黑化肥挥发发灰会花飞;灰化肥挥发发黑会飞花</p>
</div>
// CSS
h1 + p{
    margin-top: 10px;
    color: red;
} 

上面的例子中,h1 + p 选择器就表示选择紧邻 h1 元素的 p 元素,让这个 p 元素距离标题隔开 10px,并且字体设置为红色。这里要注意,相邻选择器只能选择紧挨在 h1 后面的 p 元素,而不能向前找。

Tips:
相邻兄弟选择器通常有两类用处:
1. 用于自动调整占位,比如后面在布局的时候,有 header 和没 header 情况下内容区的高度会不同,就可以使用相邻兄弟选择器来控制内容区的高度。
2. 相邻兄弟选择器的第二种用法是用来控制相同元素中间的间隔,比如在 List 组件开发时,每个 li 元素之间要加上分割线的需求就会通过相邻兄弟选择器来实现。

  • 通用兄弟选择器

 通用兄弟选择器和相邻兄弟选择器很相似,它的语法是 “选择器 A ~ 选择器 B”,也是用选择器 A 做限制,选择器 B 是最终匹配的目标。不同的是通用兄弟选择器会匹配选择器 A 指定元素后面的所有符合选择器 B 规则的元素。

 
<!-- HTML -->
<div class="article">
    <p>黑化肥与灰化肥</p>
    <h1>我是标题部分</h1>
    <p>黑化肥发灰,灰化肥发黑</p><!--red-->
    <p>黑化肥发灰会挥发;灰化肥挥发会发黑</p><!--red-->
    <p>黑化肥挥发发灰会花飞;灰化肥挥发发黑会飞花</p><!--red-->
</div>

// CSS
h1 ~ p{
    color: red;
} 

Tips:
兄弟选择器(包括相邻兄弟选择器和通用兄弟选择器)中都是只能向后选择,如果需要向前选择,就只能给前面的元素指定上 class,再用类选择器来实现了。

四、交集选择器

交集选择器是为了找两个或多个选择器的交集,用法就是把两个选择器放在一起,形式如 “选择器 A 选择器 B”,中间不需要加空格或者其他符号。交集选择器最主要的作用是在限定范围内标识特殊的样式。

<!-- HTML -->
<div class="menu">
    <a class="menu-item">菜单1</a>
    <a class="menu-item active">菜单2</a>
    <a class="menu-item">菜单3</a>
    <a class="menu-item">菜单4</a>
</div>
// CSS
.menu-item{
    background: #ccc;
    color: #000;
}
.menu-item.active{
    background: #aaa;
    color: #fff;
}

通过 .menu-item 给所有菜单元素一个基础样式,然后通过交集选择器 .menu-item.active 给当前活跃的菜单选项一个特殊的标记。在这个例子里,交集选择器有两个意思,一方面是把选择器限定在 .menu-item 范围内,另一方面是选中范围内比较特殊的 .active 元素。

五、并集选择器

并集选择器是为了合并类似的样式,可以把选择器不同但样式相同的 CSS 语法块做合并。并集选择器就是用逗号分割多个选择器,形式如 “选择器 A, 选择器 B”,表示该样式对选择器 A 和选择器 B 所选择的元素都生效。

// CSS
h1{
    margin: 0;
    padding: 0;
}
h2{
    margin: 0;
    padding: 0;
}
h3{
    margin: 0;
    padding: 0;
}

上面的样式是希望把 h1,h2 和 h3 的内外边距都归零,来解决不同浏览器中元素默认的内外边距不一致的问题。这种写法会占用很多 CSS 代码量,但是可以通过并集选择器来进行简化:

h1, h2, h3{
    margin: 0;
    padding: 0;
}

css: 组合选择器

 

 

 

 

css: 组合选择器

上一篇:vue中比较完美请求的栗子(使用 axios 访问 API)


下一篇:mybatis源码-解析配置文件(四)之配置文件Mapper解析