Web Louca

Home scripts Como rodar imagens com javascript

Como rodar imagens com javascript


rodar imagens javascriptNeste artigo vou-lhe demonstrar como rodar imagens e qualquer elemento desde div a span com javascript. Embora esta abordagem não seja estritamente rígida na forma como pode ser aplicada, sendo que é possível a sua aplicação unicamente com CSS em todos os browsers modernos (IE6+, Firefox, Opera, Webkit).

Vou utilizar Javascript devido ao IE que ainda não suporta CSS3, e devido ainda ao facto de pretender um exemplo global sem muitas complicações. O leitor pode depois alterar o código ao seu bom gosto.

Embora o IE não suporte rotação de imagens ou elementos de uma pagina web via CSS3 este possui um filtro que pode ser utilizado para praticamente a mesma função (Matrix). O problema de utilizar este filtro [filter:progid:DXImageTransform.Microsoft.Matrix(variaveis a introduzir)] reside na complexidade do calculo das variáveis que se devem introduzir.

Atenção caso pretenda rodar as suas imagens em incrementos de 90º aconselho o uso do seguinte filtro ao invés do anterior:

filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);
onde rotation pode abrangir os valores 0, 1, 2, 3 respectivamente 0º, 90º, 180º, 270º

Para nos auxiliar com estes cálculos via javascript iremos recorrer ao javascript Sylvester, do qual terá que realizar download. E incluir na sua pagina web:

<script type='text/javascript' src='sylvester.js'></script>

E ao auxilio do seguinte código:

<script type="text/javascript">
function degreesToRadians(num) {
return (num) * Math.PI / 180;
}
function criarmatrixIE(M) {
return 'M11=' + M.e(1, 1) + ', M12=' + M.e(1,2) + ', M21=' + M.e(2,1) + ', M22=' + M.e(2,2);
}
function rodarElemento(e, deg) {
deg_str = deg + "";
rodar_brsw = "rotate(" + deg + "deg)";
matrix_str = criarmatrixIE(Matrix.Rotation(degreesToRadians(deg)));
filter_str = "progid:DXImageTransform.Microsoft.Matrix(sizingMethod='auto expand', " + matrix_str + ")";

// CSS3:
e.style["rotation"] = deg_str + "deg";
// Firefox:
e.style.MozTransform = rodar_brsw;
// Opera:
e.style.OTransform = rodar_brsw;
// Webkit/Safari/Chrome:
e.style.WebkitTransform = rodar_brsw;
// IE 6/7:
e.style.filter = filter_str;
// IE 8:
e.style.MsFilter = filter_str;
e.style["zoom"] = "1";
}
});
</script>


Agora é só chamar o seguinte código javascript, para rodar a imagem -20 graus:

<script type="text/javascript">rodarElemento(document.getElementById('div/imagem'), -20);</script>


Se pretende algo mais elaborado poderá utilizar algo do género como código de exemplo (Utiliza Mootools e Assets, presente no Mootools More):


//Executa este código quando toda a página estiver carregada (incluindo imagens). Substituir 'load' por 'domready'
//para executar código antes de as imagens começarem a ser carregadas
window.addEvent('load', function() {

//Realiza o load assincrono do javascript Sylvester (remover a chamada que fiz anteriormente neste artigo do seu código)
var myScript = Asset.javascript('/templates/shtema/js/sylvester.js', {
id: 'rotate',
onload: function(){
//Assim que acaba o load do javascript, percorre todas as classes com o nome 'useravatar' e aplica-lhes a rotação da div
$$('.useravatar').each(function(el){
rodarElemento(el, -20);
});
}
});


Como melhorar a implementação?

Se leu o artigo desde inicio derá ter-se questionado quando eu disse que era possível obter o mesmo efeito unicamente com CSS. A verdade é que as expressões filter: são para ser utilizadas em CSS e o que o javascript anterior faz é simplesmente coloca-las no CSS da página para o elemento que se pretende rodar.

A dificuldade residia no calculo dos valores para a expressão filter: do IE. No entanto este calculo é gerado pelo javascript Sylvester, e com um simples alert ou innerHTML ao valor de 'matrix_str' vai obter algo do género: M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678

que se deverá traduzir na seguinte regra:
<div style='filter:"progid:DXImageTransform.Microsoft.Matrix(sizingMethod='auto expand', M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)";'>

Neste momento pode descartar o Javascript.


Para os restantes browsers possui as seguintes expressões CSS que poderá utilizar:

-webkit-transform: rotate(-20deg);
-moz-transform: rotate(-20deg);
-o-transform: rotate(-20deg);


E agora o "piece of resistance" da rotação de imagens e elementos para todos os browsers:

O blog boodesign.com escreve sobre um artigo de rotação de imagens utilizando uma técnica similar (no entanto talvez mais simples) e oferece ainda uma ferramenta para calcular o css necessário de forma a não necessite de utilizar javascript de forma a obter rotação cross-browser.

O problema do CSS e desta nova técnica é que em certos casos peculiares isto lhe provocará uma desformatação da página no IE6 e 7, dai ter introduzido a técnica anterior como ponto fulcral do artigo. Até porque permite alcançar outros efeitos e funcionalidades para a mente imaginativa.... No entanto caso o CSS funcione a 100% para você ou problemas no IE6/7 não forem uma chatice deve optar por utilizar esta ultima técnica que lhe indiquei.

Trackback(0)
Joao
Julho 29, 2010

Gonçalo, muito obrigado pela postagem!

Você tem algum tutorial sobre a criação de sidebars com tabs (separadores) ?

Obrigado!!

GonçaloM
Agosto 07, 2010

Infelizmente ainda não tenho nada do genero criado. Continue a aparecer ;)


Escreva o seu Comentario
 
  pequeno | maior
 

busy
Subscreve a newsletter gratuita e começa hoje mesmo a criar websites e a ganhar dinheiro na internet!


jsimageNeste artigo vou-lhe demonstrar como rodar imagens e qualquer elemento desde div a span co...
phpthumbAtualmente praticamente todos os websites possuem a necessidade de listar os seus artigos...
benchmarksA pouco mais de um ano falei sobre uma ferramenta para otimizar imagens (Artigos/optimize...
phpimageredRedimensionar uma imagem com php pode ser um processo complicado. Quando por exemplo um wo...
linksafiliadosNo inicio do ano escrevi um artigo onde dáva a conhecer uma forma de criar links de afili...

Nuvem de Tags

browser download exemplo opera