Errores de las propiedades CSS personalizadas

Stas Melnikov, autor del curso HTML HTML Layout, habló sobre los matices que pueden complicar el trabajo con propiedades CSS personalizadas.

Reglas de sintaxis de nombre de propiedad personalizada


Estamos acostumbrados al hecho de que las propiedades CSS en línea no distinguen entre mayúsculas y minúsculas. Por lo tanto, los siguientes métodos para declarar una propiedad de border darán el mismo resultado:

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

Las propiedades personalizadas, en cambio, distinguen entre mayúsculas y minúsculas, por lo que el siguiente ejemplo crea dos propiedades personalizadas diferentes:

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



Ahora el marco se ha convertido en # 800080 (morado) y el texto se ha convertido en # 27ae60 (verde).

Valores válidos para propiedades personalizadas


Para una propiedad CSS normal, puede establecer solo los valores permitidos por el estándar. De acuerdo con el estándar de propiedad personalizada, cualquier valor CSS válido existente puede usarse como un valor. Por ejemplo, como con todas las siguientes propiedades personalizadas:

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

Por ejemplo, configuremos el marco con el color # 800080 para el botón:

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



Además de los valores estándar, puede establecer una propiedad personalizada como valor para otra.

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

El resultado no es diferente del anterior, y el botón todavía tiene un marco con el color # 800080.

Si la propiedad personalizada --netologyBrandColor tiene un valor incorrecto para la propiedad de border-color del border-color , por ejemplo 18px, el marco se volverá negro.

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



El hecho es que antes de que el navegador aplique el valor de la propiedad del usuario para la propiedad incorporada, verificará que sea correcta. Si el valor está disponible para la propiedad en línea, el navegador lo aplicará. De lo contrario, establecerá el valor predeterminado para la propiedad integrada.

En nuestro caso, 18px es un valor incorrecto para la propiedad de border-color incorporada y, por lo tanto, el navegador establecerá el valor predeterminado, es decir, currentColor . Esto es muy fácil de verificar configurando la propiedad de color en # 800080:

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



Como puede ver, el navegador aplicó el valor # 800080 para el marco. En este ejemplo, utilicé la sintaxis completa para establecer el marco. Pero podemos usar uno corto, a saber, la propiedad de border .

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



Aquí estamos esperando otro matiz. Hay una sección separada en el estándar que describe el comportamiento de las propiedades personalizadas en tal situación. Según él, si una propiedad de usuario tiene un valor incorrecto para una propiedad en línea, entonces esta propiedad de usuario no es válida, por lo que el navegador ignorará la propiedad en línea.

En nuestro ejemplo, la propiedad de border incorporada tiene uno de los valores establecidos en la propiedad personalizada --buttonBorderColor con un valor no válido de 18px. Según el algoritmo descrito, el navegador simplemente ignoró la propiedad del border , por lo que el elemento perdió el borde.

El valor predeterminado para propiedades personalizadas


Cuando miramos el ejemplo de la función var , utilizamos solo un parámetro: el nombre de la propiedad personalizada.

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

Pero además de eso, la función var puede aceptar el segundo, el valor predeterminado. Para declarar un valor predeterminado, debe poner una coma después del nombre de la propiedad personalizada y escribir el valor en sí.


Cuando el navegador se da cuenta de que el desarrollador no ha declarado un valor para la propiedad personalizada, utiliza el valor predeterminado. Por ejemplo, el valor # 800080 (morado) para una propiedad personalizada es --netologyBrandColor .

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



Vemos que el marco y el texto se vuelven morados. Pero si mueve el botón, se volverán verdes. Esto indica que el navegador aplicó el valor # 27ae60 a la propiedad del usuario, reemplazando así el valor predeterminado.

Pero estas no son todas las posibilidades de la función var . En el ejemplo anterior, la propiedad personalizada --netologyBrandColor usa dos veces, respectivamente, por lo que configuro el valor predeterminado dos veces.

Pero se puede hacer de manera diferente. La función var permite pasar otra función var , por lo que puede establecer otra propiedad personalizada como valor predeterminado. Reescribiré el ejemplo anterior usando la propiedad personalizada --defaultButtonColor :

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

Exteriormente, el resultado no cambiará. Pero ahora para cambiar el valor predeterminado, debe hacer esto solo en un lugar, y no en varios, como antes.

Herencia de propiedades personalizadas


CSS tiene un mecanismo de herencia que permite que los elementos hereden propiedades de elementos primarios. En este sentido, las propiedades personalizadas no son diferentes de ellas. Por ejemplo, escribiré el código en el que la propiedad personalizada --netologyBrandColor hereda del elemento del body principal.

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



Al mirar al inspector, puede observar la inscripción "Heredado del cuerpo", que nos muestra que la propiedad personalizada se tomó del elemento body . Pero si agregamos la propiedad personalizada --netologyBrandColor para el elemento del button , entonces ya anula la propiedad del elemento del body .

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



El inspector muestra que la propiedad personalizada --netologyBrandColor elemento del button anula la propiedad --netologyBrandColor , que especificamos para el elemento del body .

Valores globales


En el estándar CSS, las Propiedades personalizadas introdujeron una pseudoclase root especial que le permite especificar propiedades personalizadas que se aplican al elemento raíz del documento. Por ejemplo, en un documento HTML para un elemento html .

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



En el inspector, podemos ver que la propiedad personalizada declarada se aplica al elemento html. Pero, además del documento HTML, la pseudoclase root funciona en documentos SVG. Por ejemplo, declararé propiedades personalizadas en la etiqueta 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> 



Y aquí vemos que la pseudoclase raíz root ha agregado al elemento raíz SVG. En consecuencia, esto prueba que la pseudoclase raíz se aplica no solo a la etiqueta html , sino a cualquier elemento raíz.

Conclusión


En este artículo, nos encontramos con trampas de propiedades personalizadas que pueden ser confusas. Y en consecuencia, podemos comenzar a usarlos. Por lo tanto, en el próximo artículo hablaré sobre trucos prácticos que utilizo en mis proyectos.

De los editores


Cursos de Netología sobre el tema:

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


All Articles