一、CSS优先级核心规则(Cascading Order)
CSS样式的应用顺序由优先级权重决定,遵循以下规则(权重从高到低):
1. 优先级计算规则(四层级模型)
| 类型 | 示例 | 权重值 |
|---|---|---|
| 内联样式 | <div style="color: red;"> | 1,0,0,0 |
| ID选择器 | #container {} | 0,1,0,0 |
| 类选择器/属性选择器/伪类 | .class, [attr], :hover | 0,0,1,0 |
| 标签选择器/伪元素 | div, ::before | 0,0,0,1 |
| 通配符/继承样式/浏览器默认 | *, 继承的样式 | 0,0,0,0 |
2. 优先级计算示例
/* 样式1:内联样式,权重1,0,0,0 */
<div style="color: red;">
/* 样式2:ID选择器+类选择器,权重0,1,1,0 */
#box.container { color: blue; }
/* 样式3:类选择器*3,权重0,0,3,0 */
.container.content.text { color: green; }
/* 样式4:标签选择器,权重0,0,0,1 */
div { color: yellow; }
最终颜色:红色(内联样式优先级最高)。
二、CSS使用顺序的三大场景
1. 外部样式表加载顺序
- 规则:后加载的样式表会覆盖先加载的同名样式(权重相同时)。
- 示例:
<link rel="stylesheet" href="style1.css"> <!-- 先加载 --> <link rel="stylesheet" href="style2.css"> <!-- 后加载,优先级更高 --> - 最佳实践:
- 按功能模块排序(如重置样式 → 基础样式 → 组件样式);
- 关键样式内联,非关键样式异步加载(如
rel="preload")。
2. 内部样式与外部样式冲突
- 规则:内部样式(
<style>标签)优先级高于外部样式表(权重相同时)。 - 示例:
<link rel="stylesheet" href="style.css"> <!-- 外部样式:color: blue --> <style> .box { color: red; } <!-- 内部样式覆盖外部 --> </style>
3. 行内样式与CSS选择器冲突
- 规则:行内样式优先级最高,可覆盖任何选择器样式(除非选择器使用
!important)。 - 示例:
#box { color: blue !important; } /* 权重0,1,0,0 + !important */<div id="box" style="color: red;"> <!-- 行内样式被!important覆盖 -->
三、!important的特殊性
- 优先级:
!important可覆盖任何样式(包括行内样式),但会破坏样式的可维护性。 - 使用建议:
- 仅在紧急修复时使用(如覆盖第三方库样式);
- 避免在团队协作中使用(易引发样式冲突)。
- 示例:
.btn { color: red !important; } /* 强制红色,优先级高于行内样式 */
四、问题
1. 问:如何计算CSS选择器的优先级?
- 答:
- 按四层级模型累加权重:
- 内联样式:1,0,0,0
- ID选择器:0,1,0,0(每个ID加1)
- 类/属性/伪类:0,0,1,0(每个加1)
- 标签/伪元素:0,0,0,1(每个加1)
- 示例:
#nav .item:hover的权重为0,1,1,0(1个ID + 1个类 + 1个伪类)。
- 按四层级模型累加权重:
2. 问:CSS样式冲突时的解决顺序?
- 答:
- 先比较优先级权重,高权重优先;
- 权重相同时,后出现的样式覆盖先出现的;
- 行内样式 > ID选择器 > 类选择器 > 标签选择器;
!important可覆盖所有规则(但应谨慎使用)。
3. 问:如何避免CSS样式冲突?
- 答:
- 命名空间隔离:使用BEM规范(如
.component__element--modifier); - CSS Modules:生成唯一类名(如
className={styles.box}); - 作用域限制:通过CSS-in-JS库(如styled-components);
- 优先级控制:避免使用
!important,通过选择器权重合理覆盖。
- 命名空间隔离:使用BEM规范(如
4. 问:CSS加载顺序对性能的影响?
- 答:
- 阻塞渲染:CSS是渲染阻塞资源,应优先加载关键CSS;
- 优化策略:
- 关键CSS内联在
<head>中; - 非关键CSS异步加载(如
rel="preload"+onload); - 使用CSS Tree Shaking(如Tailwind CSS的按需加载)。
- 关键CSS内联在
五、最佳实践与性能优化
-
样式组织原则
- 层叠顺序:重置样式 → 基础变量 → 工具类 → 组件样式;
- 示例(Tailwind CSS):
@layer base { body { font-family: sans-serif; } } @layer utilities { .content-auto { content-visibility: auto; } } @layer components { .btn { @apply px-4 py-2 rounded; } }
-
优先级控制技巧
- 避免过度嵌套选择器(如
div.container .item改为.container-item); - 使用类选择器替代标签选择器(如
.box而非div.box); - 第三方库样式后加载(如
bootstrap.css后加载自定义样式)。
- 避免过度嵌套选择器(如
-
性能优化方案
- CSS压缩:移除冗余空格、合并选择器;
- 懒加载:非首屏样式通过JS动态加载;
- 避免重排重绘:优先修改类名而非直接操作样式(如
.element.addClass('active'))。