La règle @supports
, également nommée “règle conditionnelle”, permet de détecter la reconnaissance de certaines propriétés CSS au sein du navigateur.
Introduite au sein des spécifications dans le module des CSS conditionnelles, au même titre que les Media Queries, la règle @supports
se rapproche de ce que peut nous offrir un outil tel que Modernizr, à savoir détecter le support ou non d’une fonctionnalité CSS chez votre visiteur afin de prévoir une alternative au besoin.
Compatibilité
Au statut de “Candidate recommendation”, @supports
est actuellement compatible sur les navigateurs suivants, selon Can I Use :
Navigateurs | Versions | Détails |
---|---|---|
Edge 12+ | ||
Firefox 22+ Firefox Mobile 28+ |
Supporté depuis Firefox 17 en activant une preference du navigateur |
|
Chrome 28+ Chrome Mobile 33+ |
||
Opera 12.1+ Opera Mobile 16+ |
||
Android Browser 4.4+ | ||
Safari 9+ |
Syntaxe générale
À l’instar des autres règles-at, @supports
intègre une ou plusieurs règles au sein d’un bloc d’accolades.
La - ou les - condition(s) doivent être individuellement entourées de parenthèses.
Voici un exemple de règle conditionnelle valide :
@supports (hyphens: auto) {
p {
hyphens: auto;
}
}
Les règles conditionnelles suivantes sont invalides :
@supports (hyphens) { /* valeur obligatoire */
...
}
@supports (hyphens: auto and text-align-last:justify) { /* parenthèses individuelles obligatoire */
...
}
Opérateurs
La règle @supports
accepte les opérateurs suivants :
-
not
(négation), -
and
(et), -
or
(ou)
Exemples
Tester le support d’une propriété préfixée avec or
@supports (-webkit-filter: sepia(1)) or (filter: sepia(1)) {
.sepia {
-webkit-filter: sepia(1);
filter: sepia(1);
}
}
Tester la non-reconnaissance d’une propriété avec not
@supports not (height: 100vh) {
html, body {height: 100%; margin: 0; padding: 0}
.content {min-height: 100%; display: table}
}
@supports (height: 100vh) {
.content {height: 100vh;}
}
Tester à l’aide d’une combinaison d’opérateurs
Dans le code suivant, le test est vérifié si display: flex
est supporté et si display: grid
n’est pas supporté :
@supports (display: flex) and ( not (display: grid) ) {
body {
display: flex;
}
}
Gare aux faux-négatifs !
La règle @supports
est parfois moins bien supportée que la propriété testée, et les résultats peuvent en être faussés.
Par exemple dans le test suivant, le module CSS3 Grid Layout est bien supporté par Internet Explorer 10, mais c’est @supports
qui n’est pas reconnu sur ce navigateur !
@supports (display: -ms-grid) or (display: grid) {
div {
display: -ms-grid;
display: grid;
}
}
Version JavaScript
Pour information, l’équivalent JavaScript de la règle @supports
se présente sous la forme de la méthode CSS.supports()
.
Les spécifications proposent deux types de syntaxes pour cette méthode :
if( CSS.supports( 'property', 'value') ) { }
if( CSS.supports( '(property: value) and (property: value') ) { }
Commentaires
Un jour de plus, une connaissance en plus. Merci. Donc pour IE on continuera avec Modernizr.
Pour IE, autant se baser sur les commentaires conditionnels via les classes conditionnelles : http://openweb.eu.org/articles/les-commentair... ;)
@Nico3333fr : Sauf qu'à partir d'IE 10, ça ne le fait plus.
@Victor BRITO : Oui, je sous-entendais "très vieux IE" :)
Bon bah au moins maintenant c'est plus clair ;) J'avais récupéré un template responsive pour un de mes sites sans trop savoir à quoi servaient les @ :/