入口 at-root

假设您要编写一个匹配外部选择器和元素选择器的选择器。

@at-root 规则通常写成 @at-root <selector> { ... } 并导致其中的所有内容都在文档的根部发出,而不是使用正常的嵌套。 在使用 [SassScript 父选择器](/style-rules/parent-selector#in -sassscript) 和 选择器函数

例如,假设您要编写一个匹配外部选择器和元素选择器的选择器。 您可以编写一个像这样的 mixin,它使用 selector.unify() 函数& 与用户的选择器结合起来。

scss
Scss
scss
@use "sass:selector";

@mixin unify-parent($child) {
  @at-root #{selector.unify(&, $child)} {
    @content;
  }
}

.wrapper .field {
  @include unify-parent("input") {
    /* ... */
  }
  @include unify-parent("select") {
    /* ... */
  }
}

@at-root 规则在这里是必要的,因为 Sass 在执行选择器嵌套时不知道使用什么插值来生成选择器。 这意味着它会自动将外部选择器添加到内部选择器,_即使_您使用“&”作为 SassScript 表达式。 @at-root 明确告诉 Sass 不要包含外部选择器。

💡 有趣的事实:

@at-root 规则也可以写成 @at-root { ... } 将多个样式规则放在文档的根部。 事实上,@at-root <selector> { ... } 只是@at-root { <selector> { ... } } 的简写!

超越样式规则

就其本身而言,@at-root 只会摆脱 style rules。 任何类似 @media@supports 的规则都将保留在 . 但是,如果这不是您想要的,您可以使用 媒体查询功能,写成@at-root (with: <rules...>) { ... }@at-root (without: <rules...>) { ... } (without: ...) 查询告诉 Sass 应该排除哪些规则; (with: ...) 查询排除所有规则_除了_列出的规则。

scss
Scss
scss
@media print {
  .page {
    width: 8in;

    @at-root (without: media) {
      color: #111;
    }

    @at-root (with: rule) {
      font-size: 1.2em;
    }
  }
}

除了 at 规则的名称之外,还有两个可以在查询中使用的特殊值:

  • rule 是指样式规则。 例如,@at-root (with: rule) 排除所有 at 规则但保留样式规则。
  • all 指的是所有 at-rules and 样式规则应该被排除在外。