Reputation: 399
I have 2 Divs stacked on top of each other.
I need a really simple function that will:
a) Wait for 3 seconds and then b) FadeOut the top Div to reveal the second Div c) Wait 3 seconds again and then d) FadeIn the top Div again e) Loop back again
Can anyone offer any advice?
Many thanks
Upvotes: 4
Views: 29493
Reputation: 484
no one may ever see this, but just in case...
<script>
$(document).ready(function() {
$('#picOne').fadeIn(1000).delay(3000).fadeOut(1000);
$('#picTwo').delay(5000).fadeIn(1000).delay(3000).fadeOut(1000);
});
</script>
this is without looping it though....
That would be
<script>
$(document).ready(function() {
function animate(){
$('#picOne').fadeIn(1000).delay(3000).fadeOut(1000);
$('#picTwo').delay(5000).fadeIn(1000).delay(3000).fadeOut(1000);
}
animate();
setInterval(animate, 10000);
});
</script>
Upvotes: 1
Reputation: 3137
I know this is old, but I thought I would share what I did to accomplish this
$(document).ready(function() {
var delay = 500;
$("#mydiv").bind('fadein', function()
{
$(this).fadeOut(1000, function()
{
$(this).delay(delay).trigger('fadeout');
});
});
$("#mydiv").bind('fadeout', function()
{
$(this).fadeIn(1000, function()
{
$(this).delay(delay).trigger('fadein');
});
});
$("#mydiv").fadeIn(1000, function()
{
$(this).trigger("fadein");
});
});
then call this when you want it to stop
$("#mydiv").stop().hide();
Upvotes: 0
Reputation: 786
IF you also want to have it xfade. Use floyed's script but make the changes that I have used. Only problem is your first image you want shown should be the second one in the li elements
$(document).ready(function() {
var j = 0;
var delay = 5000; //millisecond delay between cycles
function cycleThru(){
var jmax = $("ul#cyclelist li").length -1;
$("ul#cyclelist li:eq(" + j + ")")
.animate({"opacity" : "1"} ,1000)
.animate({"opacity" : "1"}, delay);
$("ul#cyclelist li:eq(" + j + ")").next().animate({"opacity" : "1"} ,1000);
$("ul#cyclelist li:eq(" + j + ")")
.animate({"opacity" : "0"}, 1000, function(){
(j == jmax) ? j=0 : j--;
cycleThru();
});
};
cycleThru();
});
Upvotes: 0
Reputation: 465
Here's what you're looking for (I think). It uses an unordered-list, but you could switch it out for div's or just put your div's inside of the list items like I've done below.
Here's the jQuery...
$(document).ready(function() {
var j = 0;
var delay = 2000; //millisecond delay between cycles
function cycleThru(){
var jmax = $("ul#cyclelist li").length -1;
$("ul#cyclelist li:eq(" + j + ")")
.animate({"opacity" : "1"} ,400)
.animate({"opacity" : "1"}, delay)
.animate({"opacity" : "0"}, 400, function(){
(j == jmax) ? j=0 : j++;
cycleThru();
});
};
cycleThru();
});
...and some starting css...
ul#cyclelist {width:200px;border:solid;position:relative;overflow:hidden;height:200px}
ul#cyclelist li {font-size:1.4em;padding:20px;opacity:0;position:absolute}
You already have your HTML, but in case you need an example...
<ul id="cyclelist">
<li><div>First Div</div></li>
<li><div>Second Div</div></li>
<li><div>Third Div</div></li>
</ul>
I'd love to take credit for this, but it's straight from CSS-Tricks http://css-tricks.com/snippets/jquery/cycle-through-a-list/
Upvotes: 2
Reputation:
This attempt uses a small cookbook function wait from jquery.com.
The function doFading assumes the id of the top div to be "a4".
function doFading() {
$("#a4").wait(3000)
.fadeOut("slow")
.wait(3000)
.fadeIn("slow",doFading);
}
$.fn.wait = function(time, type) {
time = time || 1000;
type = type || "fx";
return this.queue(type, function() {
var self = this;
setTimeout(function() {
$(self).dequeue();
}, time);
});
};
Upvotes: 0
Reputation: 23813
Here's an attempt.
function foo() {
jQuery("#mydiv").animate({opacity: 1.0}, {duration: 3000})
.animate({opacity: 0}, {duration: 3000})
.animate({opacity: 0}, {duration: 3000})
.animate({opacity: 1.0}, {duration: 3000, complete: foo})
}
Note: To pause, just call animate over a property with the same target value as it is right now. The last animate calls the the same function as callback.
PS: Does it cause stack overflow over time?
Upvotes: 10
Reputation: 9164
if the two divs have ids of "id1" and "id2", and id2 is the upper one then the code would be like:
function fadeIn() {
$("id2").animate({opacity:0},500);
setTimeout(fadeOut,3500);
}
function fadeOut() {
$("id2").animate({opacity:1},500);
setTimeout(fadeIn,3500);
}
function startAnim() {
setTimeout(fadeIn,3000);
}
startAnim() starts the animation cycle , which you should call @ the start. Then fadeIn & Out keep animating id2 and setting timeouts for each other. The delay is 3500 , as you wanted 3 seconds of delay (ie. 3000ms) and 500 for the previous animation to complete. This could have been done using a callback on animate , but that's more messy.
Upvotes: 2