@scope 通过原生 DOM 作用域实现比 BEM 更原子化的样式隔离,无需命名约定或构建工具,支持嵌套、to 边界控制与语义化选择器。

直接用 @scope 控制原始 DOM 元素的作用域,比 BEM 更原子化——不是靠命名约定“模拟”隔离,而是让浏览器原生理解“这个样式只管这一片结构”。关键不在类名多长,而在作用域边界是否由 DOM 层级真实定义。
用 :scope 代替冗余类名前缀
BEM 要求你写 .card__title、.card__content 来表明归属,本质是靠字符串拼接“假装”有作用域。而 @scope 允许你直接写语义化标签或基础类名,并用 :scope 锚定上下文:
@scope(.card) { :scope { display: block; } h2 { color: #2c3e50; } p { margin: 0.75rem 0; } }- 这里
h2和p不需要加任何修饰类,只要在.card内部就自动生效 - 浏览器会把
:scope解析为当前作用域根元素(即匹配.card的那个节点),天然对应 DOM 结构
嵌套组件不靠命名,靠作用域嵌套
BEM 遇到子组件常要写 .card__footer__button 或引入新 Block,逻辑断裂。而 @scope 支持层级嵌套,每个组件自定义自己的作用域根,互不污染:
@scope(.card) { @scope(.card-footer) { button { padding: 6px 12px; } } }- 内层
@scope(.card-footer)只影响.card下的.card-footer子树,外部同名.card-footer完全不受影响 - 无需新增类名规则,也不依赖构建时重写选择器
限制穿透:用 to 切断意外继承
BEM 对“子组件不该被父样式影响”的场景无能为力,只能靠开发者自觉避免类名重复。而 @scope 提供 to 边界控制,显式声明“到这里为止”:
立即学习“前端免费学习笔记(深入)”;
@scope(.modal) to (.modal-content) { .close { position: absolute; top: 8px; right: 8px; } }-
.close样式只作用于.modal到.modal-content之间的节点,不会进入.modal-content内部 - 这比 BEM 的“靠命名暗示层级”更确定、更可验证
零构建、零运行时,样式即 DOM 结构
BEM 是人为约定,CSS Modules 和 Scoped CSS 都依赖编译或属性注入;@scope 是浏览器原生解析的规则,写什么就生效什么:
- 不用等构建工具生成
data-v-xxx属性 - 不用在 JS 中 import 样式模块,也不用写
css\`...字符串 - 打开 DevTools → Elements → 查看某个
.card节点,它的样式来源一目了然,就是它自身所在的@scope块


















