CSS cascade layers (@layer) work in Chrome 99+, Edge 99+, Firefox 97+, Safari 15.4+, Opera 86+, and Samsung Internet 18+. See full browser support and syntax.

Prince Dewani
May 6, 2026
CSS cascade layers are an at-rule from the W3C CSS Cascading and Inheritance Level 5 specification that group style rules into ordered buckets so layer order beats selector specificity. They work in Chrome 99+, Edge 99+, Firefox 97+, Safari 15.4+ on macOS and iOS, Opera 86+, and Samsung Internet 18+, while Internet Explorer never shipped support.
This guide covers what CSS cascade layers are, the browsers that support them, how to use the @layer at-rule, the use cases, and the known issues.
CSS Cascade Layers are explicit specificity buckets defined by the W3C in CSS Cascading and Inheritance Level 5. The @layer at-rule declares a layer and sets its order in the cascade, so the last declared layer wins over earlier ones, regardless of selector specificity.
Cascade layers ship by default in every modern engine. The Web Platform Baseline marks @layer as Widely Available across Chromium, Gecko, and WebKit, with Internet Explorer the only major engine that never added the feature.
Chrome supports cascade layers from Chrome 99 on Windows, macOS, Linux, ChromeOS, and Android. Chrome 96 to 98 had @layer disabled by default behind the Layered API flag in chrome://flags, and Chrome 4 to 95 did not support it at all.
Microsoft Edge supports cascade layers from Edge 99 on Windows, macOS, and Linux through its Chromium pipeline. Edge 96 to 98 mirrored Chrome's flagged behavior, and Edge 12 to 95 dropped @layer rules as unrecognized syntax.
Firefox supports cascade layers from Firefox 97 on Windows, macOS, Linux, and Android. Firefox 94 to 96 kept @layer behind the layout.css.cascade-layers.enabled flag in about:config, and Firefox 2 to 93 ignored the at-rule and every nested declaration inside it.
Safari supports cascade layers from Safari 15.4 on macOS Monterey and from Safari 15.4 on iOS and iPadOS 15.4. Safari 3.1 to 15.3 on macOS and Safari 3.2 to 15.3 on iOS treated @layer as unknown CSS, so every rule inside a layer was discarded.
Opera supports cascade layers from Opera 86 on Windows, macOS, and Linux through its Blink engine. Opera 9 to 85 did not support the at-rule, and Opera Mobile picked up support from Opera Mobile 64 on Android in line with the Chromium update.
Samsung Internet supports cascade layers from Samsung Internet 18 on Galaxy phones and tablets through its Chromium base. Samsung Internet 4 to 17 did not parse @layer, so any rules inside a layer were silently dropped on those builds.
Modern Android WebView and Chrome for Android support cascade layers from Chrome 99 forward. The legacy stock Android Browser (2.1 to 4.4.4) did not support @layer at all, so any traffic from those devices needs a no-layers fallback stylesheet.
Internet Explorer 5.5 through Internet Explorer 11 never added support for the @layer at-rule. Microsoft has retired Internet Explorer, so any legacy intranet pages that still need styling have to use Edge or Edge IE Mode and skip cascade layers entirely on the IE Mode path.
Note: CSS cascade layers behave differently across Safari before 15.4, flag-gated Chromium builds, and modern engines. Test it on real browsers and OS with TestMu AI. Try TestMu AI free!
Declare layer order once at the top of your stylesheet, then add rules into each named layer. Browsers stack the layers in the order you listed them, so the last one wins for normal declarations.
Verify the order is doing the work in DevTools by inspecting the Computed pane and checking the Specificity column for the @layer label next to the winning rule.
/* 1. Declare layer order up front. The first layer has the lowest priority. */
@layer reset, base, components, utilities;
/* 2. Add rules into each layer. */
@layer reset {
* { margin: 0; padding: 0; box-sizing: border-box; }
}
@layer components {
.button { padding: 12px 20px; border-radius: 8px; background: #2b6cb0; color: #fff; }
}
@layer utilities {
/* Wins over .button even though the selector is less specific. */
.text-center { text-align: center; }
}
/* 3. Detect support before falling back. */
@supports not (at-rule(@layer)) {
/* Older Safari and Firefox land here. */
.button { padding: 12px 20px; border-radius: 8px; background: #2b6cb0; color: #fff; }
}Cascade layers solve specificity problems that used to require !important, deep selectors, or build-time tricks. Most teams adopt them on design systems, vendor stylesheets, and theming code where override order has to be predictable.
Cascade layers ship widely but still surprise teams that move from a flat stylesheet to a layered one. Most of the bugs come from interactions with !important, unlayered styles, and older Safari builds that drop every rule inside an unknown @layer block.
In my experience, the trap that bites teams hardest is shipping a layered design system without a @supports fallback and finding out a week later that a chunk of iOS users on iOS 15.3 saw the page with zero component styling at all.
All CSS cascade layers version numbers and platform notes in this guide come from these primary sources:
Did you find this page helpful?
More Related Hubs
TestMu AI forEnterprise
Get access to solutions built on Enterprise
grade security, privacy, & compliance