@layer
Dzieli style na warstwy kaskadowe o ustalonej kolejności. Reguła z późniejszej warstwy wygrywa bez względu na specyficzność selektora.
Przykład
#@layer reset, base, components, utilities;
@layer reset {
button { margin: 0; border: 0; font: inherit; }
}
@layer base {
a { color: #a78bfa; }
}
@layer components {
button.btn {
padding: 8px 16px;
border-radius: 10px;
background: #7c3aed;
color: #fff;
}
}
@layer utilities {
.bg-rose { background: #f43f5e; }
}<div style="display: flex; flex-wrap: wrap; align-items: center; gap: 12px;">
<button class="btn" type="button">Zapisz</button>
<button class="btn bg-rose" type="button">Usuń</button>
<a href="#">Anuluj</a>
</div>Klasa pomocnicza .bg-rose wygrywa z button.btn, choć ma niższą specyficzność, bo warstwa utilities jest ostatnia na liście.
Definicja i zastosowanie
#Reguła @layer porządkuje kaskadę. Style zamykasz w nazwanych warstwach, a o tym, która deklaracja wygra, decyduje najpierw kolejność warstw, a dopiero potem specyficzność selektora i położenie w kodzie. Selektor #menu .link z wcześniejszej warstwy przegra z samym a z warstwy późniejszej.
Kolejność ustala pierwsze pojawienie się nazwy. Najwygodniej zapisać ją raz, na początku arkusza: @layer reset, base, components, utilities;. Potem możesz dopisywać style do warstw w dowolnym miejscu i w dowolnej kolejności, a nawet w osobnych plikach, np. przez @import url("reset.css") layer(reset).
Style zapisane poza jakąkolwiek warstwą tworzą niejawną warstwę, która jest ostatnia, więc wygrywają ze wszystkimi warstwami. To celowe: istniejący kod dalej działa, a warstwy możesz wprowadzać stopniowo. Przy !important kolejność się odwraca: ważna deklaracja z pierwszej warstwy pokonuje ważne deklaracje z warstw późniejszych.
Popularny układ to cztery warstwy: reset zeruje domyślne style przeglądarki, base ustawia typografię i wygląd zwykłych elementów HTML, components zawiera przyciski, karty i formularze, a utilities małe klasy pomocnicze, które mają zawsze wygrywać. Podobny podział stosuje Tailwind CSS w wersji 4.
Składnia
#@layer reset, base, components;
@layer components {
selektor { właściwość: wartość; }
}Jak wygrywają warstwy
#theme, zielony
Warstwathemejest druga na liście, więc wygrywa, choć jej blok stoi w kodzie wyżej niż blokbase.theme, zielony
Wbasestoi selektor z identyfikatorem, a mimo to przegrywa. Warstwy porównuje się przed specyficznością.styl bez warstwy, bursztynowy
Reguła spoza warstw wygrywa z każdą warstwą, nawet gdy ma słabszy selektor i stoi w kodzie wcześniej.base, czerwony
Przy!importantkolejność się odwraca: ważna deklaracja z wcześniejszej warstwy pokonuje ważną z późniejszej. Dzięki temu reset może zabezpieczyć kluczowe style.components.buttons, błękitny
Warstwy można zagnieżdżać, a do wewnętrznej odwołujesz się przez kropkę. Kolejność liczy się wtedy wewnątrz grupycomponents.powrót do base po najechaniu
Słoworevert-layercofa wartość do tej z wcześniejszych warstw. Najedź kursorem na przycisk: wraca do zielonego tła z warstwybase.
Jak wygrywają warstwy w praktyce
#kolejność warstw
theme jest druga na liście, więc wygrywa, choć jej blok stoi w kodzie wyżej niż blok base.@layer base, theme;
@layer theme {
.demo { background: #10b981; }
}
@layer base {
.demo { background: #f43f5e; }
}mocniejszy selektor
base stoi selektor z identyfikatorem, a mimo to przegrywa. Warstwy porównuje się przed specyficznością.@layer base, theme;
@layer base {
#cta.demo { background: #f43f5e; }
}
@layer theme {
.demo { background: #10b981; }
}styl bez warstwy
button { background: #f59e0b; }
@layer theme {
#cta.demo { background: #10b981; }
}!important
!important kolejność się odwraca: ważna deklaracja z wcześniejszej warstwy pokonuje ważną z późniejszej. Dzięki temu reset może zabezpieczyć kluczowe style.@layer base, theme;
@layer base {
.demo { background: #f43f5e !important; }
}
@layer theme {
.demo { background: #10b981 !important; }
}warstwy zagnieżdżone
components.@layer components.base, components.buttons;
@layer components.buttons {
.demo { background: #0ea5e9; }
}
@layer components.base {
.demo { background: #f43f5e; }
}revert-layer
revert-layer cofa wartość do tej z wcześniejszych warstw. Najedź kursorem na przycisk: wraca do zielonego tła z warstwy base.@layer base, theme;
@layer base {
.demo { background: #10b981; }
}
@layer theme {
.demo { background: #f43f5e; }
.demo:hover { background: revert-layer; }
}Więcej przykładów
#@layer vendor, app;
@layer vendor {
#widget .title { color: #f43f5e; }
}
@layer app {
.title { color: #10b981; }
}<div id="widget" class="stage">
<h3 class="title" style="margin: 0;">Nagłówek widżetu</h3>
</div>Selektor biblioteki zawiera identyfikator, a mimo to przegrywa, bo warstwa vendor jest wcześniej. W praktyce bibliotekę wczytasz do warstwy przez @import url("lib.css") layer(vendor).
Obsługa przeglądarek
#Szeroko dostępne · od 2022 roku
Działa we wszystkich nowoczesnych przeglądarkach, także na telefonach. Możesz używać bez obaw.
- Chrome
- Edge
- Firefox
- Safari
Dobre praktyki
#- Zapisz kolejność wszystkich warstw w jednej linii na samym początku arkusza. Kolejność ustala pierwsze wystąpienie nazwy, więc bez tej linii łatwo ją przypadkiem zmienić.
- Pamiętaj, że style poza warstwami wygrywają z warstwami. Przenosząc stary kod, zacznij od resetu i bibliotek, a własne style zostaw na razie poza warstwami.
- Warstwy zastępują wyścig na specyficzność. Zamiast dopisywać kolejne klasy i
!important, przenieś regułę do późniejszej warstwy.
Powiązane hasła
#- SpecyficznośćWaga selektora, która decyduje, która reguła wygra, gdy kilka reguł ustawia tę samą właściwość tego samego elementu.
- @importDołącza zawartość innego arkusza CSS do bieżącego. Może od razu umieścić go w warstwie albo wczytać tylko dla wybranych mediów.
- :where()Działa jak :is(), ale zawsze ma zerową specyficzność. Idealna do stylów bazowych, które łatwo nadpisać.
- :is()Dopasowuje element do dowolnego selektora z listy. Skraca długie, powtarzalne selektory do jednego zapisu.
- @mediaWłącza style tylko wtedy, gdy urządzenie spełnia warunek: ma odpowiednią szerokość okna, ciemny motyw, mysz albo drukuje stronę.
Widzisz błąd albo brakuje przykładu? Napisz do nas.