Sergio Panagia Blog

Effetti grafici con MooTools – Illusione di continuità: The Zen Way

Quick demo

In attesa di ciò che porterà HTML5, non limitatamente al tag canvas, è importante ricordare che tanti effetti grafici possono essere ottenuti, allo stato dell’arte, grazie ai soliti framework come MooTools, jQuery e, magari, qualche trucco con i CSS.

Una delle caratteristiche più utilizzate con tecnologia Adobe Flash(TM) è data dalle transizioni tra la visualizzazione di una pagina e l’altra.

ottenere il medesimo effetto utilizzando tecnologie web compilant spesso fa cadere nel tranello Ajax: tecnologia non adatta a questo scopo, elimina infatti il riferimento alla singola pagina (tra le altre cose in giro per il web leggo ancora la frase “[..]realizzato con animazioni Ajax“, invito queste persone a studiare cosa rappresenti questa tecnologia che non ha nulla a che vedere con gli effetti grafici).

La soluzione è, in ogni caso, semplicemente javascript e la gestione degli eventi “catturando” i click effettuati sul link, dunque ritardando il trasferimento sulla pagina successiva applicando un’animazione (ma non annoiate l’utente, il tempo è una risorsa).

L’esempio

L’esempio riportato in questo post vuole mostrare come creare delle semplici animazioni nella fase iniziale di caricamento della pagina (con preload degli assets) e tra il passaggio da una all’altra pagina.

Partiamo con una semplice animazione: tre stripes disegnate con un qualsiasi software grafico e qualche codice Javascript. Ognuna di queste verrà trattata separatamente secondo timeline different e darà l’illusione ottica di un’animazione a “pennello”.
Prima di tutto prepariamo le tre immagini da applicare alla nostra animazione:

Queste verranno sovrapposte in tre DIV collocati nelle medesime coordinate e verrà applicata un’interpolazione sul valore dell’altezza da 0px alla lunghezza effettiva dell’immagine.

codice CSS

#zen1
{
	position:absolute;
	left:0px;
	right:0px;
	width:300px;
	height:0px;
	background-image:url('assets/zen_1.png');
	background-color:transparent;
	z-index:0;

}
#zen2
{
	position:absolute;
	left:0px;
	right:0px;
	width:300px;
	height:0px;
	background-image:url('assets/zen_2.png');
	background-color:transparent;
	z-index:0;
}
[...]

Oltre a queste stripes verrà presentato un container in cui sarà incluso il testo della pagina.

Una volta arrivati sulla pagina, nascondiamo gli elementi da animare

Codice JS

$('zen1').setStyle('opacity',0);
[..]

Facciamo partire l’animazione solo quando le tre stripes saranno state caricate all’interno della cache (altrimenti l’effetto non sarà soddisfacente in caso di connessione più lenta del previsto o sovraccarico del sistema)

var imgs = new Asset.images(['assets/zen_1.png', 'assets/zen_2.png','assets/zen_3.png'], {
    onComplete: function(){
//code here
}
});

Completato il preload, avviamo le animazioni trattando separatamente ogni div, andando ad aggiungere un ritardo nell’elaborazione dei singoli elementi (funzione delay)

 zen1.morph({
		'height':'450px',
		'opacity':1
	});
	(function()
	{
		zen2.morph({
		'height':'450px',
		'opacity':1
	});
	}).delay(100);
	(function()
	{
		zen3.morph({
		'height':'450px',
		'opacity':1
	});
	}).delay(200);
	(function()
	{
	content.tween('opacity',.8);
	}).delay(2000);

E’ chiaro che a questo punto manca la gestione delle animazioni per il cambio pagina: associamo un id al tag <a> che ci interessa:

Codice HTML

Page 2

Procediamo alla cattura dell’evento e gestione delle animazioni, ritardando il trasferimento alla pagina successiva

Codice JS

  $('page2').addEvent('click',function()
	{
		content.tween('opacity',0);
		zen1.tween('opacity',0);
		zen2.tween('opacity',0);
		zen3.tween('opacity',0);
		(function()
		{
		location.href="page_2.html";
		}).delay(1000);
	
	});

Semplicemente, nella pagina successiva, saranno generate delle animazioni che daranno l’illusione di continuità relativamente agli effetti generati nella transizione precedente.

Concludendo ci sono ancora molte strade da percorrere per garantire certi effetti grafici che fino a poco tempo fa erano ottenibili solo grazie a Flash; il monito più importante è sempre legato ad evitare di abusare delle animazioni, alcune di queste possono peggiorare la user-experience rallentando l’approccio e la leggibilità di un’applicazione web.

Per tutto il resto, c’è da divertirsi.

Demo Download

9 Responses to Effetti grafici con MooTools – Illusione di continuità: The Zen Way

giovanni says: 28 settembre 2010 at 11:33

se invece di far scorrere un immagine dall’alto verso il basso si volesse un effetto da sinistra a destra o da destra a finistra? sarebbe possibile? cosa bisognerebbe modificare nel codice da te proposto?

Rispondi
panaghia says: 28 settembre 2010 at 14:55

Giovanni, in questo caso ho utilizzato un’interpolazione sull’altezza per un’illusione ottica di movimento dall’alto verso il basso.
Per replicare l’effetto da sinistra verso destra basta lavorare sulla larghezza:

Nel css:

#contenitore
{
[..]
width:0px;
overflow:hidden;
}

nell’evento domready javascript (in index.html nel caso dell’esempio)

document.id('contenitore').setStyle('opacity',0);
document.id('contenitore').morph(
{
'width':'300px',
'opacity':1
});

Rispondi
Andrea says: 5 marzo 2013 at 21:04

Ciao, tutto mi funziona, ma quando clicco un link in fondo ad una pagina la pagina mi torna in alto di scatto! Esiste un modo di bloccare l’azione?
Ho provato anche lo smoothscroll ma non va…
Forse devo mettere un riferimento destinazione #qui in modo che non si muova…
Se hai suggerimenti… Grazie!!
Andrea

Rispondi
admin says: 6 marzo 2013 at 12:01

Ciao Andrea, nel link prova a impostare href="_#".
In alternativa dovresti provare a chiamare la funzione event.preventDefault() nell’evento click dell’anchor.

Rispondi

Lascia un Commento

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati *

*

*

È possibile utilizzare questi tag ed attributi XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>