Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Arranging blocks with jquery animation

I have a div.content and there are 30 divs inside that (div.blocks)

I want to make an animation to div.blocks that come and go to their own position.

for example:

CSS

.content{
    position:absolute;
    background:gray;
    width:100%;
    height:100%;
}

.blocks{
    display:inline-block;
    position:absolute;
    background:wheat;
    color:gray;
    font-size:large;
    width:50px;
    height:50px;
    margin-top:4px; 
}

HTML

<div class="content">
    <div class="blocks" data-number="0">1</div>
    <div class="blocks" data-number="1">2</div>
    <div class="blocks" data-number="2">3</div>
    <div class="blocks" data-number="3">4</div>
    <div class="blocks" data-number="4">5</div>
    <div class="blocks" data-number="5">6</div>
    <div class="blocks" data-number="6">7</div>
    <div class="blocks" data-number="7">8</div>
    <div class="blocks" data-number="8">9</div>
    <div class="blocks" data-number="9">10</div>
</div>

Jquery

$(function(){
    // [0][0]==top
    // [0][1]=right
    var positions=[
    [10,10],
    [10,64],
    [10,118],
    [10,172],    
    [10,226],    

    [64,10],
    [64,64],
    [64,118],
    [64,172],    
    [64,226]    

    ];


    $( ".blocks" ).each(function() {
         var number=($(this).data('number'));
        $(this).animate({
            top:positions[number][0],
            right:positions[number][1]
        });
    });
})

DEMO

It is working well, But I want animation runs one by one (when one animation completed callback), I mean when first .blocks arrived to right:10 and top:10 then run other one.

like image 690
LASH Avatar asked Dec 02 '25 06:12

LASH


2 Answers

You could use the delay feature.

$(".blocks").each(function(index) {
    $(this).delay(index * 500).animate({ ... });
});

$(function(){
    // [0][0]==top
    // [0][1]=right
    var positions=[
    [10,10],
    [10,64],
    [10,118],
    [10,172],    
    [10,226],    
      
    [64,10],
    [64,64],
    [64,118],
    [64,172],    
    [64,226]    
    
    ];

    
    $( ".blocks" ).each(function(index) {
         var number=($(this).data('number'));
        $(this).delay(500 * index).animate({
            top:positions[number][0],
            right:positions[number][1]
        });
    });
})
.content{
    position:absolute;
    background:gray;
    width:100%;
    height:100%;
}

.blocks{
    display:inline-block;
    position:absolute;
    background:wheat;
    color:gray;
    font-size:large;
    width:50px;
    height:50px;
    margin-top:4px;
    
    
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="content">
    <div class="blocks" data-number="0">1</div>
    <div class="blocks" data-number="1">2</div>
    <div class="blocks" data-number="2">3</div>
    <div class="blocks" data-number="3">4</div>
    <div class="blocks" data-number="4">5</div>
    <div class="blocks" data-number="5">6</div>
    <div class="blocks" data-number="6">7</div>
    <div class="blocks" data-number="7">8</div>
    <div class="blocks" data-number="8">9</div>
    <div class="blocks" data-number="9">10</div>
</div>

By default, I believe animations are 600ms, but as personal preference, I delay by 500 (to me it looks smoother). Multiplying that by the index means you can "schedule" all the blocks to move when the script runs.

like image 149
Pudd Avatar answered Dec 03 '25 19:12

Pudd


you can use setInterval() function to call your function Here is my code

$(function(){
    // [0][0]==top
    // [0][1]=right
    function Typer(callback)
    {
        var positions=[
            [10,10],
            [10,64],
            [10,118],
            [10,172],    
            [10,226],    
              
            [64,10],
            [64,64],
            [64,118],
            [64,172],    
            [64,226]    
            
        ];
        var i = 0;
        var interval = setInterval(function() {
            var div = $('[data-number="'+i+'"]');
            div.animate({
                top:positions[i][0],
                right:positions[i][1]
            });
            if(i == positions.length) {
                clearInterval(interval);
                callback();
                return;
            }
             i++;
        },
        300);
        return true;
    }
    Typer(function () {});

})
.content{
    position:absolute;
    background:gray;
    width:100%;
    height:100%;
}

.blocks{
    display:inline-block;
    position:absolute;
    background:wheat;
    color:gray;
    font-size:large;
    width:50px;
    height:50px;
    margin-top:4px;
    
    
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div class="content">
    <div class="blocks" data-number="0">1</div>
    <div class="blocks" data-number="1">2</div>
    <div class="blocks" data-number="2">3</div>
    <div class="blocks" data-number="3">4</div>
    <div class="blocks" data-number="4">5</div>
    <div class="blocks" data-number="5">6</div>
    <div class="blocks" data-number="6">7</div>
    <div class="blocks" data-number="7">8</div>
    <div class="blocks" data-number="8">9</div>
    <div class="blocks" data-number="9">10</div>
</div>
like image 43
Islam Zedan Avatar answered Dec 03 '25 20:12

Islam Zedan



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!