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

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

to() 是 @scope 的下界,它排除指定元素及其子树,让作用域样式不穿透到嵌套组件里。:scope 是伪类,指代作用域根元素本身,用于给根元素加样式。一个管范围的「下限」,一个指向范围的「起点」,功能完全不同。

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

下界与 `:scope` 的角色

  1. to() 下界限制作用域的底部边界,排除嵌套区域
  2. :scope 伪类指代作用域根元素,可用于给根自身加样式
  3. 作用域范围从根元素到下界之间的 DOM 子树,样式只在这个范围内生效

to() 里的选择器是相对于作用域根解析的,不是相对于文档根。这意味着 to(.inner) 只会匹配根子树里的 .inner。

核心回答

先记住这个答案

to() 和 :scope 是 @scope 规则里两个完全不同的东西。to() 设置作用域的下界,让花括号里的样式不穿透到指定元素及其子树。:scope 是个伪类选择器,指代作用域根元素本身,让你可以在 @scope 里给根元素加样式。一个控制范围的「底部在哪里」,一个指向范围的「起点是谁」。

  • to(.boundary) 排除边界及后代
  • :scope 指代作用域根元素本身
  • 下界元素自身也被排除,不只是它的子代
  • 多个 to() 选择器用逗号分隔

用 to() 防止样式穿透到嵌套组件

组件嵌套是 to() 最典型的使用场景。比如一个 .tabs 组件里面嵌套了另一个 .tabs,外层的 .tabs 样式默认会穿透到内层。

用下界隔离嵌套的选项卡HTML
<style>
  @scope (.tabs) to (.tabs) {
    .tab { border-bottom: 2px solid blue; }
    .panel { padding: 16px; }
  }
</style>

<div class="tabs">
  <div class="tab">外层选项</div>
  <div class="panel">
    <div class="tabs">
      <div class="tab">内层选项 —— 不受外层样式影响</div>
    </div>
  </div>
</div>

@scope (.tabs) to (.tabs) 的意思是:从第一个 .tabs 开始匹配,遇到下一个 .tabs 就停止。外层的 .tab 和 .panel 会被选中并加样式,内层 .tabs 里的 .tab 不会。下界元素(内层 .tabs)本身也被排除。 如果没有 to() 下界,外层 @scope (.tabs) 的样式会一直匹配到所有嵌套层级的 .tab 和 .panel,导致内层组件的样式被污染。

用 :scope 给作用域根自身加样式

@scope 里写的普通选择器只能匹配根的子代元素,选不到根本身。想给根加样式,就用 :scope 伪类。

给卡片根元素加边框和圆角CSS
@scope (.card) {
  :scope {
    border: 1px solid #e0e0e0;
    border-radius: 8px;
    overflow: hidden;
  }
  .title { font-size: 18px; }
  .body { padding: 16px; }
}

:scope 就是 .card 自己。如果不用 :scope,只写 .card { ... } 也能选到,但这会匹配所有嵌套的 .card,而 :scope 只指代当前作用域根那一个元素。 :scope 的选择器优先级是 (0,1,0),和一个普通类选择器相同。

下界的几个细节

to() 里可以写多个选择器,用逗号分隔。比如 @scope (.card) to (.card, .modal) 会在遇到 .card 或 .modal 时都停止。

下界选择器是相对于作用域根解析的,不是相对于文档根。所以 to(.inner) 只匹配根子树里的 .inner,页面其他地方的 .inner 不受影响。

如果下界选择器匹配到了多个元素,每个都会成为一个隔离边界。从根到任意一个下界元素之间的路径上的元素才在作用域内。

回答前,多想一步

容易答错的地方

把 to() 和 :scope 的功能搞反
to() 管的是范围的下限,决定样式「到哪里停」。:scope 指代作用域根元素本身,用于在选择器里引用「范围从哪里开始」。两者名字都和 scope 相关,但一个是作用域边界的一部分,一个是选择器的一部分。
以为下界元素还在作用域范围内
下界元素自身及其所有子代都被排除在作用域之外。写 @scope (.card) to (.footer) 时,.footer 和 .footer 里面的所有元素都不受 @scope 里的样式影响。
试着用自己的话回答

面试官还会怎么问?

不在 @scope 里能用 :scope 吗?

可以。在普通的样式表里,:scope 等同于 :root,指向文档的根元素。在 querySelector 的参数里,:scope 指代调用 querySelector 的那个元素。但这些场景下它和 @scope 没有关系。

如果 to() 选择器匹配不到任何元素会怎样?

作用域就没有下界,等同于没写 to()。@scope 里的样式会匹配根的所有子代元素。这不会报错,只是下界没有生效。

@scope 的下界能动态变化吗?

能。如果通过 JavaScript 动态添加或移除了匹配 to() 选择器的元素,作用域范围会自动更新。新出现的下界元素及其子树会被排除出去,移除的下界元素对应的子树会重新纳入作用域。浏览器会根据 DOM 变化实时重新计算。

从一道题,走向一组知识

把知识连起来

层叠与选择器

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

@scope 不改变优先级权重,了解内联样式和 !important 的优先级有助于判断 @scope 声明何时会被覆盖。

层叠与选择器

:not() 自己有优先级吗?加了它选择器权重会变高吗?

:scope 和 :not() 都是伪类,但优先级计算方式不同,:scope 优先级是 (0,1,0),:not() 取参数里最高的。

参考资料

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

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

本题目录
  1. 先记住这个答案
  2. 用 to() 防止样式穿透到嵌套组件
  3. 用 :scope 给作用域根自身加样式
  4. 下界的几个细节
  5. 容易答错的地方
  6. 面试官还会怎么问
  7. 把知识连起来
读懂,再试着讲出来

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

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