var mysite = {
    'url': "http://www.ajaxweb20.net",
    'author': "Giuseppe Raso",
    'xhtmlValid': true,
    'cssValid': true
}
Home > Blog

Javascript - Usare le equazioni di Robert Penner per ottenere effetti da Hollywood nelle nostre pagine web.

Sono davvero parecchi i siti e le applicazioni web2.0/ajax che si appoggiano su framework più o meno collaudati come jquery, mootools e prototype. La maggior parte delle volte gli stessi siti sfruttano dei plugin delle librerie a cui si appoggiano ( come scriptacolous e interface ) per realizzare degli effetti molto carini, inutili ma sicuramente di effetto.
Chi sa un minimo di javascript dovrebbe poter dire "anche io potrei realizzare la stessa cosa in 2 minuti, basta un setInterval, no?".
Diciamo di si, ma se vogliamo realizzare degli effetti "a molla" o roba del genere e non siamo matematici ci conviene imparare ad utilizzare le equazioni di Robert Penner.
Queste sono delle funzioni che permettono di ottenere un valore a partire da altri dati che gli forniremo. Sono state scritte per Action Script, d’altra parte i due linguaggi sono molto simili e perciò implementarle sarà molto semplice; quasi un “copia/incolla” direi :)
Iniziamo scaricandole da qui e copiandole in un file js. Queste potranno essere utilizzate secondo i termini descritti nello stesso file.
Vediamo subito un esempio di come implementarle:

  1. transitions = {
  2.     ‘linearTween’function (t, b, c, d) {
  3.         return c*t/d + b;
  4.     },
  5.  
  6.     ‘easeInQuad’function (t, b, c, d) {
  7.         return c*(t/=d)*t + b;
  8.     },
  9.     
  10.     ‘easeOutBounce’function (t, b, c, d) {
  11.         if ((t/=d) < (1/2.75)) {
  12.             return c*(7.5625*t*t) + b;
  13.         } else if (t < (2/2.75)) {
  14.             return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
  15.         } else if (t < (2.5/2.75)) {
  16.             return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
  17.         } else {
  18.             return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
  19.         }
  20.     }
  21. }

Ovviamente ne ho messe poche per motivi di brevità: in realtà ce ne sono circa una trentina.
Fatto ciò creiamoci una funzione che sia in grado di utilizzarle:

  1. function animate(idObj, prop, init, end, duration, transition) {
  2.     var obj = document.getElementById(idObj),
  3.         change = end-init,
  4.         pos,
  5.         time = new Date().getTime(),
  6.         timer,
  7.         totaltime = time + duration,
  8.         duration = duration / 1000,
  9.         transition = transitions[transition || ‘easeInQuad’],
  10.         i = setInterval(function() {
  11.             timer = new Date().getTime();
  12.             if(timer > totaltime) {
  13.                 clearInterval(i);
  14.                 obj.style[prop] = end + ‘px’;
  15.             } else {
  16.                 pos = transition((timer - time)/1000, init, change, duration)
  17.                 obj.style[prop] = pos + ‘px’;
  18.             }
  19.         }5);
  20. }

Concentriamoci sulla riga 16: alla transizione passiamo 4 argomenti:

  • time: il tempo passato dall’inizio della transizione in secondi;
  • init: la posizione iniziale ( costante );
  • change: la differenza tra end ed init ( costante );
  • duration: la durata dell’intera transizione in secondi.

Infine ecco un esempio funzionante: http://www.sitomega.com/expl/robertpenner.htm

In fin dei conti non è stato molto difficile… Come potete notare però questa è una funzioncina creata giusto come esempio e supporta solo animazioni di grandezze in pixel. Ora tocca a voi creare la prossima killer application!

Leave a Reply