前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
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 @scope rule cascade
CSS层叠与选择器

CSS 的 @scope 规则怎么用?它在层叠中是什么位置?

@scope (.root) 让花括号里的选择器只匹配 .root 子树内的元素。还能加 to(.boundary) 设下界,排除嵌套的子组件区域。@scope 不增加选择器的优先级权重,但引入了「作用域邻近度」:优先级相同时,离作用域根越近的声明胜出。

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

`@scope` 的三个要素

  1. 作用域根@scope (.card) 中的 .card,样式只在它的子树内生效
  2. 下界to(.slot) 排除 .slot 及其子树,样式不会渗透进去
  3. 邻近度优先级相同时,离根更近的 @scope 声明胜出

@scope 里的选择器可以用 :scope 伪类指代作用域根元素本身,类似 & 在嵌套里的角色。

核心回答

先记住这个答案

@scope 是 CSS 原生的作用域机制。写法是 @scope (.root) { ... },花括号里的选择器只会匹配 .root 子树内的元素。还可以加 to(.boundary) 设一个下界,让样式不渗透到 .boundary 及其子树里。它不增加选择器的优先级权重,但引入了「作用域邻近度」的概念:当两条规则优先级完全相同时,离作用域根更近的那条胜出。

  • @scope (.root) 限制选择器只在子树内匹配
  • to() 设下界,排除嵌套区域
  • 不改变优先级权重,只加「邻近度」比较
  • 在 <style> 标签里可省略根选择器

基本用法:给组件划定样式范围

以前想让 .card 内部的 <p> 样式不影响页面其他地方的 <p>,要么用 BEM 命名(.card__text),要么用 CSS Modules 编译。现在可以直接写 @scope。

限制选择器只在 .card 内匹配CSS
@scope (.card) {
  p {
    margin: 0 0 12px;
    line-height: 1.6;
  }
  .title {
    font-size: 18px;
  }
}
/* 页面其他地方的 p 和 .title 不受影响 */

@scope (.card) 里的 p 选择器只会匹配 .card 子树里的 <p> 元素。页面其他地方的 <p> 不会被选中。选择器本身的优先级还是 (0,0,1),@scope 不会帮它加权重。 还有一种写法是在 <style> 标签上直接用 @scope,不写根选择器,这时作用域根就是 <style> 标签的父元素。这种方式适合在 HTML 组件模板里内联样式。

用 to() 排除嵌套区域

组件经常会嵌套。比如 .card 里面还有一个 .card,外层 @scope (.card) 的样式会穿透到内层。这时用 to() 设一个下界。

排除嵌套的子卡片CSS
@scope (.card) to (.card) {
  p { color: #333; }
}

这条规则让 p { color: #333 } 只作用于外层 .card 到内层 .card 之间的 <p> 元素。内层 .card 里的 <p> 不受影响。下界元素本身也被排除在外。 这在实际项目里很实用。组件库里 .dropdown 可能嵌套 .dropdown(多级菜单),用 @scope (.dropdown) to (.dropdown) 就能确保每一级只管自己的样式。

邻近度在层叠中的位置

@scope 引入的「作用域邻近度」只在一个很窄的条件下起作用:两条规则的来源、!important、layer 顺序、选择器优先级全部相同时,才比较邻近度。离作用域根更近的规则胜出。

比如页面上有两个嵌套的 @scope,外层是 @scope (.page),内层是 @scope (.card)。如果两者都给 p 设了 color,选择器优先级都是 (0,0,1),那么 @scope (.card) 胜出,因为 .card 离目标 <p> 更近。

如果外层的选择器更具体(比如 .page .content p),它的优先级更高,邻近度就不起作用了。所以邻近度是个「兜底」机制,不能依赖它来覆盖样式。

回答前,多想一步

容易答错的地方

以为 @scope 会提升选择器优先级
@scope 不增加任何优先级权重。@scope (.card) { p { color: blue; } } 里的 p 优先级还是 (0,0,1),外部一个 .text { color: red } 就能覆盖它。想提升优先级要在选择器本身下功夫。
以为 @scope 能阻止外部样式穿透
@scope 只限制自己写的选择器的匹配范围,不阻止外部选择器匹配 @scope 范围内的元素。想要真正的样式隔离要用 Shadow DOM。
试着用自己的话回答

面试官还会怎么问?

@scope 里能用 :scope 伪类做什么?

:scope 指代作用域根元素本身。比如 @scope (.card) { :scope { border: 1px solid #ddd; } } 就是给 .card 本身加边框。没有 :scope 的话,@scope 里的选择器只能匹配子代元素。

@scope 和 CSS 嵌套(&)有什么区别?

CSS 嵌套是语法糖,& 代表父选择器,展开后和平铺写法完全等价,不影响匹配范围。@scope 是真正限制了选择器的匹配范围,超出作用域的元素即使满足选择器也不会被选中。

浏览器兼容性怎么样?

Chrome 118、Edge 118、Safari 17.4 以上支持。Firefox 128 开始支持。IE 不支持。目前如果要兼容老浏览器,还是需要 BEM 命名或 CSS Modules 作为备选方案。

从一道题,走向一组知识

把知识连起来

层叠与选择器

@scope 的 to() 下界怎么用?和 :scope 伪类有什么区别?

to() 下界的具体用法和边界情况,是 @scope 最容易用错的地方。

层叠与选择器

内联样式和 !important 的优先级到底是怎么算的?

@scope 不改变优先级权重,理解优先级计算规则有助于预判 @scope 和外部规则的胜负。

参考资料

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

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

本题目录
  1. 先记住这个答案
  2. 基本用法:给组件划定样式范围
  3. 用 to() 排除嵌套区域
  4. 邻近度在层叠中的位置
  5. 容易答错的地方
  6. 面试官还会怎么问
  7. 把知识连起来
读懂,再试着讲出来

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

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