jQuery: effetti di dissolvenza avanzati

Come creare degli effetti di dissolvenza avanzati con jQuery.

jQuery di Gabriele Romanato

jQuery non dispone di metodi di scomposizione delle animazioni tali da poter creare un effetto di dissolvenza avanzato. Quello che vogliamo ottenere è la progressiva scomparsa di un elemento, pezzo dopo pezzo. Per ottenere questo effetto dobbiamo materialmente sovrapporre degli elementi vuoti all'oggetto da far scomparire e quindi operare su ciascuno di essi. Vediamo come.

Partiamo da questa struttura HTML:


<div id="img">
	<img src="img14.jpg" />
</div>

Vogliamo che l'immagine scompaia un pezzo alla volta. Dovremo quindi creare 100 elementi vuoti con delle dimensioni in percentuale in modo da potersi adattare a qualsiasi dimensione. Prepariamo quindi il codice CSS:


#img {
    width: 550px;
    height: 330px;
    margin: 2em auto;
    position: relative;
}

#img img {
    display: block;
    position: absolute;
}

div.piece-wrapper {
    width: 100%;
    height: 100%;
    position: absolute;
    display: none;
}

div.piece {
    width: 10%;
    height: 10%;
    background: #fff;
    float: left;
    display: none;
}
​

Gli elementi vuoti e il loro contenitore sono sopra l'immagine per via del posizionamento, ma non influiscono inizialmente sul layout in quanto nascosti. Ciascun blocco ha un colore di sfondo: questo gli permetterà di coprire l'immagine.

Con jQuery useremo la concatenazione delle animazioni per il nostro scopo:


var sliceImage = function(target) {

    target = $(target);
    var i, len = 100,
        delay = 0;

    $('<div class="piece-wrapper"/>').
    appendTo(target);

    for (i = 0; i < len; i++) {

        $('div.piece-wrapper', target).
        append('<div class="piece"></div>');

    }



    $('div.piece-wrapper', target).show();
    $('div.piece', target).each(function() {

        $(this).queue('show', function(next) {

            $(this).delay(delay).show(15, next);

        });

        $(this).dequeue('show');

        delay += 10;

    });


};


setTimeout(sliceImage('#img'), 2000);

Commenti