Armadilhas das propriedades CSS personalizadas

Stas Melnikov, o autor do curso HTML HTML Layout, falou sobre as nuances que podem complicar o trabalho com propriedades CSS personalizadas.

Regras de sintaxe de nome de propriedade personalizada


Estamos acostumados ao fato de que as propriedades CSS embutidas não diferenciam maiúsculas de minúsculas. Portanto, os seguintes métodos de declarar uma propriedade de border fornecerão o mesmo resultado:

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

As propriedades personalizadas, por outro lado, diferenciam maiúsculas de minúsculas; portanto, o exemplo a seguir cria duas propriedades personalizadas diferentes:

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



Agora, o quadro tornou-se # 800080 (roxo) e o texto tornou-se # 27ae60 (verde).

Valores válidos para propriedades personalizadas


Para uma propriedade CSS regular, você pode definir apenas os valores permitidos pelo padrão. De acordo com o padrão de propriedade customizada, qualquer valor CSS válido existente pode ser usado como um valor. Por exemplo, como todas as seguintes propriedades customizadas:

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

Por exemplo, vamos definir o quadro com a cor # 800080 para o botão:

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



Além dos valores padrão, você pode definir uma propriedade customizada como um valor para outro.

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

O resultado não é diferente do anterior e o botão ainda possui um quadro com a cor # 800080.

Se a propriedade personalizada --netologyBrandColor tiver um valor incorreto para a propriedade border-color , por exemplo 18px, o quadro ficará preto.

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



O fato é que, antes que o navegador aplique o valor da propriedade do usuário para a propriedade interna, ele verificará se está correto. Se o valor estiver disponível para a propriedade embutida, o navegador o aplicará. Caso contrário, ele definirá o valor padrão para a propriedade interna.

No nosso caso, 18px é um valor incorreto para a propriedade de border-color interna e, portanto, o navegador definirá o valor padrão, ou seja, currentColor . Isso é muito fácil de verificar, definindo a propriedade de color como # 800080:

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



Como você pode ver, o navegador aplicou o valor # 800080 para o quadro. Neste exemplo, usei a sintaxe completa para definir o quadro. Mas podemos usar uma pequena, a propriedade da border .

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



Aqui estamos esperando por outra nuance. Há uma seção separada no padrão que descreve o comportamento das propriedades customizadas em tal situação. Segundo ele, se uma propriedade do usuário tem um valor incorreto para uma propriedade embutida, essa propriedade é inválida, portanto o navegador ignorará a propriedade embutida.

Em nosso exemplo, a propriedade de border interna possui um dos valores configurados para a propriedade personalizada --buttonBorderColor com um valor inválido de 18px. De acordo com o algoritmo descrito, o navegador simplesmente ignorou a propriedade border , de modo que o elemento perdeu a borda.

O valor padrão para propriedades customizadas


Quando analisamos o exemplo da função var , usamos apenas um parâmetro - o nome da propriedade customizada.

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

Mas além disso, a função var pode aceitar o segundo - o valor padrão. Para declarar um valor padrão, é necessário colocar uma vírgula após o nome da propriedade customizada e escrever o próprio valor.


Quando o navegador percebe que o desenvolvedor não declarou um valor para a propriedade customizada, ele usa o valor padrão. Por exemplo, o valor # 800080 (roxo) para uma propriedade personalizada é --netologyBrandColor .

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



Vemos o quadro e o texto ficarem roxos. Mas se você mover o botão, eles ficarão verdes. Isso indica que o navegador aplicou o valor # 27ae60 à propriedade do usuário, substituindo o valor padrão.

Mas essas não são todas as possibilidades da função var . No exemplo anterior, a propriedade customizada --netologyBrandColor usada duas vezes, respectivamente, portanto, defino o valor padrão duas vezes.

Mas isso pode ser feito de maneira diferente. A função var permite passar outra função var , para que você possa definir outra propriedade customizada como o valor padrão. Reescreverei o exemplo anterior usando a propriedade customizada --defaultButtonColor :

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

Externamente, o resultado não será alterado. Mas agora para alterar o valor padrão, você precisa fazer isso apenas em um lugar, e não em vários, como antes.

Herança de propriedades customizadas


O CSS possui um mecanismo de herança que permite que os elementos herdem propriedades dos elementos pai. Nesse sentido, as propriedades customizadas não são diferentes delas. Por exemplo, escreverei o código no qual a propriedade customizada --netologyBrandColor herdada do elemento do body pai.

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



Observando o inspetor, você pode observar a inscrição "Herdado do corpo", que mostra que a propriedade personalizada foi obtida do elemento do body . Mas se adicionarmos a propriedade customizada --netologyBrandColor ao elemento button , ela já substituirá a propriedade do elemento body .

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



O inspetor mostra que a propriedade customizada --netologyBrandColor elemento button substitui a propriedade --netologyBrandColor , especificada para o elemento body .

Valores globais


No padrão CSS, as Propriedades personalizadas introduziram uma pseudo- root especial que permite especificar propriedades personalizadas que se aplicam ao elemento raiz do documento. Por exemplo, em um documento HTML para um elemento html .

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



No inspetor, podemos ver que a propriedade customizada declarada é aplicada ao elemento html. Mas, além do documento HTML, a pseudo- root funciona em documentos SVG. Por exemplo, declararei propriedades personalizadas na tag 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> 



E aqui vemos que a pseudo root raiz foi adicionada ao elemento raiz SVG. Portanto, isso prova que a pseudo classe raiz se aplica não apenas à tag html , mas a qualquer elemento raiz.

Conclusão


Neste artigo, nos deparamos com armadilhas de propriedades personalizadas que podem ser confusas. E, portanto, podemos começar a usá-los. Portanto, no próximo artigo, falarei sobre truques práticos que utilizo em meus projetos.

Dos editores


Cursos de netologia sobre o tema:

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


All Articles