CSS 选择器详解

简单 🟢CSS 布局
3 个标签
预计阅读时间:9 分钟
CSS选择器优先级

CSS 选择器详解

CSS 选择器用于选择要样式化的 HTML 元素,是 CSS 的核心概念之一。

基础选择器

元素选择器:

选择特定类型的元素
如:p、div、h1

类选择器:

选择具有特定类的元素
如:.classname
一个元素可以有多个类

ID 选择器:

选择具有特定 ID 的元素
如:#idname
一个页面中 ID 应该是唯一的

通用选择器:

选择所有元素
如:*
通常用于重置样式

属性选择器:

[attr]:具有 attr 属性的元素
[attr=value]:attr 属性值为 value
[attr^=value]:attr 属性值以 value 开头
[attr$=value]:attr 属性值以 value 结尾
[attr*=value]:attr 属性值包含 value

组合选择器

后代选择器:

选择后代元素
如:div p(div 内的所有 p)

子选择器:

选择直接子元素
如:div > p(div 的直接子 p)

相邻兄弟选择器:

选择紧接在后的兄弟元素
如:h1 + p(紧接 h1 的 p)

通用兄弟选择器:

选择所有后面的兄弟元素
如:h1 ~ p(h1 后的所有 p)

分组选择器:

同时选择多个选择器
如:h1, h2, h3

伪类选择器

链接伪类:

:link:未访问的链接
:visited:已访问的链接
:hover:鼠标悬停
:active:激活状态

表单伪类:

:focus:获得焦点
:checked:选中的复选框/单选框
:disabled:禁用的元素
:valid/:invalid:验证状态

位置伪类:

:first-child:第一个子元素
:last-child:最后一个子元素
:nth-child(n):第 n 个子元素
:nth-of-type(n):第 n 个同类型元素
:only-child:唯一的子元素

其他伪类:

:not():否定选择器
:is():匹配列表中的任意选择器
:where():与 :is() 类似,但优先级为 0
:has():父元素选择器(实验性)

伪元素选择器

::before/::after:

在元素内容前后插入内容
需要 content 属性
常用于装饰

::first-letter/::first-line:

第一个字母/第一行
用于首字下沉等效果

::selection:

选中的文本
自定义选中文本样式

::placeholder:

输入框的占位符文本

::marker:

列表项的标记

优先级(特异性)

计算规则:

行内样式:1000
ID 选择器:100
类/属性/伪类:10
元素/伪元素:1
通用选择器:0

示例:

#nav:100
.nav .item:20
div#nav .item a:112

重要规则:

!important 覆盖一切
应谨慎使用
相同优先级,后定义的规则生效

代码示例

基础选择器

cssCode
/* 元素选择器 */
p {
  color: #333;
  line-height: 1.6;
}

h1 {
  font-size: 2rem;
  font-weight: 700;
}

/* 类选择器 */
.button {
  padding: 10px 20px;
  background-color: #007bff;
  color: white;
  border: none;
  border-radius: 4px;
  cursor: pointer;
}

.button--primary {
  background-color: #007bff;
}

.button--secondary {
  background-color: #6c757d;
}

/* ID 选择器 */
#header {
  background-color: #333;
  color: white;
  padding: 20px;
}

/* 通用选择器 */
* {
  box-sizing: border-box;
}

/* 属性选择器 */
input[type="text"] {
  padding: 10px;
  border: 1px solid #ddd;
  border-radius: 4px;
}

a[href^="https"] {
  color: #007bff;
}

img[alt*="logo"] {
  border: 2px solid #007bff;
}

组合选择器

cssCode
/* 后代选择器 */
.container p {
  margin-bottom: 1rem;
}

/* 子选择器 */
.nav > .nav-item {
  padding: 10px;
}

/* 相邻兄弟选择器 */
h1 + p {
  font-size: 1.2rem;
  font-weight: 600;
}

/* 通用兄弟选择器 */
h1 ~ p {
  color: #666;
}

/* 分组选择器 */
h1, h2, h3 {
  font-weight: 700;
  margin-bottom: 0.5rem;
}

伪类选择器

cssCode
/* 链接伪类 */
a:link {
  color: #007bff;
}

a:visited {
  color: #6c757d;
}

a:hover {
  color: #0056b3;
  text-decoration: underline;
}

a:active {
  color: #004085;
}

/* 表单伪类 */
input:focus {
  outline: 2px solid #007bff;
  outline-offset: 2px;
}

input:checked {
  accent-color: #007bff;
}

input:disabled {
  opacity: 0.5;
  cursor: not-allowed;
}

/* 位置伪类 */
li:first-child {
  font-weight: 700;
}

li:last-child {
  margin-bottom: 0;
}

li:nth-child(2n) {
  background-color: #f5f5f5;
}

li:nth-of-type(3) {
  color: #007bff;
}

/* 其他伪类 */
.nav-item:not(.active) {
  opacity: 0.7;
}

:is(h1, h2, h3) {
  font-weight: 700;
}

/* 父元素选择器 */
article:has(img) {
  padding: 20px;
}

伪元素选择器

cssCode
/* ::before/::after */
.card::before {
  content: '';
  display: block;
  width: 100%;
  height: 4px;
  background-color: #007bff;
}

.button::after {
  content: ' →';
  margin-left: 5px;
}

/* ::first-letter/::first-line */
.article p::first-letter {
  font-size: 2rem;
  font-weight: 700;
  float: left;
  margin-right: 10px;
}

.article p::first-line {
  font-weight: 600;
  color: #333;
}

/* ::selection */
::selection {
  background-color: #007bff;
  color: white;
}

/* ::placeholder */
input::placeholder {
  color: #999;
  font-style: italic;
}

/* ::marker */
li::marker {
  color: #007bff;
  font-weight: 700;
}

优先级示例

cssCode
/* 优先级:100 */
#header {
  color: red;
}

/* 优先级:20 */
.nav .item {
  color: blue;
}

/* 优先级:112 */
div#nav .item a {
  color: green;
}

/* 相同优先级,后定义的规则生效 */
.button {
  background-color: #007bff;
}

.button {
  background-color: #0056b3;
}

/* !important 覆盖一切 */
.button {
  background-color: #dc3545 !important;
}

最佳实践

保持选择器简洁
避免过度嵌套(不超过 3 层)
合理使用类选择器
理解优先级规则
避免使用 !important
使用 BEM 等命名规范
测试选择器性能