Pièges des propriétés CSS personnalisées

Stas Melnikov, l'auteur du cours HTML HTML Layout, a parlé des nuances qui peuvent compliquer le travail avec des propriétés CSS personnalisées.

Règles de syntaxe des noms de propriété personnalisés


Nous sommes habitués au fait que les propriétés CSS en ligne ne respectent pas la casse. Par conséquent, les méthodes suivantes de déclaration d'une propriété border donneront le même résultat:

 button { BORDER: 2px solid #800080; } button { border: 2px solid #800080; } 

Les propriétés personnalisées, en revanche, sont sensibles à la casse, donc l'exemple suivant crée deux propriétés personnalisées différentes:

 button { --NETOLOGY-BRAND-COLOR: #800080; --netology-brand-color: #27ae60;   border: 2px solid var(--NETOLOGY-BRAND-COLOR); color: var(--netology-brand-color); } 



Maintenant, le cadre est devenu # 800080 (violet) et le texte est devenu # 27ae60 (vert).

Valeurs valides pour les propriétés personnalisées


Pour une propriété CSS régulière, vous ne pouvez définir que les valeurs autorisées par la norme. Selon la norme de propriété personnalisée, toute valeur CSS valide existante peut être utilisée comme valeur. Par exemple, comme pour toutes les propriétés personnalisées suivantes:

 .element::before { --color: rgba(0, 0, 0, 1); --hex: #000000; --value: 20px; --number: 3; --text: "Hey, what's up?"; --keyword: currentColor; } 

Par exemple, définissons le cadre avec la couleur # 800080 pour le bouton:

 button { --netologyBrandColor: #800080; border-width: 2px; border-style: solid; border-color: var(--netologyBrandColor); } 



En plus des valeurs standard, vous pouvez définir une propriété personnalisée comme valeur pour une autre.

 button { --netologyBrandColor: #800080; --buttonBorderColor: var(--netologyBrandColor); border-width: 2px; border-style: solid; border-color: var(--buttonBorderColor); } 

Le résultat n'est pas différent du précédent, et le bouton a toujours un cadre de couleur # 800080.

Si la propriété personnalisée --netologyBrandColor a une valeur incorrecte pour la propriété border-color , par exemple 18px, le cadre devient noir.

 button { --netologyBrandColor: 18px;  --buttonBorderColor: var(--netologyBrandColor); border-width: 2px; border-style: solid; border-color: var(--buttonBorderColor); } 



Le fait est qu'avant que le navigateur applique la valeur de la propriété utilisateur pour la propriété intégrée, il vérifiera son exactitude. Si la valeur est disponible pour la propriété inline, le navigateur l'appliquera. Sinon, il définira la valeur par défaut de la propriété intégrée.

Dans notre cas, 18px est une valeur incorrecte pour la propriété intégrée border-color , et donc le navigateur définira la valeur par défaut, c'est-à-dire currentColor . Ceci est très facile à vérifier en définissant la propriété color sur # 800080:

 button { --netologyBrandColor: 18px;  --buttonBorderColor: var(--netologyBrandColor); border-width: 2px; border-style: solid; border-color: var(--buttonBorderColor); color: #800080; } 



Comme vous pouvez le voir, le navigateur a appliqué la valeur # 800080 pour le cadre. Dans cet exemple, j'ai utilisé la syntaxe complète pour définir le cadre. Mais nous pouvons en utiliser une courte, à savoir la propriété border .

 button { --netologyBrandColor: 18px;  --buttonBorderColor: var(--netologyBrandColor); border: 2px solid var(--buttonBorderColor); color: #800080; } 



Ici, nous attendons une autre nuance. Il existe une section distincte dans la norme qui décrit le comportement des propriétés personnalisées dans une telle situation. Selon lui, si une propriété utilisateur a une valeur incorrecte pour une propriété en ligne, cette propriété utilisateur n'est pas valide, donc le navigateur ignorera la propriété en ligne.

Dans notre exemple, la propriété de border intégrée a l'une des valeurs définies sur la propriété personnalisée --buttonBorderColor avec une valeur non valide de 18 pixels. Selon l'algorithme décrit, le navigateur a simplement ignoré la propriété border , donc l'élément a perdu la bordure.

La valeur par défaut pour les propriétés personnalisées


Lorsque nous avons examiné l'exemple de la fonction var , nous n'avons utilisé qu'un seul paramètre - le nom de la propriété personnalisée.

 button { --netologyBrandColor: #800080; border: 2px solid var(--netologyBrandColor); color: var(--netologyBrandColor); } button:hover { --netologyBrandColor: #27ae60; } 

Mais en plus, la fonction var peut accepter la seconde - la valeur par défaut. Pour déclarer une valeur par défaut, vous devez mettre une virgule après le nom de la propriété personnalisée et écrire la valeur elle-même.


Lorsque le navigateur se rend compte que le développeur n'a pas déclaré de valeur pour la propriété personnalisée, il utilise la valeur par défaut. Par exemple, la valeur # 800080 (violet) pour une propriété personnalisée est --netologyBrandColor .

 button { border: 2px solid var(--netologyBrandColor, #800080); color: var(--netologyBrandColor, #800080); } button:hover { --netologyBrandColor: #27ae60; } 



Nous voyons le cadre et le texte devenir violets. Mais si vous déplacez le bouton, ils deviendront verts. Cela indique que le navigateur a appliqué la valeur # 27ae60 à la propriété utilisateur, remplaçant ainsi la valeur par défaut.

Mais ce ne sont pas toutes les possibilités de la fonction var . Dans l'exemple précédent, la propriété personnalisée --netologyBrandColor utilisée deux fois, respectivement, j'ai donc défini la valeur par défaut deux fois.

Mais cela peut être fait différemment. La fonction var vous permet de passer une autre fonction var , vous pouvez donc définir une autre propriété personnalisée comme valeur par défaut. Je vais réécrire l'exemple précédent en utilisant la propriété personnalisée --defaultButtonColor :

 button { --defaultButtonColor: #800080; border: 2px solid var(--netologyBrandColor, var(--defaultButtonColor)); color: var(--netologyBrandColor, var(--defaultButtonColor)); } button:hover { --netologyBrandColor: #27ae60; } 

Extérieurement, le résultat ne changera pas. Mais maintenant, pour modifier la valeur par défaut, vous devez le faire uniquement à un endroit, et non à plusieurs, comme auparavant.

Héritage de propriétés personnalisées


CSS possède un mécanisme d'héritage qui permet aux éléments d'hériter des propriétés des éléments parents. À cet égard, les propriétés personnalisées ne sont pas différentes d'eux. Pour un exemple, j'écrirai le code dans lequel la propriété personnalisée --netologyBrandColor héritée de l'élément de body parent.

 body { --netologyBrandColor: #800080; } button { border: 2px solid var(--netologyBrandColor); color: var(--netologyBrandColor); } </td></tr> 



En regardant l'inspecteur, vous pouvez remarquer l'inscription «Hérité du corps», qui nous montre que la propriété personnalisée a été prise de l'élément body . Mais si nous ajoutons la propriété personnalisée --netologyBrandColor pour l'élément button , elle remplace déjà la propriété de l'élément body .

 body { --netologyBrandColor: #800080; } button { --netologyBrandColor: #27ae60; border: 2px solid var(--netologyBrandColor); color: var(--netologyBrandColor); } 



L'inspecteur montre que la propriété personnalisée --netologyBrandColor l'élément button remplace la propriété --netologyBrandColor , que nous avons spécifiée pour l'élément body .

Valeurs globales


Dans la norme CSS, les propriétés personnalisées ont introduit une pseudo- root spéciale qui vous permet de spécifier des propriétés personnalisées qui s'appliquent à l'élément racine du document. Par exemple, dans un document HTML pour un élément html .

 :root { --netologyBrandColor: #800080; } button { border: 2px solid var(--netologyBrandColor); color: var(--netologyBrandColor); } 



Dans l'inspecteur, nous pouvons voir que la propriété personnalisée déclarée est appliquée à l'élément html. Mais, en plus du document HTML, la pseudo- root fonctionne dans les documents SVG. Par exemple, je déclarerai des propriétés personnalisées dans la balise de style .

 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 26 28" width="50" height="50">   <style>       :root{           --iconColor: #ffcc00;           --iconStroke: #000000;           --iconStrokeWidth: 2px;       }   </style>   <path stroke="var(--iconStroke)"         stroke-width="var(--iconStrokeWidth)"         fill="var(--iconColor)"         d="M26 10.109c0 .281-.203.547-.406.75l-5.672 5.531 1.344 7.812c.016.109.016.203.016.313 0 .406-.187.781-.641.781a1.27 1.27 0 0 1-.625-.187L13 21.422l-7.016 3.687c-.203.109-.406.187-.625.187-.453 0-.656-.375-.656-.781 0-.109.016-.203.031-.313l1.344-7.812L.39 10.859c-.187-.203-.391-.469-.391-.75 0-.469.484-.656.875-.719l7.844-1.141 3.516-7.109c.141-.297.406-.641.766-.641s.625.344.766.641l3.516 7.109 7.844 1.141c.375.063.875.25.875.719z"/> </svg> 



Et nous voyons ici que la pseudo- root racine root été ajoutée à l'élément racine SVG. En conséquence, cela prouve que la pseudo-classe racine s'applique non seulement à la balise html , mais à tout élément racine.

Conclusion


Dans cet article, nous avons rencontré des écueils de propriétés personnalisées qui peuvent prêter à confusion. Et en conséquence, nous pouvons commencer à les utiliser. Par conséquent, dans le prochain article, je parlerai des astuces pratiques que j'utilise dans mes projets.

Des éditeurs


Cours de netologie sur le sujet:

Source: https://habr.com/ru/post/fr435654/


All Articles