六、基础选择器能解决的问题有限,更多情况下需要用到复杂选择器

152 阅读4分钟

只会基础选择器(二、基础选择器 - 掘金 (juejin.cn))并不能满足有些特殊的需求,我们需要更多的方法来解决可能出现的复杂情况。

复合选择器

复合选择器可以分为后代选择器和子代选择器,这里可以站在父亲的角度,把他们看作人类关系中的后代和子代来理解

后代选择器

官方解释:根据 HTML 标签的嵌套关系,选择父元素后代中满足条件的元素

语法:选择器A 选择器B { css } ---> 在选择器 A 所找到标签的后代中,找到满足选择器 B 的标签,设置相关样式。

个人理解:这里可以把选择器 A 看作父亲,那么选择器 B 就是它的后代,B 可以是 A 的儿子,也可以是 A 的孙子,总之,只要是父亲 A 的后代就可以

例如下例中,p 标签是第一个 div 标签的儿子,所以编译器会先找到所有的 div 标签,然后依次在找到的 div 标签中寻找 p 标签,然后给 p 标签设置颜色;

span 标签可以是第一个 div 标签的孙子,也可以是第二个 div 标签的儿子,但无论是哪一种,它都可以看作是第一个标签的后代

image.png

这里有两点需要注意:

  • 后代的理解:将父元素看作父亲,后代就可以解释为儿子、孙子、重孙子 ...
  • 后代选择器中,选择器之间通过空格隔开

子代选择器

官方解释:根据 HTML 标签的嵌套关系,选择父元素子代中满足条件的元素

语法:选择器A 选择器B { css } ---> 在选择器 A 所找到标签的子代中,找到满足选择器 B 的标签,设置相关样式。

个人理解:同样,如果把选择器 A 看作父亲,那么选择器 B 只能是它的儿子。

下例中,把标签 div 看作是父亲,它有两个儿子:第一个 p 标签 和 span 标签,而 span 标签也有一个儿子:第二个 p 标签,同时它也是 div 标签的孙子

div > p这里需要找到 div 标签的儿子,即第一个 p 标签,设置字体大小,而第二个 p 标签是它的孙子,不满足要求

这里同样有两点需要注意:

  • 子代的理解:将父元素看作父亲,子代就可以解释为儿子,并且只包括儿子
  • 子代选择器中,选择器之间通过 > 隔开
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      div p {
        color: rgb(51, 255, 71);
      }
      div > p {
        font-size: 30px;
      }
    </style>
  </head>
  <body>
    <div>
      <p>后代选择器1</p>
      <span>
        <p>后代选择器2</p>
      </span>
    </div>
  </body>
</html>

image.png

并集选择器

官方解释:并集选择器可以同时选择多组标签,设置相同的样式

语法:选择器A,选择器B { css } ---> 找到选择器 A 和选择器 B 选择中的标签,设置相关样式。

并集选择器之间通过 “,” 分割,每组选择器可以是基础选择器或复合选择器,并集选择器中的每组选择器通常是一行写一个,这样做可以提高代码的可读性。

个人理解:如果几个标签要设置相同的样式,分开写会造成代码冗余的情况,可读性不强,一旦修改样式,就要一次性修改多处,麻烦而且代码多了不好找,所以我们可以把这些有相同样式的标签放在一起,设置统一的样式,这样只需修改一处即可

image.png

交集选择器

官方解释:选中页面中同时满足多个选择器的标签

语法:选择器A选择器B { css } ---> 找到页面中既能被选择器 A 选中,又能被 选择器 B 选中的标签,设置样式。

如果在交集选择器中,有标签选择器,那么标签选择器必须写在最前面,并且交集选择器之间是紧挨着的。

个人理解:有时候需要设置个别特殊样式,需要精确选中特定的标签,就要用到交集选择器

如下所示的例子中,我们需要选择既是 div 标签 又是 .one 类标签,即带有 .one 类的 div 标签

1)第一个就是我们要找的符合要求的标签

2)第二个,虽然有 .one 类,但是它是 span 标签,不符合要求

3)第三个,是 div 标签,但它没有 .one 类,也不符合要求

image.png

Hover 伪类选择器

我们浏览网页时会发现,有的地方鼠标放上去会有变化,变大或者变颜色等,这种变化可以用伪类选择器配合 CSS 样式来设置,Hover 伪类选择器的作用就是选中鼠标悬停在元素上的状态,设置样式。

语法:选择器:hover { css } ---> 伪类选择器选中的元素的某种状态

例如,我们想让鼠标悬停时,盒子变大,颜色改变:

image.png