Skip to content

CSS 高级(复合)选择器

TIP

在前面的课程中,我们学习了 CSS 基础选择器:标签选择器、class 选择器、id 选择器、* 通配符选择器

并且还讲到基础选择器之间的优先级,基础选择器优先级从高到低顺序如下

行内样式 > id 选择器 > class 选择器 > 标签选择器 > * 通配符选择器

本节课我们接着学习其它的复合选择器,复合选择器都是多个选择器组合而成的。

详细查阅,CSS 高级选择器官方文档

一、交集与并集选择器

选择器名称 示例 描述
交集选择器 li.para 选择既是 li 标签,也属于 para 类的标签
并集选择器 ul,ol 选择所有 ul 和 ol 标签

1、交集选择器

TIP

任意不同选择器组合在一起,选择器之间紧挨着,中间没有空格。

语法:

选择器1.选择器2 { }
选择器1.选择器2.选择器3 { }
h3.title {
} /* 选择h3标签中class名为title的元素 */
.box.box1 {
} /* 选择 class中包含"box box1" 的 标签元素 如 class="box box1" */

案例

<style type="text/css">
  /*选择h3标签中class名为title的元素,将背景颜色为黄色*/
  h3.title {
    background-color: yellow;
  }
  /* 选择 class中包含"box box1"  元素 */
  .box.box1 {
    width: 100px;
    height: 100px;
    background-color: red;
  }
</style>
<body>
  <h3>无任可样式</h3>
  <h3 class="title">h3.title</h3>
  <div class="box box1"></div>
</body>

渲染效果: ![[Pasted image 20260226161655.png]]

2、并集(分组)选择器

TIP

多个选择器之间用 , 逗号隔开

当几个选择器的操作样式是一样时,我们可以选择用群组选择器来操作,这样可以节省代码。

语法

选择器1,
选择器2,
选择器3 {
}
/* 选择 body ul p h3 标签 */
body,
ul,
p,
h3 {
}
/* 
选择
class='box1' 的元素
class='title' 的 h3 元素
class='box' 里面的 class="box2" 里面的 p元素
*/
.box1,
h3.title,
.box .box2 p {
}

案例

<style>
  /* 复杂写法
  .box{color:red;}
  h3 span{color:red;}
  p span.title{color:red;}
  */
  /*此写法为以上写法的简写形式-分组选择器*/
  .box,
  h3 span,
  p span.title {
    color: red;
  }
</style>
<body>
  <div class="box">box中内容</div>
  <h3><span>h3中的span</span></h3>
  <p><span class="title">p标签</span></p>
</body>

渲染效果: ![[Pasted image 20260226161821.png]]

3、样式初始化

**TIP

在实际开发中,我们会把 html 标签默认的样式清除掉,因为不同的浏览器 html 标签的默认样式会有少许差异。

在清除默认样式(样式初始化)时,用到的就是分组选择器。

body,
dl,
dd,
p,
h1,
h2,
h3,
h4,
h5,
h6 {
  margin: 0;
}
ol,
ul {
  margin: 0;
  padding: 0;
  list-style: none;
}
a {
  text-decoration: none;
}
img {
  border: none;
}

你可能会问

默认样式没用,为什么浏览器还要给他加默认样式呢?是因为要表现 html 标签本身的结构特性,或语义化。

二、关系选择器

选择器 举例
后代选择器 div p span{ }
子代选择器 div > span { }
相邻兄弟选择器 .box + p{ }
后续兄弟选择器 .box ~ p{ }

1、后代选择器

TIP

  • 用 " " (空格) 组合选择器,选择前一个元素的 后代 节点,空格在这里表示后代。

  • 后代 并不一定是 "儿子",只要是当前元素里面的元素,都算当前元素的后代。

语法

选择器1 选择器2 {
}
选择器1 选择器2 选择器3 {
}
/* 选中位于任意 div 元素之内的 p 元素 */
div p {
}
/* 选中位于任意 div 元素之内的 p 元素之内的 span 元素 */
div p span {
}

案例

<style>
  /* 选中位于任意 div 元素之内的 p 元素 */
  div p {
    color: red;
  }
  /* 选中位于任意 div 元素之内的 p 元素之内的 span 元素 */
  div p span {
    color: blue;
  }
</style>
<div>
  <p>
    p 标签
    <span>span标签 </span>
  </p>
