@at-root
The @at-root
rule is usually written @at-root <selector> { ... }
and causes everything within it to be emitted at the root of the document instead of using the normal nesting. It's most often used when doing advanced nesting with the SassScript parent selector and selector functions.
For example, suppose you want to write a selector that matches the outer selector and an element selector. You could write a mixin like this one that uses the selector.unify()
function to combine &
with a user’s selector.
SCSS Syntax
@use "sass:selector";
@mixin unify-parent($child) {
@at-root #{selector.unify(&, $child)} {
@content;
}
}
.wrapper .field {
@include unify-parent("input") {
/* ... */
}
@include unify-parent("select") {
/* ... */
}
}
Sass Syntax
@use "sass:selector"
@mixin unify-parent($child)
@at-root #{selector.unify(&, $child)}
@content
.wrapper .field
@include unify-parent("input")
/* ... */
@include unify-parent("select")
/* ... */
CSS Output
.wrapper input.field {
/* ... */
}
.wrapper select.field {
/* ... */
}
The @at-root
rule is necessary here because Sass doesn’t know what interpolation was used to generate a selector when it’s performing selector nesting. This means it will automatically add the outer selector to the inner selector even if you used &
as a SassScript expression. The @at-root
explicitly tells Sass not to include the outer selector.
💡 Fun fact:
The @at-root
rule can also be written @at-root { ... }
to put multiple style rules at the root of the document. In fact, @at-root <selector> { ... }
is just a shorthand for @at-root { <selector> { ... } }
!
Beyond Style Rules permalinkBeyond Style Rules
On its own, @at-root
only gets rid of style rules. Any at-rules like @media
or @supports
will be left in. If this isn’t what you want, though, you can control exactly what it includes or excludes using syntax like media query features, written @at-root (with: <rules...>) { ... }
or @at-root (without: <rules...>) { ... }
. The (without: ...)
query tells Sass which rules should be excluded; the (with: ...)
query excludes all rules except those that are listed.
SCSS Syntax
@media print {
.page {
width: 8in;
@at-root (without: media) {
color: #111;
}
@at-root (with: rule) {
font-size: 1.2em;
}
}
}
Sass Syntax
@media print
.page
width: 8in
@at-root (without: media)
color: #111
@at-root (with: rule)
font-size: 1.2em
CSS Output
@media print {
.page {
width: 8in;
}
}
.page {
color: #111;
}
.page {
font-size: 1.2em;
}
In addition to the names of at-rules, there are two special values that can be used in queries:
rule
refers to style rules. For example,@at-root (with: rule)
excludes all at-rules but preserves style rules.all
refers to all at-rules and style rules should be excluded.