Destrinchando com Mootools 1 – Script de Redimensionamento

20
set
10

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.

10 Comentários

10 Comentários

  1. Adonis
    0:22 on setembro 21st, 2009

    Muito bom o tutorial! O site de exemplo é lindo, parabéns pela iniciativa!
    Continue com o projeto!

  2. admin
    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.

  3. admin
    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.

  4. Georgia
    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)

  5. Alexandre
    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!

  6. admin
    14:51 on janeiro 6th, 2010

    Alexandre, tem como definir os elementes a serem redimencionados, repare nesse trecho do código aqui:

    // 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');

    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.

  7. admin
    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.

  8. Alexandre
    17:48 on janeiro 13th, 2010

    Ótimo.

    Criei uma class “resize”.

    var divs = $$(‘div.resize’);

    Tá funcionando muito bem.

    Obrigado!

  9. Alexandre
    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?

  10. admin
    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.

Deixe um comentário

RSS feed for comments on this post