Search code examples
javascriptjqueryarraysjquery-animatejquery-effects

jQuery animations with a MxN matrix


I'm splitting a element into multiple blocks (defined by a number of rows and columns), and then fade these blocks to create animation effects. The type of animation is decided by the delay() value:

$('.block').each(function (i) {
  $(this).stop().delay(30 * i).animate({
    'opacity': 1
  }, {
    duration: 420
  });
});

In this case each block's fade effect is delayed by (30 * current block index). The first block gets 0 delay, the second block 30 delay, ..... the last block 30 * (number of blocks) delay. So this will fade all blocks horizontally.

I've posted a list of effects I've come up so far here: http://jsfiddle.net/MRPDw/.

What I need help with is to find the delay expression for a spiral type effect, and maybe others that you think are possible :D


Solution

  • Here is an example of code for a spiral pattern:

      case 'spiral':
        $('.block', grid).css({
            'opacity': 0
        });
        var order = new Array();
        var rows2 = rows/2, x, y, z, n=0;
            for (z = 0; z < rows2; z++){
                y = z;
                for (x = z; x < cols - z - 1; x++) {
                    order[n++] = y * cols + x;
                }
                x = cols - z - 1;
                for (y = z; y < rows - z - 1; y++) {
                    order[n++] = y * cols + x;
                }
                y = rows - z - 1;
                for (x = cols - z - 1; x > z; x--) {
                    order[n++] = y * cols + x;
                }
                x = z;
                for (y = rows - z - 1; y > z; y--) {
                    order[n++] = y * cols + x;
                }
            }
    
        for (var m = 0; m < n; m++) {
            $('.block-' + order[m], grid).stop().delay(100*m).animate({
                opacity: 1
            }, {
                duration: 420,
                complete: (m != n - 1) ||
                    function () {
                        alert('done');
                    }
            });
        }
        break;
    

    See it working in this fiddle.

    I also improved on your "RANDOM" animation, to show all the squares, not just a subset. The code for that is:

      case 'random':
    
        var order   = new Array();
        var numbers = new Array();
    
        var x, y, n=0, m=0, ncells = rows*cols;
        for (y = 0; y < rows; y++){
            for (x = 0; x < cols; x++){
                numbers[n] = n++;
            }
        }
        while(m < ncells){
            n = Math.floor(Math.random()*ncells);
            if (numbers[n] != -1){
                order[m++] = n;
                numbers[n] = -1;
            }
        }   
    
        $('.block', grid).css({
          'opacity': 0
        });
    
        for (var m = 0; m < ncells; m++) {
            $('.block-' + order[m], grid).stop().delay(100*m).animate({
                opacity: 1
            }, {
                duration: 420,
                complete: (m != ncells - 1) ||
                function () {
                    alert('done');
                }
            });
        }
    
        break;
    

    See it working in this fiddle.