`:scope` CSS pseudo-class
Baseline Widely available
This feature is well established and works across many devices and browser versions. It's been available across browsers since January 2020.
The :scope CSS pseudo-class represents elements that are a reference point, or scope, for selectors to match against.
/* Selects a scoped element */
:scope {
background-color: lime;
}
Which element(s) :scope matches depends on the context in which it is used:
- When used at the root level of a stylesheet,
:scopeis equivalent to:root, which in a regular HTML document matches the<html>element. - When used inside a
@scopeblock,:scopematches the block's defined scope root. It provides a way to apply styles to the root of the scope from inside the@scopeblock itself. - When used within a DOM API call — such as
querySelector(),querySelectorAll(),matches(), orElement.closest()—:scopematches the element on which the method was called.
Syntax
:scope {
/* ... */
}
Examples
Using :scope as an alternative to :root
This example shows that :scope is equivalent to :root when used at the root level of a stylesheet. In this case, the provided CSS colors the background of the <html> element orange.
:scope {
background-color: orange;
}
Using :scope to style the scope root in a @scope block
In this example, we use two separate @scope blocks to match links inside elements with a .light-scheme and .dark-scheme class respectively. Note how :scope is used to select and provide styling to the scope roots themselves. In this example, the scope roots are the <div> elements that have the classes applied to them.
HTML
<div class="light-scheme">
<p>
MDN contains lots of information about
<a href="/en-US/docs/Web/HTML">HTML</a>,
<a href="/en-US/docs/Web/CSS">CSS</a>, and
<a href="/en-US/docs/Web/JavaScript">JavaScript</a>.
</p>
</div>
<div class="dark-scheme">
<p>
MDN contains lots of information about
<a href="/en-US/docs/Web/HTML">HTML</a>,
<a href="/en-US/docs/Web/CSS">CSS</a>, and
<a href="/en-US/docs/Web/JavaScript">JavaScript</a>.
</p>
</div>
CSS
div {
padding: 10px;
}
@scope (.light-scheme) {
:scope {
background-color: plum;
}
a {
color: indigo;
}
}
@scope (.dark-scheme) {
:scope {
background-color: indigo;
color: antiquewhite;
}
a {
color: plum;
}
}
Result
Using :scope in JavaScript
This example demonstrates using the :scope pseudo-class in JavaScript. This can be useful if you need to get a direct descendant of an already retrieved Element.
HTML
<div id="context">
<div id="element-1">
<div id="element-1-1"></div>
<div id="element-1-2"></div>
</div>
<div id="element-2">
<div id="element-2-1"></div>
</div>
</div>
<p>
Selected element ids :
<span id="results"></span>
</p>
JavaScript
const context = document.getElementById("context");
const selected = context.querySelectorAll(":scope > div");
document.getElementById("results").textContent = [...selected]
.map((element) => `#${element.id}`)
.join(", ");
Result
The scope of context is the element with the id of context. The selected elements are the <div> elements that are direct children of that context — element-1 and element-2 — but not their descendants.
Sibling combinators to the right of :scope never match
The relationship defined by :scope is always ancestor-to-descendant from the scope root. Because of that, putting a sibling combinator to the right of :scope creates a selector that can never match, because no element can both be within the selector scope and also be a sibling of :scope.
:scope + p {
color: red;
}
:scope ~ * {
color: red;
}
Selectors that never match may trigger a warning in browser DevTools.
Specifications
| Specification |
|---|
| Selectors Level 4 # the-scope-pseudo |
Browser compatibility
| Desktop | Mobile | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox for Android | Opera Android | Safari on iOS | Samsung Internet | WebView Android | WebView on iOS | |
scope |
27 |
79 |
32Firefox 55 removes support for<style scoped> but not for the :scope pseudo-class, which is still supported. <style scoped> made it possible to explicitly set up element scopes, but ongoing discussions about the design of this feature as well as lack of other implementations resulted in the decision to remove it. |
15 |
7 |
27 |
32Firefox for Android 55 removes support for<style scoped> but not for the :scope pseudo-class, which is still supported. <style scoped> made it possible to explicitly set up element scopes, but ongoing discussions about the design of this feature as well as lack of other implementations resulted in the decision to remove it. |
15 |
7 |
1.5 |
4.4 |
7 |
dom_api |
27 |
79 |
32 |
15 |
7 |
27 |
32 |
15 |
7 |
1.5 |
4.4 |
7 |
See also
- The
@scopeat-rule - The
:rootpseudo-class - Selection and traversal on the DOM tree
-
Element.querySelector()andElement.querySelectorAll() -
Document.querySelector()andDocument.querySelectorAll() -
DocumentFragment.querySelector()andDocumentFragment.querySelectorAll()
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Selectors/:scope