Destrinchando com Mootools 1 – Script de Redimensionamento
set10
Esta semana um visitante vez uma solicitação para mim, destrinchar os javascripts de um site específico que contém scripts utilizando Mootools.
Achei uma excelente idéia, fica muito mais fácil eu pegar um script pronto, comentar o código em português afim de tentar explicar o funcionamento, e óbiviamente explicar também como incorporar o script no site.
Simplesmente adorei, este visitante me deu a seguinte URL como exemplo: http://ammunitiongroup.com/index.php/work/
Como podem ver existem diversos scripts nesta página, resultando em diversos efeitos diferentes.
O que irei fazer é explicar efeito por efeito, acredito que desta forma todos poderão compreender alguns dos scripts.
O Resultado final
Clique no link abaixo para abrir o script já em funcionamento, redimensione a janela do navegador e veja como ficará o conteúdo da página.
Clique aqui para ver o resultado final.
Destrinchando o script
Ok, abaixo está o código, tentei comentar tudo que entendi, caso tenham dúvidas basta comentar que tentarei ajudar.
// algumas definições iniciais var ratio = 1; //propoção inicial, 1 = 100% var objs = []; //objetos que serão monitoradis e redimensionados var id_index = 0; //uma variável para um contador /* Classe principal, responsável por definir a cada objeto html que chamar esta classe os estilos que podem ser redimensionados, ou seja, nem todos os objetos html possuem todos os estilos citados abaixo, esta classe basicamente testa e filtra os filtros compatíveis */ var ScalableObject = new Class({ initialize: function(id, obj, compatible) { if(typeof(compatible) != 'Array') this.compatible = ['height', 'width', 'top', 'left', 'font-size','margin-top', 'margin-bottom', 'margin-left', 'margin-right', 'padding-top', 'padding-left', 'padding-bottom', 'padding-right', 'line-height', 'bottom', 'right']; else this.compatible = compatible; this.obj = obj; $(obj).store('scaleID', id); this.styleList = []; this.id = id; for(var i=0; i<this.compatible.length; i++) { if($(obj).getStyle(this.compatible[i]).indexOf('px') == -1) { this.compatible.splice(i, 1); i--; } else this.styleList.push( $(obj).getStyle(this.compatible[i]).split('px')[0] ); } }, /* o arqumento "r" é a proporção na qual o objeto em questão será redimensionado este valor será em porcento porém em decimais, exemplo, 50% seria 0.5, 80% = 0.8 e por aí vai */ scale: function(r) { /* basicamente para cada estilo compatível, calcula o tamanho de acordo com a propoção passada e redimensiona */ for(var i=0; i<this.compatible.length; i++) if($(this.obj).getStyle(this.compatible[i]).indexOf('%') == -1) $(this.obj).setStyle( this.compatible[i], this.styleList[i] * r +'px' ); } }); // Uma verificação básica para ver se é Safari no Mac var isMacSafari = ( navigator.vendor && navigator.vendor.indexOf('Apple') != -1 && navigator.platform && navigator.platform.indexOf('Mac') != -1 ); /* Repare que para todos os outros navegadores está sendo chamado no domready somente no Safari do Mac que é chamado no load */ window.addEvent(((isMacSafari) ? 'load' : 'domready'), function() { /* chama a função responsável por definir os objetos compatíveis a serem redimensionados */ init_resize(); // já calcula e redimensiona os objetos resize(); // aqui é que fica algo muito importante, será chamado a função // resize() sempre que a tela for redimensionada window.addEvent('resize', function() { resize(); }); }); /* Função que define quais elementos serão redimensionados, reparem que não são todos os elementos e alguns outros não é nem necessário utilizar todos as propriedades css compatíveis, portanto o ideal é definir quais propriedades css você quer redimensionar, isso é importante pois dependendo do css original de sua página você poderá distorcendo tudo. */ function init_resize() { // todas as divs var divs = $$('div'); // todas as imagens var images = $$('img'); // todos os que estão aí abaixo var text = $$('a', 'h1', 'h2', 'h3', 'p', 'input', 'textarea'); for(var i=0; i<divs.length; i++) objs.push(new ScalableObject(id_index++, divs[i],0)); // repare que para as imagens somente as propriedades css que // foram definidas aqui serão trabalhadas for(var i=0; i<images.length; i++) objs.push( new ScalableObject( id_index++, images[i], ['height','width','margin-bottom','margin-right'] ) ); for(var i=0; i<text.length; i++) objs.push(new ScalableObject(id_index++, text[i],0)); } function resize() { /* a proporção a ser definda nos objetos da página é de acordo com o limite definido abaixo, ou seja, o ideal seria que a altura da página fosse 735px, qualquer coisa acima ou abaixo disso será redimensionada. O mesmo ocorre para a largura, o ideal é que a altura fosse 1000px, qualquer coisa acima disso será redimensionado. Abaixo será escolhido a menor proporção. */ ratio = Math.min(window.getSize().y / 735, window.getSize().x / 1000); // repare que a propoção será no máximo 100% e no mínimo 34% ratio = (ratio > 1) ? 1 : (ratio < .34) ? .34 : ratio; // manda redimensionar todos os objetos de acordo com a proporção for(var i=0; i<objs.length; i++) objs[i].scale(ratio); }
Baixe os arquivos e incorpore em seu site
O javascript utilizado neste exemplo pode ser baixado clicando no link ao lado: Clique aqui para baixar
Primeiro você precisa incluir o Mootools na página, sugiro utilizar o AJAX APIs do Google para incluir o Mootools na página, veja abaixo como incluir facilmente o Mootools em seu site utilizando o Google AJAX API.
<script src="http://www.google.com/jsapi" type="text/javascript"></script> <script type="text/javascript"> google.load("mootools", "1.2.3"); </script>
Agora basta incluir o script de redimensionamento de conteúdo na sua página, note que ambos os scripts devem ser inclusos no HEAD do documento, reparem também que o Mootools está sendo incluso antes de chamar o script.
<script src="http://www.google.com/jsapi" type="text/javascript"></script> <script type="text/javascript"> google.load("mootools", "1.2.3"); </script> <script src="resize.js" type="text/javascript"></script> </head>
Conclusão
Reparem que é um script muito básico, é claro que é possível fazer isso tudo sem utilizar o Mootools, mas com Mootools o código fica muito mais fácil de ler e compreender.
Espero que tenham gostado e e até a próxima.
0:22 on setembro 21st, 2009
Muito bom o tutorial! O site de exemplo é lindo, parabéns pela iniciativa!
Continue com o projeto!
10:42 on setembro 21st, 2009
Adonis,
Muito obrigado pelo apoio, estarei sempre fazendo o possível para manter o projeto, visitantes como você que me motivam a continuar.
Divulgue o máximo possível para que todos conheçam a maravilha que é o Mootools.
10:48 on setembro 21st, 2009
Adonis,
Muito obrigado pela participação, espero que você volte sempre ao site e divulgue o máximo possível a nossa causa, o Mootools está aí para ajudar a todos os desenvolvedores.
17:07 on janeiro 4th, 2010
Oi,
Estou com esse problema. Quero redimensionar o site de acordo com a resolução da tela.
Fiquei em dúvida apenas de uma coisa: onde você coloca esses códigos?
(fiz o site em flash, e publico ele no html)
12:36 on janeiro 6th, 2010
Oi!
É possível que somente determinados elementos da página sejam redimensionáveis enquanto os demais fiquem inalterados?
Algo como uma class específica que os elementos que devem ser redimensionados tenham?
Obrigado!
14:51 on janeiro 6th, 2010
Alexandre, tem como definir os elementes a serem redimencionados, repare nesse trecho do código aqui:
// todas as divsvar divs = $$('div');
// todas as imagens
var images = $$('img');
// todos os que estão aí abaixo
var text = $$('a', 'h1', 'h2', 'h3', 'p', 'input', 'textarea');
O que você pode fazer eh definir na variável divs a classe, isso se for uma div também, exemplo:
var divs = $$('div','.minha_class');Já na variavel text você deverá colocar ali as classes em elementos do tipo texto, desta forma fica mais organizado.
14:53 on janeiro 6th, 2010
Georgia, este script não funciona bem com flash, na verdade o Flash já tem isso dentro dele, basta você definir a largura e altura do elemento Flash em seu site para 100% que ele já redimensiona tudo sozinho.
17:48 on janeiro 13th, 2010
Ótimo.
Criei uma class “resize”.
var divs = $$(‘div.resize’);
Tá funcionando muito bem.
Obrigado!
15:13 on janeiro 14th, 2010
Estou com uma outra dúvida.
Quando altero a largura da página, nada é redimensionado. O redimensionamento acontece só quando altero a altura da página. E como horizontalmente nada é redimensionado, o browser força uma srollbar horizontal pra mostrar o conteúdo excedente.
O código não deveria redimensionar os elementos quando a largura da página é alterada?
15:43 on janeiro 14th, 2010
Alexandre, acredito que será redimencionado sim, mas nesse seu caso ainda não passou da proporção necessária para aplicar o redimensionamento. Veja o comentário no final do script a respeito da proporção.