前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
首页程序员面试题库CSS cascade layer priority order
CSS层叠与选择器

两条规则来自不同层,优先级看层的顺序还是选择器权重?

看层的声明顺序。两条规则来自不同的层时,浏览器根本不比选择器权重,后声明的层直接赢。只有在同一层内部,才按权重和源码顺序比较。

前端进阶之旅 · 一题精讲更新于 2026.09.29
CSS#层叠与选择器
先看核心答案读代码示例
理解线索

层叠排序的三个层级

  1. 来源与重要性先分普通声明还是 !important 声明,再往下比
  2. 层的顺序后声明的层赢先声明的,不看选择器
  3. 选择器权重同一层内才用权重和源码顺序分胜负

很多人习惯用「写更具体的选择器」来解决冲突,但 @layer 让这个策略失效了。跨层时写再长的选择器也没用。

核心回答

先记住这个答案

层的声明顺序优先于选择器权重。两条冲突规则分别在不同层里时,浏览器先比层的顺序,后声明的层直接赢,根本不去看选择器写了多少层嵌套。选择器权重只在同一层内部才有用,用来决定层内多条规则谁赢。

  • 跨层比较只看层的声明顺序
  • 选择器权重只在同层内有效
  • 未分层样式赢所有层
  • 同层同权重时按源码顺序

一段代码验证层序碾压权重

下面的例子里,base 层用了三层嵌套的高权重选择器,theme 层只用了一个类选择器,结果是 theme 赢。

高权重选择器输给低权重选择器CSS
@layer base, theme;

@layer base {
  #app .wrapper .btn { color: red; } /* 权重 (1, 2, 0) */
}
@layer theme {
  .btn { color: blue; }              /* 权重 (0, 1, 0),但赢了 */
}

.btn 元素显示蓝色。theme 层后声明,优先级更高,层间比较时选择器权重不参与。这是 @layer 最核心的特性:用声明顺序取代选择器军备竞赛。

同一层内仍看权重和源码顺序

层间比较靠声明顺序,层内则和传统 CSS 一样。

同层内的正常权重比较CSS
@layer components {
  .card .title { color: red; }   /* 权重 (0, 2, 0) */
  .title { color: blue; }        /* 权重 (0, 1, 0) */
}

两条规则在同一个层里,权重高的赢,.card .title 显示红色。如果权重也一样,就看谁写在后面,后面的赢。这和没有 @layer 时的行为完全一致。 所以 @layer 并没有废除选择器权重,它是在权重之上加了一层更高优先级的排序维度。

未分层样式在这个体系里的位置

没有放进任何层的样式,等价于排在所有命名层之后的一个隐含层,优先级最高。这意味着一条简单的 .btn { color: green; } 只要写在层外面,就能赢层里的任何规则,不管对方权重多高。

这个设计让渐进迁移变得安全:老项目可以先把第三方库用 @layer 包起来,自己的样式暂时不动,不会出现样式突然被覆盖的问题。等全部迁移到层之后,再用预声明统一管理顺序。

回答前,多想一步

容易答错的地方

答成「权重高的赢」然后才提层
面试时如果先说权重,说明对层叠排序的理解还停留在没有 @layer 的时代。正确的排序是:来源和重要性 → 层的顺序 → 选择器权重 → 源码顺序。层在权重之前。
混淆层的声明顺序和代码书写位置
有预声明时,层的优先级以预声明为准。base 层的代码写在文件最后面,优先级也不会变高,因为预声明已经锁定了它的排名。
试着用自己的话回答

面试官还会怎么问?

行内 style 属性和层的关系是什么?

行内样式不属于任何层,在层叠排序中优先于所有层和所有未分层样式。只有 !important 层声明能打败行内 !important,而且也要遵守反转规则。

同一层在多个文件里都写了,层内的源码顺序怎么算?

按文件被引入的顺序拼接。先引入的文件里的规则排在前面,后引入的排在后面。拼接完之后当作同一层内的一份代码来比较权重和源码顺序。

CSS Modules 或 Scoped Styles 和 @layer 冲突吗?

不冲突。CSS Modules 通过 hash 类名避免命名冲突,@layer 通过层的顺序控制优先级,两者解决不同的问题。你可以把 CSS Modules 产出的样式放进一个层里,同时享受两者的好处。

从一道题,走向一组知识

把知识连起来

层叠与选择器

nth-child 的 an+b 公式是怎么计算的?

层叠排序弄清后,:nth-child 的公式选择是另一个容易搞混的选择器细节。

层叠与选择器

only-child 和 only-of-type 分别在什么条件下匹配?

:only-child 涉及结构伪类的权重计算,可以用来验证同层内权重比较的规则。

参考资料

  • CSS:层叠与选择器参考资料

示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。

本题目录
  1. 先记住这个答案
  2. 一段代码验证层序碾压权重
  3. 同一层内仍看权重和源码顺序
  4. 未分层样式在这个体系里的位置
  5. 容易答错的地方
  6. 面试官还会怎么问
  7. 把知识连起来
读懂,再试着讲出来

先看核心答案,再读代码。最后展开追问,检查自己有没有遗漏边界。

试着回答追问
浏览全部面试题理解原理,也关注真实的使用场景。回到顶部 ↑