Variáveis no CSS? Em um futuro não muito distante (ou talvez sim) poderemos usar nossas variáveis muito doidas diretamente no CSS, mas enquanto o sol não raia pra nós, conseguimos simular esse recurso através de pré-processadores. Pra mim, o uso de variáveis são umas das principais (e acho que uma das poucas) features que uso dos pré-processadores, mas isso foge um pouco do assunto do artigo (boa ideia para um próximo!).
Variáveis são legais
Se você está acostumado a utilizar um Sass ou LESS da vida, sabe o quão legal e útil pode ser utilizar variáveis quando falamos de estilo. Uma coisa útil é que variáveis nos ajudam a evitar repetições e nos auxiliam (e muito!), principalmente em projetos grandes onde a possibilidade, de por exemplo, ter uma repetição de uma cor específica é bem grande.
Um bom caso de aplicação de variáveis é na questão de temas ou variações de um componente ou até de um projeto inteiro. Criar e gerenciar esquemas de cores com variáveis fica bem mais fácil: podemos criar por exemplo, uma variável chamada main-color e declarar a cor red pra ela. Assim, se em uma manutenção futura, precisarmos mudar essa cor, alteramos apenas na declaração da variável e não em todos os casos onde ela é utilizada. Claro que tudo depende de como estruturamos a coisa toda, pois uma pequena alteração de cor pode te dar alguns problemas.
O tal do currentColor
O danado do currentColor funciona semelhante a uma variável salvo duas exceções: só podemos utilizá-lo onde um valor de cor é esperado e, diferente de uma variável comum, não podemos setar
o seu valor, e sim, isso é herdado do valor atual da propriedade color que está sendo usada no elemento e claro, seguindo a cascata. Ficou confuso? Eu também. Vamos lá!
Vamos supor que tenhamos o seguinte:
body { color: green; } div { color: currentColor; box-shadow: 1px 1px 1px 1px currentColor; outline: dotted 1px currentColor; }
No exemplo acima, simplesmente definimos uma cor verde para o body
e a utilizamos nos elementos div
através dos caras currentColor. Mas Fabeni, tu tá me enrolando! Eu não precisava do currentColor aí! Exatamente, não precisava. Se voltarmos para o exemplo, chegaríamos no mesmo resultado apenas assim:
body { color: green; } div { box-shadow: 1px 1px 1px 1px; outline: dotted 1px; }
Algumas propriedades herdam o valor da propriedade color do elemento, ou caso essa não tenha sido setada, segue a cascata, até achar da onde vão herdar esse valor. Algumas dessas propriedades são:
- O elemento texto em si;
- A borda do elemento;
- O outline;
- Box-shadow;
- Bullets de uma lista.
No exemplo abaixo, é possível ver que alterando a cor do body, todos os elementos que herdam essa cor, sofrem modificação de estilo.
HTML
<form id="form"> <label for="blue"> <input type="radio" name="color" id="blue" checked/> blue </label> <label for="red"> <input type="radio" name="color" id="red" /> red </label> <label for="green"> <input type="radio" name="color" id="green" /> green </label> </form> <div> <p>text (color)</p> <p class="outline">text (outline)</p> <ul> <li>Item list (border and color)</li> </ul> <span><span>bg color (with currentColor)</span></span> </div>
CSS
body { font-family: Tahoma; font-size: 18px; padding: 20px; } body, body.blue { color: #3498db; } body.green { color: #27ae60; } body.red { color: #e74c3c; } form { margin: 0 0 15px 0; } div { border: solid 5px; box-shadow: 1px 1px 10px 2px; padding: 20px; max-width: 300px; } div > span { background-color: currentColor; display: block; padding: 10px; } div > span > span { color: #fff; } p { margin: 15px 0; } .outline { outline: dotted 1px; } ul li { border: solid 1px; padding: 2px; }
JavaScript
(function() { var colors = document.getElementById('form').color, hold = document.getElementsByTagName("body")[0]; for(var i = 0; i < colors.length; i++) { colors[i].addEventListener('click', changeColor, false); } function changeColor() { hold.classList.remove(hold.classList[0]); hold.classList.add(this.id); } }());
Resultado:
Mas, então, você deve estar se perguntando: qual a real utilidade disso? Agora que as coisas começam a ficar legais e, dependendo da sua criatividade e organização, dá pra fazer algumas coisas bem bacanas.
É possível usar, por exemplo, em animações, svg, gradientes… E por aí vai. Fuçando pela interwebs da vida, achei esse exemplo que, através de uma animação, altera a cor do elemento body, mudando assim o currentColor usado em outro elemento.
Brincando um pouco, montei esse exemplo rápido, onde o currentColor
é aplicado no :after do elemento.
HTML
<a href="#" class="btn">Hello</a> <a href="#" class="btn btn-blue">Hello</a> <a href="#" class="btn btn-green">Hello</a> <a href="#" class="btn btn-red">Hello</a>
CSS
body { padding: 10px; } .btn { color: #888; text-decoration: none; font-family: Helvetica; font-size: 16px; transition: color .3s ease; border: solid 1px; padding: 10px 15px; margin: 5px; border-radius: 5px; } .btn:hover { color: #000; } .btn-blue { color: #3498DB; } .btn-blue:hover, .btn-blue:focus{ color: #446CB3; } .btn-red { color: #F64747; } .btn-red:hover, .btn-red:focus{ color: #C0392B; } .btn-green { color: #68C3A3; } .btn-green:hover, .btn-green:focus{ color: #019875; } .btn:after { width: 0; height: 0; border: 0.4em solid transparent; border-left-color: currentColor; content: ''; display: inline-block; position: relative; top: 1px; left: 5px; transition: transform ease .3s; } .btn:hover:after { transform: translateX(3px); }
A ideia para formar o triângulo é criar uma borda geral transparente e setar apenas o lado que você quer com ocurrentColor, formando assim o triângulo. Uma outra abordagem e, que chegaria no mesmo resultado, seria fazer o processo inverso: setar uma borda geral com cor (no caso nem precisaria do currentColor, pois ele herdaria a cor da propriedade color) e, depois disso, tirar a borda dos lados que você não queira. Algo mais ou menos assim:
.element:after { border: 0.4em solid; border-right-color: transparent; border-top-color: transparent; border-bottom-color: transparent; }
Outros usos
É possível usar nosso camarada em SVGs. Fiz um exemplo rápido (abaixo) onde o SVG herda a cor da propriedade color do elemento pai (a classe .alert):
HTML
<div class="alert"> <svg height="50px" version="1.1" viewBox="0 0 512 512" width="50px" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g><path d="M256.1,96L256.1,96c-79.9,0-155.7,29.9-213.9,84.1L32,189.6l9.9,9.8l32.3,32l9.3,9.2l9.6-8.8 c44.5-40.9,102.3-63.5,162.8-63.5c60.5,0,118.4,22.6,162.8,63.5l9.6,8.8l9.3-9.2l32.3-32l9.9-9.8l-10.2-9.5 C411.6,125.9,335.7,96,256.1,96z"/><path d="M397.4,256.4c-38.8-35.1-88.9-54.4-141.1-54.4h-0.1h-0.3h-8.5l-0.1,0.2c-49.2,2-96,21.1-132.6,54.2l-10.5,9.5l10.1,10 l32.7,32.4l9.1,9l9.6-8.4c25.3-22.2,57.4-34.5,90.3-34.5c33.1,0,65.2,12.3,90.5,34.5l9.6,8.4l9.1-9l32.7-32.4l10.1-10L397.4,256.4z "/><path d="M256.2,416l9.6-9.5l52.8-52.2l10.6-10.5l-11.6-9.5c-15.4-11.4-32.4-20-61.5-20c-29,0-44.9,9.4-61.5,20l-11.5,9.5l10.6,10.5 l52.8,52.2L256.2,416z"/></g></svg> We do not have wifi! </div> <div class="alert alert-red"> <svg height="50px" version="1.1" viewBox="0 0 512 512" width="50px" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g><path d="M256.1,96L256.1,96c-79.9,0-155.7,29.9-213.9,84.1L32,189.6l9.9,9.8l32.3,32l9.3,9.2l9.6-8.8 c44.5-40.9,102.3-63.5,162.8-63.5c60.5,0,118.4,22.6,162.8,63.5l9.6,8.8l9.3-9.2l32.3-32l9.9-9.8l-10.2-9.5 C411.6,125.9,335.7,96,256.1,96z"/><path d="M397.4,256.4c-38.8-35.1-88.9-54.4-141.1-54.4h-0.1h-0.3h-8.5l-0.1,0.2c-49.2,2-96,21.1-132.6,54.2l-10.5,9.5l10.1,10 l32.7,32.4l9.1,9l9.6-8.4c25.3-22.2,57.4-34.5,90.3-34.5c33.1,0,65.2,12.3,90.5,34.5l9.6,8.4l9.1-9l32.7-32.4l10.1-10L397.4,256.4z "/><path d="M256.2,416l9.6-9.5l52.8-52.2l10.6-10.5l-11.6-9.5c-15.4-11.4-32.4-20-61.5-20c-29,0-44.9,9.4-61.5,20l-11.5,9.5l10.6,10.5 l52.8,52.2L256.2,416z"/></g></svg> We do not have wifi! </div> <div class="alert alert-green"> <svg height="50px" version="1.1" viewBox="0 0 512 512" width="50px" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g><path d="M256.1,96L256.1,96c-79.9,0-155.7,29.9-213.9,84.1L32,189.6l9.9,9.8l32.3,32l9.3,9.2l9.6-8.8 c44.5-40.9,102.3-63.5,162.8-63.5c60.5,0,118.4,22.6,162.8,63.5l9.6,8.8l9.3-9.2l32.3-32l9.9-9.8l-10.2-9.5 C411.6,125.9,335.7,96,256.1,96z"/><path d="M397.4,256.4c-38.8-35.1-88.9-54.4-141.1-54.4h-0.1h-0.3h-8.5l-0.1,0.2c-49.2,2-96,21.1-132.6,54.2l-10.5,9.5l10.1,10 l32.7,32.4l9.1,9l9.6-8.4c25.3-22.2,57.4-34.5,90.3-34.5c33.1,0,65.2,12.3,90.5,34.5l9.6,8.4l9.1-9l32.7-32.4l10.1-10L397.4,256.4z "/><path d="M256.2,416l9.6-9.5l52.8-52.2l10.6-10.5l-11.6-9.5c-15.4-11.4-32.4-20-61.5-20c-29,0-44.9,9.4-61.5,20l-11.5,9.5l10.6,10.5 l52.8,52.2L256.2,416z"/></g></svg> We do not have wifi! </div>
CSS
body { font-family: Arial; } .alert { position: relative; color: gray; border: solid 2px; border-radius: 10px; font-size: 30px; letter-spacing: -1px; padding: 15px 15px 15px 115px; max-width: 300px; margin: 15px; } .alert:after, .alert:before { content: ""; position: absolute; top: 50%; margin-top: -6px; width: 12px; height: 12px; background-image: linear-gradient( to bottom, currentColor 0%, currentColor 48%, #fff 49%, #fff 55%, currentColor 56%); border-radius: 50%; box-shadow: inset 0 0 8px 0 rgba(0,0,0,.5); } .alert:after { right: 15px; transform: rotate(45deg); } .alert:before { left: 15px; transform: rotate(-45deg); } .alert svg { position: absolute; left: 50px; top: 5px; fill: currentColor; } .alert-red { color: #e74c3c; } .alert-green { color: #27ae60; }
Resultados
Só isso?! Basicamente sim e não. Aqui que entra a nossa criativade e organização em tirar proveito do que ocurrentColor nos oferece.
Mas e aí, dá pra usar?
O suporte é bem melhor do que eu imaginava. IE9, Chrome, Firefox, Safari e por aí vai… Existe um pequeno bug bem pontual, para Safari e iOS Safari 8, quando aplicado em :after e :before. Dá pra ver mais informações no site do Can I Use.
Gostou? Escrevi alguma groselha? Quer melhorar? Abra uma issue mencionando o post e vamos conversar.
***
Artigo publicado originalmente em: http://www.raphaelfabeni.com.br/current-color-css/