Destrinchando com Mootools 1 – Script de Redimensionamento

20
set
8

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.

Novidades do mootools

23
mai
0

Segue abaixo algumas novidades:

  • Mootools Brasil muda o layout
  • Mootools ganha nova versão: Mootools 1.2.2, que possui diversas atualizações de bugs e uma imensa atualização no Class.
  • Já há planos para o lançamento do Mootools 2.0
  • Mootools More ganha nova versão: Mootools More 1.2.2.2, esta versão possui diversos novos plugins e algumas outras novidades.
  • Documentação em inglês mais completa do Mootools More foi lançada
Tagged as: , ,