@supports CSS at-rule
Baseline
Weitgehend verfügbar
Diese Funktion ist gut etabliert und funktioniert auf vielen Geräten und in vielen Browserversionen. Sie ist seit September 2015 browserübergreifend verfügbar.
Die @supports CSS At-Regel ermöglicht es Ihnen, CSS-Deklarationen zu spezifizieren, die von der Unterstützung von CSS-Features durch einen Browser abhängen.
Die Verwendung dieser At-Regel wird allgemein als Feature Query bezeichnet.
Die Regel muss entweder auf der obersten Ebene Ihres Codes oder verschachtelt innerhalb einer anderen konditionalen Gruppen-At-Regel platziert werden.
In JavaScript kann @supports über die CSS-Objektmodell-Schnittstelle CSSSupportsRule aufgerufen werden.
Probieren Sie es aus
.flex-container > * {
padding: 0.3em;
list-style-type: none;
text-shadow: 0 0 2px red;
float: left;
}
@supports (display: flex) {
.flex-container > * {
text-shadow: 0 0 2px blue;
float: none;
}
.flex-container {
display: flex;
}
}
<ul class="flex-container">
<li><a href="#">Index</a></li>
<li><a href="#">About me</a></li>
<li><a href="#">Contact</a></li>
</ul>
Syntax
@supports (<supports-condition>) {
/* If the condition is true, use the CSS in this block. */
}
@supports (<supports-condition>) and (<supports-condition>) {
/* If both conditions are true, use the CSS in this block. */
}
Die @supports-At-Regel besteht aus einem Block von Anweisungen mit einer Supports-Bedingung.
Die Bedingungen können durch Konjunktionen (and), Disjunktionen (or) und/oder Negationen (not) kombiniert werden.
Die Priorität der Operatoren kann mit Klammern definiert werden.
Supports-Bedingungen können entweder die <property>: <value>-Deklarationssyntax oder die <function()>-Syntax verwenden.
Die folgenden Abschnitte beschreiben die Verwendung der jeweiligen Art von Supports-Bedingung.
Deklarationssyntax
Die Deklarationssyntax prüft, ob ein Browser die angegebene <property>: <value>-Deklaration unterstützt.
Die Deklaration muss von Klammern umgeben sein.
Das folgende Beispiel gibt true zurück, wenn der Browser den Ausdruck transform-origin: 5% 5% unterstützt:
@supports (transform-origin: 5% 5%) {
}
Funktionssyntax
Die Funktionssyntax prüft, ob ein Browser Werte oder Ausdrücke innerhalb der Funktion unterstützt. Die in der Funktionssyntax unterstützten Funktionen werden in den folgenden Abschnitten beschrieben.
at-rule()
Diese Funktion prüft, ob ein Browser die angegebene At-Regel unterstützt.
Das folgende Beispiel gibt true zurück und wendet die enthaltenen CSS-Stile an, wenn der Browser die @keyframes-At-Regel unterstützt:
@supports at-rule(@keyframes) {
}
selector()
Diese Funktion bewertet, ob ein Browser die angegebene Selektor-Syntax unterstützt. Das folgende Beispiel gibt true zurück und wendet die enthaltenen CSS-Stile an, wenn der Browser den Kind-Kombinator unterstützt:
@supports selector(h2 > p) {
}
font-tech()
Diese Funktion prüft, ob ein Browser die angegebene Schrifttechnologie für Layout und Rendering unterstützt.
Das folgende Beispiel gibt true zurück und wendet die enthaltenen CSS-Stile an, wenn der Browser die COLRv1-Schrifttechnologie unterstützt:
@supports font-tech(color-COLRv1) {
}
Die folgende Tabelle beschreibt die Schrifttechnologien (<font-tech>), einschließlich Farb-Schrifttechnologien (<color-font-tech>), Schriftmerkmal-Technologien (<font-features-tech>) und andere verfügbare Schrifttechnologien, die mit der font-tech()-Funktion abgefragt werden können:
| Technologie | Unterstützt |
|---|---|
<color-font-tech> |
|
color-colrv0 |
Mehrfarbige Glyphen über COLR-Version 0-Tabelle |
color-colrv1 |
Mehrfarbige Glyphen über COLR-Version 1-Tabelle |
color-svg |
SVG-mehrfarbige Tabellen |
color-sbix |
Standard-Bitmap-Grafiktabellen |
color-cbdt |
Farb-Bitmap-Daten-Tabellen |
<font-features-tech> |
|
features-opentype |
OpenType GSUB- und GPOS-Tabellen |
features-aat |
TrueType morx- und kerx-Tabellen |
features-graphite |
Graphite-Features, nämlich Silf, Glat, Gloc, Feat und Sill Tabellen |
Andere <font-tech>-Werte |
|
incremental-patch |
Inkrementelles Schriftladen mit der Patch-Subset-Methode |
incremental-range |
Inkrementelles Schriftladen mit der Range-Request-Methode |
incremental-auto |
Inkrementelles Schriftladen mit der Methodenverhandlung |
variations |
Schriftvariationen in TrueType- und OpenType-Schriften zur Steuerung der Schriftachse, -gewicht, -glyphen usw. |
palettes |
Schriftpaletten mittels font-palette, um eine von vielen Farbpaletten in der Schrift auszuwählen |
font-format()
Diese Funktion überprüft, ob ein Browser das angegebene Schriftformat für Layout und Rendering unterstützt.
Das folgende Beispiel gibt true zurück und wendet die enthaltenen CSS-Stile an, wenn der Browser das opentype-Schriftformat unterstützt:
@supports font-format(opentype) {
}
Die folgende Tabelle beschreibt die verfügbaren Formate (<font-format>-Werte), die mit dieser Funktion abgefragt werden können:
| Format | Beschreibung | Dateiendungen |
|---|---|---|
collection |
OpenType-Sammlung | .otc, .ttc |
embedded-opentype |
Eingebettetes OpenType | .eot |
opentype |
OpenType | .ttf, .otf |
svg |
SVG-Schrift (veraltet) | .svg, .svgz |
truetype |
TrueType | .ttf |
woff |
WOFF 1.0 (Web Open Font Format) | .woff |
woff2 |
WOFF 2.0 (Web Open Font Format) | .woff2 |
Der nicht-Operator
Der not-Operator geht einem Ausdruck voraus und negiert den Ausdruck.
Das folgende Beispiel gibt true zurück, wenn die transform-origin-Eigenschaft des Browsers 10em 10em 10em als ungültig betrachtet:
@supports not (transform-origin: 10em 10em 10em) {
}
Wie bei jedem Operator kann der not-Operator auf eine Deklaration beliebiger Komplexität angewendet werden.
Die folgenden Beispiele sind beide gültig:
@supports not (not (transform-origin: 2px)) {
}
@supports (display: grid) and (not (display: inline-grid)) {
}
Hinweis:
Es ist nicht notwendig, den not-Operator auf der obersten Ebene zwischen zwei Klammern zu setzen.
Um ihn mit anderen Operatoren, wie and und or, zu kombinieren, sind Klammern erforderlich.
Der und-Operator
Der and-Operator erstellt einen neuen Ausdruck aus der Konjunktion von zwei kürzeren Ausdrücken. Er gibt nur dann true zurück, wenn beide der kürzeren Ausdrücke ebenfalls true sind. Das folgende Beispiel gibt true zurück, wenn und nur wenn die beiden kürzeren Ausdrücke gleichzeitig true sind:
@supports (display: table-cell) and (display: list-item) {
}
Mehrere Konjunktionen können ohne die Notwendigkeit zusätzlicher Klammern aneinandergereiht werden. Die folgenden sind beide äquivalent:
@supports (display: table-cell) and (display: list-item) and (display: contents) {
}
@supports (display: table-cell) and
((display: list-item) and (display: contents)) {
}
Der oder-Operator
Der or-Operator erstellt einen neuen Ausdruck aus der Disjunktion von zwei kürzeren Ausdrücken. Er gibt true zurück, wenn einer oder beide der kürzeren Ausdrücke ebenfalls true sind. Das folgende Beispiel gibt true zurück, wenn mindestens einer der beiden kürzeren Ausdrücke true ist:
@supports (transform-style: preserve) or (-moz-transform-style: preserve) {
}
Mehrere Disjunktionen können ohne die Notwendigkeit zusätzlicher Klammern aneinandergereiht werden. Die folgenden sind beide äquivalent:
@supports (transform-style: preserve) or (-moz-transform-style: preserve) or
(-webkit-transform-style: preserve) {
}
@supports (transform-style: preserve-3d) or
(
(-moz-transform-style: preserve-3d) or
(-webkit-transform-style: preserve-3d)
) {
}
Hinweis:
Beim Verwenden von sowohl and als auch or Operatoren müssen die Klammern verwendet werden, um die Reihenfolge festzulegen, in der sie angewendet werden. Andernfalls ist die Bedingung ungültig und die gesamte Regel wird ignoriert.
Formale Syntax
@supports =
@supports <supports-condition> { <rule-list> }
<supports-condition> =
not <supports-in-parens> |
<supports-in-parens> [ and <supports-in-parens> ]* |
<supports-in-parens> [ or <supports-in-parens> ]*
<supports-in-parens> =
( <supports-condition> ) |
<supports-feature> |
<general-enclosed>
<supports-feature> =
<supports-selector-fn> |
<supports-font-tech-fn> |
<supports-font-format-fn> |
<supports-at-rule-fn> |
<supports-named-feature-fn> |
<supports-env-fn> |
<supports-decl>
<general-enclosed> =
[ <function-token> <any-value>? ) ] |
[ ( <any-value>? ) ]
<supports-selector-fn> =
selector( <complex-selector> )
<supports-font-tech-fn> =
font-tech( <font-tech> )
<supports-font-format-fn> =
font-format( <font-format> )
<supports-at-rule-fn> =
at-rule( <at-keyword-token> )
<supports-named-feature-fn> =
named-feature( <ident> )
<supports-env-fn> =
env( <ident> )
<supports-decl> =
( [ <declaration> | <supports-condition-name> ] )
<complex-selector> =
<complex-selector-unit> [ <combinator>? <complex-selector-unit> ]*
<font-tech> =
<font-features-tech> |
<color-font-tech> |
variations |
palettes |
incremental
<font-format> =
<string> |
collection |
embedded-opentype |
opentype |
svg |
truetype |
woff |
woff2
<complex-selector-unit> =
[ <compound-selector>? <pseudo-compound-selector>* ]!
<combinator> =
'>' |
'+' |
'~' |
[ '|' '|' ] |
[ / <wq-name> / ]
<font-features-tech> =
features-opentype |
features-aat |
features-graphite
<color-font-tech> =
color-COLRv0 |
color-COLRv1 |
color-SVG |
color-sbix |
color-CBDT
<compound-selector> =
[ <type-selector>? <subclass-selector>* ]!
<pseudo-compound-selector> =
<pseudo-element-selector> <pseudo-class-selector>*
<wq-name> =
<ns-prefix>? <ident-token>
<type-selector> =
<wq-name> |
<ns-prefix>? '*'
<subclass-selector> =
<id-selector> |
<class-selector> |
<attribute-selector> |
<pseudo-class-selector>
<pseudo-element-selector> =
: <pseudo-class-selector> |
<legacy-pseudo-element-selector>
<pseudo-class-selector> =
: <ident-token> |
: <function-token> <any-value> )
<ns-prefix> =
[ <ident-token> | '*' ]? '|'
<id-selector> =
<hash-token>
<class-selector> =
'.' <ident-token>
<attribute-selector> =
'[' <wq-name> ']' |
'[' <wq-name> <attr-matcher> [ <string-token> | <ident-token> ] <attr-modifier>? ']'
<legacy-pseudo-element-selector> =
: [ before | after | first-line | first-letter ]
<attr-matcher> =
[ '~' | '|' | '^' | '$' | '*' ]? '='
<attr-modifier> =
i |
s
Beispiele
>Testen der Unterstützung einer CSS-Eigenschaft
@supports (animation-name: test) {
/* CSS applied when animations are supported without a prefix */
@keyframes {
/* Other at-rules can be nested inside */
}
}
Testen der Unterstützung einer gegebenen CSS-Eigenschaft oder einer mit Präfix versehenen Version
@supports (text-stroke: 10px) or (-webkit-text-stroke: 10px) {
/* CSS applied when text-stroke, prefixed or not, is supported */
}
Testen der Nicht-Unterstützung einer bestimmten CSS-Eigenschaft
@supports not ((text-align-last: justify) or (-moz-text-align-last: justify)) {
/* CSS to provide fallback alternative for text-align-last: justify */
}
Testen der Unterstützung eines Selektors
CSS-konditionale Regeln bieten die Möglichkeit, die Unterstützung eines Selektors wie :has() zu testen.
/* This rule won't be applied in browsers that don't support :has() */
ul:has(> li li) {
/* CSS is applied when the :has(…) pseudo-class is supported */
}
@supports not selector(:has(a, b)) {
/* Fallback for when :has() is unsupported */
ul > li,
ol > li {
/* The above expanded for browsers that don't support :has(…) */
}
}
/* Note: So far, there's no browser that supports the `of` argument of :nth-child(…) */
@supports selector(:nth-child(1n of a, b)) {
/* This rule needs to be inside the @supports block, otherwise
it will be partially applied in browsers which don't support
the `of` argument of :nth-child(…) */
:is(:nth-child(1n of ul, ol) a, details > summary) {
/* CSS applied when the :is(…) selector and
the `of` argument of :nth-child(…) are both supported */
}
}
Testen der Unterstützung einer Schrifttechnologie
Das folgende Beispiel wendet die Bungee Spice-Farb-Schrift an, wenn der Browser die COLRv1-Schrifttechnologie unterstützt:
@supports font-tech(color-COLRv1) {
body {
font-family: "Bungee Spice", fantasy;
}
}
Es ist auch möglich, die Unterstützung einer Schrifttechnologie durch Verwendung der tech-Funktion innerhalb der @font-face-At-Regel zu testen.
Im folgenden Beispiel, wenn ein Browser die Farb-Schrifttechnologie der bungee-spice.woff2 Schrift nicht unterstützt, wird stattdessen eine reguläre bungee.woff2 Schrift verwendet.
@font-face {
font-family: "Bungee Spice";
src:
url("bungee-spice.woff2") tech(color-COLRv1) format("woff2"),
url("bungee.woff2") format("woff2");
}
Testen der Unterstützung eines Schriftformats
Das folgende Beispiel verwendet die WOFF2-Version der Schrift, wenn der Browser dieses Schriftformat unterstützt, andernfalls fällt es auf die zuvor spezifizierte WOFF-Version zurück:
@font-face {
font-family: "Open Sans WOFF";
src: url("open-sans.woff") format("woff");
}
@font-face {
font-family: "Open Sans WOFF2";
src: url("open-sans.woff2") format("woff2");
}
body {
font-family: "Open Sans WOFF", sans-serif;
}
@supports font-format(woff2) {
body {
font-family: "Open Sans WOFF2", sans-serif;
}
}
Eine effizientere Möglichkeit, mehrere Schriftformate anzugeben, besteht jedoch darin, diese in der src-Korrespondenz einer einzigen @font-face-At-Regel in der Reihenfolge vom bevorzugten zum weniger bevorzugten Format aufzulisten:
@font-face {
font-family: "Open Sans";
src:
url("open-sans.woff2") format("woff2"),
url("open-sans.woff") format("woff");
}
body {
font-family: "Open Sans", sans-serif;
}
Testen der Unterstützung einer At-Regel
Das folgende Beispiel wendet eine Reihe von Scoped-Color-Scheme-Stilen an, wenn der Browser die @scope-At-Regel unterstützt:
@supports at-rule(@scope) {
@scope (.light-scheme) {
:scope {
background-color: plum;
}
a {
color: darkmagenta;
}
}
@scope (.dark-scheme) {
:scope {
background-color: darkmagenta;
color: antiquewhite;
}
a {
color: plum;
}
}
}
Spezifikationen
| Spezifikation |
|---|
| CSS Conditional Rules Module Level 5> # at-supports-ext> |
| CSS Conditional Rules Module Level 4> # at-supports-ext> |
| CSS Conditional Rules Module Level 3> # at-supports> |