How to “animate” the transition between pages with jquery's .load()


I have this ajax site, with pages loading through load() but how do I add a transition? A simple FadeOut + FadeIn would be good already.

This is the code I'm using to load it (plus a loading indicator).

I want the current page (just container) fadeout and the new one arrives with fadeIn

$(document).ready(function() {
    $('a').click(function(event) {
        $("#container").append('<div id="loading">Loading...</div>');
        event.preventDefault();
        var url = $(this).attr('href');
        $('div#container').load(url, function() { $("#loading").fadeOut() });
    });
});

You need something a bit finer-grained than .load() so that you can do the fadeOut() before the new content is inserted:

$(function()
{
    var $container = $('#container');

    $('a').click(function()
    {
        $container.html('<div id="loading">Loading...</div>');

        var url = $(this).attr('href');

        $.get(url, function (data)
        {
            $("#loading").fadeOut(function()
            {
                // without this the DOM will contain multiple elements
                // with the same ID, which is bad.
                $(this).remove();

                $container.hide().html(data).fadeIn();
            });
        });

        return false;
    });
});

(Very basic) demo: http://jsfiddle.net/mattball/Cgqbx/


If you're trying to fade the content in and out, it can be useful to animate the opacity attribute rather than fully fading the element out, to preserve the container height.

$(document).ready(function() {
    $('a').click(function(event) {
        $("#container").animate({'opacity': 0}, 200);
        event.preventDefault();
        var url = $(this).attr('href');
        $('div#container').load(url, function() {
            $(this).animate({'opacity': 1}, 200);
        });
    });
});

Make sure you have a html markup something along the lines of this:

<div id="container">
    <div id="content"></div>
</div>

css:

#loading { display:none }

Then with some simple jQuery you will be able to sort this out:

$(function() {
    $('a').click(function(e) {

        e.preventDefault();

        var url = $(this).attr('href');
        var content = $('#content');

        content.fadeOut(400, function() {

            $("#container").append('<div id="loading">Loading...</div>');

            var loading = $('#loading');

            loading.fadeIn(400, function() {
                content.load(url, function() { 
                    loading.fadeOut(400, function() {
                        $(this).remove();
                        content.fadeIn(400);
                    });
                });
            });   
        });
    });
});

Make sense?

edit: modified a little.