Skip to content

选择器

基础选择器

标签选择器

根据 HTML 标签名 选中元素。

css
p {
  color: blue;
}

类选择器

根据元素的 class 属性 选中元素。 在 CSS 中用 . 开头。

css
.title {
  font-size: 20px;
  color: red;
}

ID 选择器

根据元素的 id 属性 选中元素。 在 CSS 中用 # 开头。

css
#main {
  background: lightgray;
}

通配符选择器

css
* {
  margin: 0;
  padding: 0;
}

关系选择器

根据 元素之间的层级或关系 来选择目标元素,A,B 表示选择的对象,A 和 B 之间的符号表示 A 和 B 之间的关系。

后代选择器 常用

选中 A 元素内部所有的 B 元素(无论嵌套多少层)。

css
div p {
  color: red;
}
html
<div>
  <p>我是 div 里面的 p</p>
  <section><p>我也会被选中</p></section>
</div>

子代选择器 常用

只选中 A 的直接子元素 B(不包括更深层的嵌套)。

div > p {
  color: blue;
}
html
<div>
  <p>我会变蓝</p>
  <section><p>我不会变蓝</p></section>
</div>

相邻兄弟选择器 较少使用

选中 紧跟在 A 后面的第一个兄弟元素 B

css
h2 + p {
  color: green;
}
html
<h2>标题</h2>
<p>我会变绿</p>
<p>我不会变绿</p>

通用兄弟选择器较少使用

选中 A 后面的所有兄弟元素 B(不必紧挨着)

css
h2 ~ p {
  color: orange;
}
html
<h2>标题</h2>
<p>第一个段落</p>
<div>中间的div</div>
<p>第二个段落</p>

总结

关系选择器可以描述多个对象,不一定只有两个对象,他可以一层层向下寻找:

css
/*div的所有子代p,p中的直接子元素.box*/
div p > .box {
}
选择器示例匹配关系匹配数量常用场景联想
后代选择器A BA 内所有 B多个嵌套样式,如菜单内的列表无约束( )
子代选择器A > BA 的直接子元素 B多个限定层级结构等级森严(>),只管直接下级
相邻兄弟选择器A + B紧挨着 A 的下一个兄弟 B1 个标题后第一个段落两者能加(+),说明是兄弟
通用兄弟选择器A ~ BA 后所有兄弟 B多个同级多个相似元素两者约等于(~),大家都是人

分组选择器

分组选择器(Group Selector) 用于 对多个选择器同时应用相同的样式。 选择器之间使用 逗号(, 分隔。

css
/*分组选择器一般会进行换行*/
selector1,
selector2,
selector3 {
  property: value;
}

这样可以让多个元素共享同一套样式,避免重复书写。

伪类选择器

状态伪类

  • 链接伪类
css
a:link {
  color: blue;
} /* 未访问的链接 */
a:visited {
  color: purple;
} /* 已访问的链接 */
a:hover {
  color: red;
} /* 鼠标悬停 */
a:active {
  color: orange;
} /* 正在点击的状态(鼠标未弹起) */

伪类顺序:LVHA:link → :visited → :hover → :active

  • 用户行为伪类
伪类作用
:hover鼠标悬停
:active被点击时
:focus获得焦点(如输入框)
:disabled被禁用
:checked单选框/复选框选中状态

结构伪类

只讲解常用的三个伪类选择器

first-child

第一个子元素

last-child

最后一个子元素

  • 常用场景:元素之间的分割线
html
<div class="vertical-divider">
  <span>苹果</span>
  <span>香蕉</span>
  <span>葡萄</span>
</div>
css
.vertical-divider {
  display: flex;
  align-items: center;
  font-size: 14px;
}
.vertical-divider span {
  padding: 0 10px;
  border-right: 1px solid #ccc; /* 添加竖线 */
}

.vertical-divider span:last-child {
  border-right: none;
}
  • 输出:
苹果香蕉葡萄

nth-child(n)

第 n 个子元素

css
selector:nth-child(n) {
  property: value;
}

n 支持以下值:

  1. 数字 n
li:nth-child(3) { color: red; }

表示选中父元素中的第 3 个子元素

  1. 关键词 odd / even
li:nth-child(odd) { background: #eee; }  /* 奇数 */
li:nth-child(even) { background: #ddd; } /* 偶数 */
  1. 公式
li:nth-child(3n) { color: orange; }      /* 每3个选一个:第3,6,9… */
li:nth-child(3n+1) { color: green; }    /* 第1,4,7… */
li:nth-child(2n+1) { background: #eee; } /* 奇数 */
  • n是从0开始的,之后递增
  • :nth-child() 按父元素的所有子元素顺序计数
    • 不管子元素类型是什么
    • 所以如果有不同类型的元素,中间会计入计数
html
<!--li:nth-child(2) 不会选中第2个 <li>,而是选中 <p>-->
<ul>
  <li>1</li>
  <p>段落</p>
  <li>2</li>
</ul>

伪元素选择器

伪元素选择器(Pseudo-elements)是 CSS 中用来选中元素的特定部分(而不是整个元素)的选择器。它通常用于在不改变 HTML 结构的前提下,给元素添加样式或内容

伪元素作用使用频率
::before在元素内容之前插入内容常用
::after在元素内容之后插入内容常用
::first-line选中元素的第一行文字
::first-letter选中元素的第一个字母或字符
::selection选中用户鼠标选中的文本部分
::placeholder输入框的占位文字常用
::marker选中列表项符号(如 1.
::backdrop用于全屏元素(如 <dialog><video>)的背景层

::before::after 用于在一个元素的 内容前后 插入 **生成的内容(generated content),插入的元素类似行内元素,而不用在 HTML 中增加实际标签。

  • ::before → 元素内容前面插入内容
  • ::after → 元素内容后面插入内容

基本语法:

css
selector::before {
  content: "内容";
}

selector::after {
  content: "内容";
}
html
<textarea placeholder="请输入内容..."></textarea>
css
textarea::placeholder { color: gray; }

属性选择器

属性选择器是一种根据元素属性来选取元素的 CSS 选择器。它可以让你不依赖类名或标签名,而是通过元素的 属性和值 来进行样式匹配。

选择器语法作用描述示例
[attr]选择带有指定属性的元素input[disabled]
[attr="value"]属性值完全等于指定值input[type="text"]
[attr~="value"]属性值中包含某个独立单词(用空格分隔)div[class~="active"]
[attr^="value"]属性值以指定字符串开头a[href^="https"]
[attr$="value"]属性值以指定字符串结尾img[src$=".png"]
[attr*="value"]属性值中包含指定字符串(任意位置)a[href*="example"]

示例

css
/*选择所有 type="text" 的输入框。*/
input[type="text"] {
  border: 1px solid #ccc;
}