--- title: Les variables CSS slug: Web/CSS/Using_CSS_custom_properties translation_of: Web/CSS/Using_CSS_custom_properties --- {{CSSRef}} **Les propriétés personnalisées CSS** (_custom properties_ en anglais, aussi parfois appelés **variables CSS**) sont des entités définies par les développeurs ou les utilisateurs d'une page Web, contenant des valeurs spécifiques utilisables à travers le document. Elles sont initialisées avec des propriétés personnalisées (par exemple **`--main-color: black;`**) et accessibles en utilisant la notation spécifique {{cssxref("var", "var()")}} (par exemple : **`color: var(--main-color);`**). Des sites et applications web complexes peuvent avoir des feuilles de style où de nombreuses valeurs sont répétées. Ainsi, la même couleur pourra être utilisée à des centaines d'endroits où il faudra la mettre à jour si besoin. Les propriétés personnalisées permettent de stocker une valeur à un endroit puis de réutiliser cette valeur (on factorise ainsi le code). ## Utilisation simple Voici comment on déclare une variable : ```css element { --main-bg-color: brown; } ``` Et voici comment on l'utilise ```css element { background-color: var(--main-bg-color); } ``` ## Problématique Lors de l'élaboration de sites de grande envergure, leurs auteurs font parfois face à des soucis de maintenabilité. De grandes feuilles de styles sont utilisées et de nombreuses informations se répètent. Par exemple, maintenir un thème de couleurs à travers un document nécessite la réutilisation des valeurs des couleurs à plusieurs endroits dans les fichiers CSS. Modifier un thème, en changeant une couleur ou en le récrivant entièrement, devient alors une tâche complexe demandant de la précision, là où un simple trouver et remplacer ne suffit pas. Le problème peut s'aggraver en utilisant les _frameworks_ CSS puisque modifier une couleur demande de modifier le framework lui-même. Les pré-processeurs comme [LESS](https://lesscss.org/) ou [Sass](https://sass-lang.com/) peuvent faciliter cette tâche, mais peuvent également complexifier le processus de création en ajoutant une étape de compilation. Les propriétés personnalisées permettent d'utiliser une des principales fonctionnalités des pré-processeurs, sans cette étape de compilation. Le deuxième avantage de ces variables vient du fait que le nom lui-même contient des informations sémantiques. Les fichiers CSS deviennent alors plus facile à lire et à comprendre : écrire `main-text-color` permet de mieux s'y retrouver au fur et à mesure de la lecture qu'une valeur hexadécimale comme `#00ff00`, surtout si la même couleur est utilisée dans un autre contexte. ## Définition Les propriétés personnalisées ont actuellement deux formes : - les variables, qui sont des associations entre un identifiant et une valeur utilisables à la place de n'importe quelle valeur normale, en utilisant la notation fonctionnelle `var()` : `var(--example-variable)` retourne la valeur de `--example-variable`. - les propriétés personnalisées, qui sont des propriétés spéciales notées `--*` où `*` représente le nom de la variable. Elles sont utilisées pour définir la valeur d'une variable donnée : `--example-variable: 20px;` est une déclaration en CSS, utilisant la propriété personnalisée `--*` pour initialiser la valeur de la variable CSS `--example-variable` à `20px`. > **Note :** Le préfixe de propriété personnalisée était noté `var-` dans les précédentes spécifications, mais a ensuite été changé pour `--`. Firefox 31 et supérieurs respectent cette nouvelle notation. ({{bug(985838)}}) Les propriétés personnalisées sont similaires aux propriétés ordinaires. Elles sont sujettes à la cascade et héritent leur valeur de leur parent si elles ne sont pas redéfinies. ## Premiers pas avec les propriétés personnalisées CSS Commençons avec cette feuille CSS simple colorant les éléments de différentes classes avec la même couleur : ### Exemple 1 ```css .un { color: white; background-color: brown; margin: 10px; width: 50px; height: 50px; display: inline-block; } .deux { color: white; background-color: black; margin: 10px; width: 150px; height: 70px; display: inline-block; } .trois { color: white; background-color: brown; margin: 10px; width: 75px; } .quatre { color: white; background-color: brown; margin: 10px; width: 100px; } .cinq { background-color: brown; } ``` Appliquons-le à ce code HTML : ```html
La couleur initiale d'un paragraphe est noire.
``` ### CSS ```css :root { --text-color: 16px; } p { color: blue; } p { color: var(--text-color); } ``` Comme on pourrait s'y attendre, le valeur applique la substitution aec `--text-color` à la place de `var(--text-color)` mais `16px` n'est pas une valeur valide pour {{cssxref("color")}}. Après la substitution, la déclaration n'a plus aucun sens. Le navigateur résoud ce problème en deux étapes : 1. Il vérifie si la propriété peut être héritée (ici `color`) : c'est bien le cas mais dans notre exemple `` n'a aucun parent avec une couleur définie, il passe donc à l'étape suivante. 2. La valeur utilisée est **la valeur initiale par défaut**, pour `color`, c'est `black`. ### Résultat {{EmbedLiveSample('Gestion_des_variables_invalides')}} > **Note :** La couleur du paragraphe ne sera pas bleue car une substitution invalide est remplacée par la valeur héritée ou la valeur initiale, pas par les valeurs provenant d'éventuelles autres règles. > > Si on avait directement écrit `color: 16px` (sans substitution), c'est alors la déclaration précédente qui aurait été utilisée. ## Manipulation des variables en JavaScript Il est possible d'utiliser les valeurs des propriétés personnalisés en JavaScript de la même façon que les propriétés standards. ```js // obtenir une variable à partir d'un style en ligne (dans un élément html) element.style.getPropertyValue("--ma-variable"); // obtenir une variable par ailleurs getComputedStyle(element).getPropertyValue("--ma-variable"); // définir une variable dans un style en ligne element.style.setProperty("--ma-variable", varJS + 4); ``` ## Compatibilité des navigateurs {{Compat("css.properties.custom-property")}} > **Note :** Dans les versions antérieures de la spécification, le préfixe indiquant les propriétés personnalisées était `var-`. Ce préfixe a ensuite été modifié en `--`. et Firefox 31 et les versions ultérieures respectent cette spécification (cf. {{bug(985838)}}) ## Voir aussi - {{cssxref("--*", "Les propriétés personnalisées")}}