</div>

渲染效果: ![[Pasted image 20260226162011.png]]

**案例

<style>
  /* 选择 class="box" 的元素之内的 span 元素 */
  .box span {
    color: red;
  }
</style>

<div class="box">
  <p>
    <span>span标签 </span>
  </p>
  <span>span标签 </span>
</div>

![[Pasted image 20260226162125.png]]

2、子代选择器

TIP

  • 子元素选择器之间用 > 连接

  • 选中元素的直接后代(直接儿子)元素

语法:

选择器1 > 选择器2 {
}
/* 选择 div 标签里面子元素是 span 的标签 */
div > span {
}
.box > p {
}

案例

<style>
  .box > p {
    color: red;
  }
</style>
<body>
  <div class="box">
    <p>box p</p>
    <div class="item">
      <p>box item p</p>
    </div>
    <p>box p</p>
  </div>
</body>

渲染效果: ![[Pasted image 20260226162200.png]]

3、相邻兄弟选择器

TIP

    • 号组合两个选择器,当第二个元素紧跟在第一个元素之后,并且两个元素都属于同一个父元素的子元素,则第二个元素将被选中
  • a + b 即 选择 紧跟 在 a 后面的第一个兄弟 b,a b 共属同一个父节点

语法:

选择器1 + 选择器2 {
}
/* 选中 h3 标签后紧跟的第一个兄弟 p 元素 */
h3 + p {
}

案例:

<style>
  /* 选中 h3 标签后紧跟的第一个兄弟 p 元素 */
  h3 + p {
    color: red;
  }
</style>
<body>
  <h3>h3标签</h3>
  <p>第一个p</p>
  <p>第二个p</p>
</body>

渲染效果: ![[Pasted image 20260226162302.png]]

**案例

<style>
  h3 + p {
    color: red;
  }
</style>
<body>
  <h3>h3标签</h3>
  <span></span>
  <p>第一个p,但不是紧跟在h3后面,所以没有选中</p>
</body>

渲染效果:

![[Pasted image 20260226162405.png]]

4、后续兄弟选择器

TIP

  • 后续兄弟选择器,位置无须紧邻,只须同层级

  • div~p 选择 div 元素之后所有同层级 p 元素。

语法

选择器1 ~ 选择器2 {
}
div ~ p {
} /* 选择 div 标签 之后的所有兄弟 p 元素 */

案例

<style>
  /* 选择 h3 标签 之后的所有兄弟 p 元素 */
  h3 ~ p {
    color: red;
  }
</style>
<body>
  <h3>h3</h3>
  <p>第一个p</p>
  <div class="box">
    <p>box中p</p>
  </div>
  <p>第二个p</p>
</body>

渲染效果: ![[Pasted image 20260226162451.png]]

三、伪类选择器

TIP

CSS 伪类 是添加到选择器的关键字,指定要选择的元素的特殊状态

1、a 伪类选择器

TIP

超链接有四个特殊状态,分别对应不同的伪类选择器

伪类 描述
a:link 没有被访问的超级链接
a:visited 已经被访问过的超级链接
a:hover 正被鼠标悬停的超级链接
a:active 正被激活的超级链接(按下按键,但还没有松开按键)

爱恨准则

a 标签的伪类书写,按照 “爱恨准则” 的顺序,否则会与伪类不生效。

按照 LOVE HATE (LVHA) 的顺序声明 :link - :visited - :hover - :active

<style>
  /*
  顺序不能乱  爱恨准则 LOVE HATE
  :link  -> :visited -> :hover -> :active
  */
  a:link {
    color: red;
  }
  a:visited {
    color: blue;
  }
  a:hover {
    color: green;
  }
  a:active {
    color: yellow;
  }
</style>
<body>
  <p><a href="https://www.icodingedu.com">艾编程</a></p>
  <p><a href="https://baidu.com">百度一下,你就知道 </a></p>
</body>

注意事项:

  • 遵守了 “爱恨原则” ,但 a:link 不生效,是因为之前访问过的网址会被浏览器记录,就会显示 a:visited 的样式(修改网址或清楚浏览记录即可)

  • 四个样式可以根据实际情况单独使用

  • 伪类 :hover 不仅可以用在 a 标签上,还可以用在其他标签上,比如:div、p、列表标签,标题标签 等等

:hover 在其它标签上的应用

