CSS Hooks – Introdução a Nova Extensão do jQuery
$.cssHooks, basicamente é uma extensão para as funções .css() e .animate(), ou melhor dizendo, é uma forma de implementar novas propriedades a estas funções, sem a necessidade de alterar o código fonte, por isto é chamada como extensão. Com $.cssHooks, você pode criar infinitas possibilidades para se trabalhar o CSS com jQuery.
O plugin jQuery Rotate, que ilustra bem como funciona $.cssHooks. Vamos a introdução para aprender e criar nossos próprios CSS Hooks:
Para cada extensão que você for desenvolver, há dois métodos base, para o funcionamento da propriedade: get e set. O primeiro diz respeito a recuperar o valor da propriedade e o segundo é setar/alterar o valor da propriedade no elemento. É possivel adicionar mais métodos (para uso interno por exemplo), mas vale lembrar que jQuery utiliza apenas esses dois métodos (get e set).
Sintax básica para $.cssHooks
Vejamos a sintax básica para um CSS Hook:
$.cssHooks.nomeDaPropriedade = {
//Recupera o valor da propriedade
get: function(elem){
},
//Seta o valor da propriedade
set: function(elem, value){
}
}
Cada método, recebe os parâmetros necessários para o desenvolvimento do mesmo. Observe o uso da função .css() para você entender melhor:
$('div').css('nomeDaPropriedade'); //jQuery irá chamar o método GET
$('div').css('nomeDapropriedade', 'valorDaPropriedade'); //jQuery irá chamar o método SET, porque há um parâmetro adicional na função, para setar o valor
Agora é só partir para o desenvolvimento da propriedade.
Criando novos $.cssHooks
Vamos usar este CSS Hook como exemplo:
/**
* Retorna se o elemento tem o background na cor azul
* Usando CSSHooks, disponível a partir da versão 1.4.3 do jQuery
*/
$.cssHooks.azul = {
get: function(elem){
var azul = ['blue', '#00F', '#0000FF', 'rgb(0, 0, 255)', 'hsl(240, 100%, 50%)'];
var ret = $(elem).css('background-color');
return ($.inArray(ret, azul) != '-1')? 1 : 0;
}
}
Com as novas implementações que faremos, a propriedade azul irá ficar da seguinte maneira:
- Se o elemento tiver o fundo azul, retornará a cor definida. Se não, retornará false;
- Para setar o valor da propriedade, o pârametro value receberá o modo como a cor será defina (hex, rgb, hsl..). E assim o elemento ficará azul, com a cor no modo definido.
De início, vamos alterar o método get, que já está feito. Será necessário alterar apenas uma linha. Se estivesse com a cor azul, retornaria true, agora irá retornar a cor, no lugar do true:
return ($.inArray(ret, azul) != '-1')? ret : 0; //alterado "1" por "ret"
Assim o método irá checar se a cor do elemento está na array (var azul), se tiver retornará a cor, se não retornará false.
E para concluir vamos criar o método set:
set: function(elem, value){
//Modos disponíveis
var modo = {
hex: '#00F',
rgb: 'rgb(0, 0, 255)',
hsl: 'hsl(240, 100%, 50%)'
},
//Define em qual modo a cor será usada, se não tiver na array, usará o modo NAME (blue)
usar = 'blue';
$.each(modo, function(chave, valor){
if(chave == value) usar = valor; //checa se a chave é igual ao parâmetro value
});
alert('A cor usada será: ' + usar); //REMOVER OU COMENTAR;
$(elem).css('background-color', usar);
}
Não vai ter muito sentido testar o resultado em um navegador que não seja o IE. Todos os demais, que tem suporte a cor RGB, converte a cor para RGB para depois setar a cor. Chece o resultado com o alert disponível no código, depois remova ou comente… você irá ver que funciona corretamente…
Colocando tudo junto:
$.cssHooks.azul = {
/**
* Recupera o valor
*/
get: function(elem){
var azul = ['blue', '#00F', '#0000FF', 'rgb(0, 0, 255)', 'hsl(240, 100%, 50%)'];
var ret = $(elem).css('background-color');
return ($.inArray(ret, azul) != '-1')? ret : 0;
},
/**
* Seta o valor
*/
set: function(elem, value){
//Modos disponíveis
var modo = {
hex: '#00F',
rgb: 'rgb(0, 0, 255)',
hsl: 'hsl(240, 100%, 50%)'
},
//Define em qual modo a cor será usada, se não tiver na array, usará o modo NAME (blue)
usar = 'blue';
$.each(modo, function(chave, valor){
if(chave == value) usar = valor; //checa se a chave é igual ao parâmetro value
});
alert('A cor usada será: ' + usar); //REMOVER OU COMENTAR
$(elem).css('background-color', usar);
}
}
Demonstração | Download do arquivo
É isto… Foi um exemplo básico e é claro que é possivel criar propriedades bem melhores que esta, basta ter uma boa imaginação e mandar ver no código.
Até a próxima.

1 Comentário
Maicon Sobczak disse:
18 de fevereiro de 2011 às 14:56
Muito legal teu tutorial. Não conhecia o cssHooks e você explicou de maneira fácil de entender.