@supports
Włącza style tylko w przeglądarkach, które obsługują daną właściwość, wartość albo selektor. Pozwala bezpiecznie korzystać z nowości.
Przykład
#.header {
background: rgb(24 24 27 / 0.95);
}
@supports (backdrop-filter: blur(8px)) {
.header {
background: rgb(24 24 27 / 0.55);
backdrop-filter: blur(8px);
}
}<style>
.page { position: relative; height: 130px; overflow: hidden; border-radius: 12px; background: #0c0c10; }
.header { position: absolute; inset: 0 0 auto; padding: 12px 16px; font-weight: 600; }
.tiles { display: flex; gap: 10px; padding: 24px 16px; }
.tiles .box { flex: 1; min-height: 76px; }
</style>
<div class="page">
<div class="tiles"><div class="box">HTML</div><div class="box">CSS</div><div class="box">JS</div></div>
<header class="header">CodeWorlds · Dokumentacja</header>
</div>Pasek jest półprzezroczysty i rozmywa kafelki pod spodem tylko tam, gdzie działa backdrop-filter. Przeglądarka bez tej funkcji pokaże pasek prawie nieprzezroczysty, więc tekst i tak będzie czytelny.
Definicja i zastosowanie
#Reguła @supports pyta przeglądarkę, czy rozumie dany zapis. W nawiasie podajesz deklarację, np. (display: grid), a przeglądarka sprawdza, czy zna zarówno właściwość, jak i tę wartość. Jeśli tak, style z bloku działają. Jeśli nie, cały blok zostaje pominięty.
Typowy wzorzec to stopniowe ulepszanie. Poza regułą piszesz prosty styl, który działa wszędzie, a w @supports dokładasz nowszą wersję. Odwrotny wariant, @supports not (…), zawiera plan awaryjny tylko dla przeglądarek, które danej funkcji nie znają.
Warunki łączysz słowami and i or, a każdy musi stać w osobnych nawiasach. Funkcja selector() sprawdza obsługę selektora, np. selector(:has(img)). To ważne, bo jeden nieznany selektor na liście unieważnia całą regułę, a w @supports możesz przygotować dla niego zastępstwo.
Pamiętaj, że @supports sprawdza tylko, czy przeglądarka rozpoznaje zapis, a nie czy funkcja działa bez błędów w każdym szczególe. Nie potrzebujesz go też przy każdej nowości: nieznaną deklarację przeglądarka i tak po cichu pomija. Reguła przydaje się dopiero wtedy, gdy od obsługi zależą inne style.
Składnia
#@supports (<właściwość>: <wartość>) {
selektor { właściwość: wartość; }
}
@supports not (<warunek>) { … }
@supports (<warunek>) and (<warunek>) { … }
@supports (<warunek>) or (<warunek>) { … }
@supports selector(<selektor>) { … }Rodzaje warunków
#właściwość i wartość
Każda współczesna przeglądarka zna siatkę, więc blok działa i kafelki stają w trzech kolumnach. Bez niego zostałyby jeden pod drugim.brak obsługi
Blok działa tylko tam, gdzie siatki brak, czyli w bardzo starych przeglądarkach. Tutaj się nie włącza, więc kafelki zostają jeden pod drugim, jak w stylu bazowym.obsługę selektora
Sprawdza selektor zamiast deklaracji. Najedź kursorem na kafelek: pozostałe przygasają. Reguła z:has()działa tylko w przeglądarkach, które ten selektor znają.oba warunki naraz
Blok działa tylko wtedy, gdy przeglądarka obsługuje siatkę iaspect-ratio. Kafelki stają w rzędzie i robią się kwadratowe.co najmniej jeden warunek
Wystarczy jeden spełniony warunek. Tak sprawdza się właściwości z przedrostkiem: szkło rozmywa kafelki pod spodem, jeśli przeglądarka znabackdrop-filterw którejkolwiek wersji.
Rodzaje warunków w praktyce
#(display: grid)
@supports (display: grid) {
.demo {
display: grid;
grid-template-columns: repeat(3, 1fr);
}
}not (display: grid)
@supports not (display: grid) {
.demo { flex-direction: row; }
}selector(:has(*))
:has() działa tylko w przeglądarkach, które ten selektor znają.@supports selector(:has(*)) {
.demo:has(.box:hover) .box:not(:hover) {
opacity: 0.3;
}
}(…) and (…)
aspect-ratio. Kafelki stają w rzędzie i robią się kwadratowe.@supports (display: grid) and (aspect-ratio: 1) {
.demo {
display: grid;
grid-template-columns: repeat(3, 1fr);
}
.demo .box { aspect-ratio: 1; }
}(…) or (…)
backdrop-filter w którejkolwiek wersji.@supports (backdrop-filter: blur(6px))
or (-webkit-backdrop-filter: blur(6px)) {
.glass {
background: rgb(255 255 255 / 0.12);
-webkit-backdrop-filter: blur(6px);
backdrop-filter: blur(6px);
}
}Więcej przykładów
#.card {
display: grid;
gap: 10px;
}
@supports (container-type: inline-size) {
.slot {
container-type: inline-size;
}
@container (width >= 300px) {
.card {
grid-template-columns: 80px 1fr;
align-items: center;
}
}
}<style>
.card { padding: 10px; border: 1px solid #27272a; border-radius: 12px; background: #18181b; }
.thumb { height: 56px; border-radius: 8px; background: linear-gradient(135deg, #10b981, #0ea5e9); }
.card p { margin: 2px 0 0; color: #a1a1aa; font-size: 13px; }
</style>
<div class="slot">
<article class="card"><div class="thumb"></div><div><strong>Siatka CSS</strong><p>Moduł 8 · 10 lekcji</p></div></article>
</div>Obsługę zapytań o kontener najprościej sprawdzić przez właściwość container-type, która pojawiła się razem z nimi. Przeglądarka bez tej funkcji pokaże po prostu kartę pionową.
Obsługa przeglądarek
#Szeroko dostępne
Działa we wszystkich nowoczesnych przeglądarkach, także na telefonach. Możesz używać bez obaw.
- Chrome
- Edge
- Firefox
- Safari
Dobre praktyki
#- Styl bazowy pisz poza regułą, a w
@supportstylko to, co wymaga nowej funkcji. Starsza przeglądarka dostanie prostszy, ale działający wygląd. - Obsługę reguły @ sprawdzisz przez właściwość, która przyszła razem z nią, np.
@supports (container-type: inline-size)przed użyciem@container. - Przy właściwościach z przedrostkiem sprawdzaj obie wersje przez
or, np.(backdrop-filter: blur(4px)) or (-webkit-backdrop-filter: blur(4px)).
Powiązane hasła
#- @mediaWłącza style tylko wtedy, gdy urządzenie spełnia warunek: ma odpowiednią szerokość okna, ciemny motyw, mysz albo drukuje stronę.
- @containerNakłada style zależnie od rozmiaru kontenera, a nie całego okna. Komponent dopasowuje się do miejsca, które dostał w układzie.
- :has()Wybiera element na podstawie tego, co zawiera lub co stoi za nim. Pozwala stylować rodzica według jego dzieci.
- backdrop-filterNakłada filtr na to, co widać pod elementem, na przykład rozmycie tła za panelem.
- displayUstala, jak element zachowuje się w układzie strony i jak układa swoje dzieci.
Widzisz błąd albo brakuje przykładu? Napisz do nas.