<style>
  div {
    width: 100px;
    height: 100px;
    background-color: pink;
  }
  /*鼠标滑动到div,背景变为skyblue*/
  div:hover {
    background: skyblue;
  }
  /*鼠标滑动到div上时,div里面的p标签隐藏*/
  div:hover p {
    display: none; /*隐藏p标签*/
  }
</style>
<body>
  <div>
    <p>p标签内容</p>
  </div>
</body>

渲染效果: ![[Pasted image 20260226162622.png]]

应用场景

常用来实现鼠标移入动画,往后我们会大量使用他。

2、:focus 获取焦点

TIP

  • :focus 表示获得焦点的元素(如表单输入)。

  • 当用户点击或触摸元素或通过键盘的 "tab" 键选择它时会被触发

<style>
  /*输入框获取焦点后,文字变红,背景颜色变黄色*/
  input.user:focus {
    color: red;
    background-color: yellow;
  }
</style>
<body>
  <input type="text" class="user" value="获取焦点,我变成红字黄底" />
</body>

渲染效果: ![[Pasted image 20260226162729.png]]

3、:checked 被选中

TIP

  • :checked 选择器用于选中任何处于选中状态的

    • radio()单选按钮

    • checkbox()复选框

    • 或 select 下拉列表元素中的 option 元素

<style>
  input:checked {
    box-shadow: 0px 0px 4px red; /*添加阴影效果*/
  }
  input:checked + div {
    display: none; /*隐藏元素*/
  }
  div {
    width: 50px;
    height: 50px;
    background-color: pink;
  }
</style>
<body>
  <input type="checkbox" />用户
  <div></div>
</body>

渲染效果: ![[Pasted image 20260226162827.png]]

具体案例应 - 制作单选开关,在后面的案例中会讲 ![[Pasted image 20260226162922.png]]

四、伪元素选择器

TIP

深入浅出伪元素选择器,带你轻松掌握 CSS 的高级用法。

1、::after (:after) 与 ::before (:before)

TIP

  • ::before 创建一个 伪元素 ,其将成为匹配选中的元素的第一个子元素。常通过 content 属性来为一个元素添加修饰性的内容。此元素默认为 行内元素

  • ::after 用来创建一个伪元素,作为已选中元素的最后一个子元素。通常会配合​ content属性来为该元素添加装饰内容。此元素默认是行内元素。

语法:

element:after {
  ....样式声明....;
} /* CSS2 语法 */
element::after {
  ....样式声明....;
} /* CSS3 语法 */

element:before {
  ....样式声明....;
} /* CSS2 语法 */
element::before {
  ....样式声明....;
} /* CSS3 语法 */

TIP

CSS3 引入 ::before 和 ::after 是为了将 伪类 和 伪元素 区别开来

案例

<style>
  .box p:before {
    content: "前"; /*content属性必加,即时内容为空*/
    width: 30px;
    height: 30px;
    background-color: skyblue;
    display: inline-block;
  }
  .box p:after {
    content: "后"; /*content属性必加,即时内容为空*/
    width: 30px;
    height: 30px;
    background-color: pink;
    display: inline-block;
  }
</style>
<body>
  <div class="box">
    <p>..这是内容区..</p>
  </div>
</body>

渲染效果: ![[Pasted image 20260226163009.png]]

重点提示

::after 与 ::before 中的 content:'' 属性必写,即使内容为空也要写。

应用场景:

伪元素一般应用于创建不需要添加任何内容的元素,这个元素只是用来做样式修饰效果。比如制作黑色半透明遮罩层、箭头、三角形、圆形、光影等效果。

后面我们会在大量的案例中应用到他。

2、::placeholder

TIP

::placeholder 可以选择一个表单元素的 占位文本,它允许开发者和设计师自定义 占位文本 的样式

<style>
  input {
    height: 50px;
    width: 300px;
    border: 0;
    outline: none;
    padding-left: 10px;
    background-color: rgb(252, 237, 240);
  }
  /*请输入用户名的字体大小为 16px 同时颜色变为红色*/
  input.user::placeholder {
    font-size: 16px;
    color: red;
  }
</style>
<body>
  <p><input class="user" placeholder="请输入用户名" /></p>
  <p><input class="pwd" placeholder="请输入密码" /></p>
</body>

渲染效果: ![[Pasted image 20260226163117.png]]