CSS

3 jun, 2014

5 formas de interação de CSS e JavaScript que você provavelmente não conhece

Publicidade

CSS e JavaScript: as linhas se tornam turvas a cada lançamento de browser. Eles sempre desempenharam papéis diferentes, mas no final, ambas são tecnologias de front end que precisam ser trabalhadas juntas. Temos nossos arquivos .js e nossos .css, mas isso não significa que CSS e JS interagem mais do que o básico que os frameworks javascript permitirão. Aqui estão cinco formas que JavaScript e CSS vão trabalhar juntos e que você talvez ainda não conhecesse!

1. Obtendo propriedades de pseudo-elementos com JavaScript

Todo mundo sabe que é possível pegar valores de estilos CSS básicos para um elemento com a propriedade do estilo, mas e as propriedades dos pseudo-elementos? Sim, JavaScript também pode acessa-los!

// Get the color value of .element:before
var color = window.getComputedStyle(
	document.querySelector('.element'), ':before'
).getPropertyValue('color');

// Get the content value of .element:before
var content = window.getComputedStyle(
	document.querySelector('.element'), ':before'
).getPropertyValue('content');

Você pode ver como eu acesso propriedades de valor nesse artigo sobre Detecção de Estado de Dispositivo. Super útil se você quer criar sites únicos e dinâmicos!

2. API classList

Já usamos os métodos addClass, removeClass, e toggleClass nas nossas bibliotecas JavaScript favoritas. Para conseguir suportar navegadores antigos, cada biblioteca pegaria o className dos elementos (no formato string) e adicionaria/removeria a classe, então faz o update na string className. Há uma nova API para adicionar, remover e alternar classes, e é chamado de classList:

myDiv.classList.add('myCssClass'); // Adiciona uma classe
myDiv.classList.remove('myCssClass'); // Remove uma classe
myDiv.classList.toggle('myCssClass'); // Alterna uma classe

classList foi implementado por muito tempo na maioria dos navegadores, mas essa API vai até o IE 10.

3. Adicionar e remover regras diretamente para folhas de estilo

Somos todos bem entendidos em modificar estilos através do método element.style.propertyName, e usamos toolkits JavaScript para fazer isso. Mas você sabia que é possível ler e escrever regras dentro de folhas de estilo novas e já existentes? A API é realmente simples também!

function addCSSRule(sheet, selector, rules, index) {
	if(sheet.insertRule) {
		sheet.insertRule(selector + "{" + rules + "}", index);
	}
	else {
		sheet.addRule(selector, rules, index);
	}
}

// Use it!
addCSSRule(document.styleSheets[0], "header", "float: left");

O caso de uso mais comum é criar uma nova folha de estilo, mas se você quiser modificar uma existente, é possível.

4. Carregar arquivos CSS com um loader

Utilizar lazy-load para recursos como imagens, JSON e scripts são boas formas de diminuir o tempo de carregamento. Você pode carregar esses recursos externos com loaders JavaScript como curl.js, mas você sabia que pode fazer lazy load de folhas de estilo e receber a notificação no mesmo call-back?

curl(
	[
		"namespace/MyWidget",
		"css!namespace/resources/MyWidget.css"
	], 
	function(MyWidget) {
		// Do something with MyWidget
		// The CSS reference isn't in the signature because we don't care about it;
		// we just care that it is now in the page
	}
});

O meu site faz lazy load com PrismJS, um highlighter de sintaxe, baseado na presença de elementos <pre>. Uma vez que todos os recursos estiverem carregados, incluindo a folha de estilo, eu posso disparar um callback!

5. CSS pointer-events

A propriedade pointer-events do CSS é interessante pois funciona quase como um JavaScript, efetivamente desabilitando um elemento quando o valor é none, mas permitindo que o elemento funcione normalmente quando o valor não for none. Você pode estar aí dizendo “e daí?” mas pointer-events até mesmo previnem que eventos JavaScript sejam disparados!

.disabled { pointer-events: none; }

Clique no elemento e qualquer callback addEventListener que você tenha colocado no elemento não será disparado. Uma propriedade perfeita, realmente – você não precisa de checar o className antes de decidir se vai ou não disparar alguma coisa com base na presença da classe.

 

Essas são só 5 formas que CSS e JavaScript interagem e que são pouco conhecidas. Tem mais alguma ideia? Compartilha com a gente!

Artigo traduzido com autorização, publicado originalmente em http://davidwalsh.name/ways-css-javascript-interac