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();
va开发者_StackOverflowr 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.
精彩评论