Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to increase the delay on animation on every pass of a for loop

First I've created a basic demonstration of what I have at the moment here.

Second this is the javascript I'm using.

var boxes = ["#one","#two","#three","#four"];

boxhover = function(a){
    $("#hover").hover(
        function(){
            $(a).stop(true).delay(250).animate({opacity:1});
        },
        function(){
            $(a).stop(true).delay(250).animate({opacity:0});
        }
    )
}

for(var i=0; i<boxes.length; i++)
{
    boxhover(boxes[i])
}

What I'm hoping to achieve is to have each box hover one after the each other with a delay time of 250. I've tried adding a delay to the animation function (as you can see above) and also a setTimeout in the for loop, but no luck. Any help would be great.

like image 611
Mimo Avatar asked Feb 18 '13 22:02

Mimo


1 Answers

You can pass in the array index as an additional parameter to your boxhover function and then perform a multiplication on the delay factor.

var boxes = ["#one","#two","#three","#four"];

boxhover = function(a, i){
    $("#hover").hover(
        function(){
            $(a).stop(true).delay(250 * i).animate({opacity:1});
        },
        function(){
            $(a).stop(true).delay(250 * i).animate({opacity:0});
        }
    )
}

for(var i=0; i<boxes.length; i++)
{
    boxhover(boxes[i], i)
}

jsfiddle

Alternative Solution:

To avoid binding multiple hover event handlers on #hover and having to maintain an array of IDs, you can do the following:

$("#hover").on({
    'mouseenter': function(e) {
        // Animate the box set to visible
        animateBoxSet(1);
    },
    'mouseleave': function(e) {
        // Animate the box set to invisible
        animateBoxSet(0);
    }
});

function animateBoxSet(opacity) {
    // For each box
    $('.box').each(function (index, element) {
        // Set the delay based on the index in the set
        var delay = 250 * index;
        // Animate it the visibility after the delay
        $(element).stop(true).delay(delay).animate({
            'opacity': opacity
        });
    });
}

jsfiddle

like image 200
Ruben Infante Avatar answered Oct 04 '22 20:10

Ruben Infante