在jQuery中拆分和动画多个图像

时间:2015-09-08 22:03:05

标签: jquery css jquery-animate

我想将两张图片分成几块,然后让它们在同一时间内随机消失。

这里是链接:www.bluey.fr

我的问题是它不适用于包含图像的第二个div ...

HTML

<button>Animate</button>

<div class="fragments">
  <img src="img/vignettes/illustrations_perso.jpg"/>
</div>

<div class="fragments">
  <img src="img/vignettes/bonhomes.jpg"/>
</div>

CSS

.fragments {
    position: relative;
    width: 142px; 
    height: 142px;
    margin:10px;    
}

.fragments img {
    width:100%;
    height:100%;
}

.fragment { 
    float: left;
    opacity: 1;
    -webkit-transition: all .3s ease-in-out;
    -moz-transition: all .3s ease-in-out;
    -ms-transition: all .3s ease-in-out;
    -o-transition: all .3s ease-in-out;
}

.fragment-animated {
    opacity: 0;
}

.css3-preload .fragments * {
  -webkit-transition: none !important;
  -moz-transition: none !important;
  -ms-transition: none !important;
  -o-transition: none !important;
  transition: none !important;
}

JAVSCRIPT

;(function( $, window ) {

  var _defaults = {
    x      : 1, 
    y      : 1, 
    random : true, 
    speed  : 800,
    queue: false
  };

  function range( min, max, rand ) {
    var arr = ( new Array( ++max - min ) )
      .join('.').split('.')
      .map(function( v,i ){ return min + i })
    return rand
      ? arr.map(function( v ) { return [ Math.random(), v ] })
         .sort().map(function( v ) { return v[ 1 ] })
      : arr
  }

  $('body').addClass('css3-preload')
  $( window ).load(function(){ $('body').removeClass('css3-preload') })

  $.fn.fragments = function( options ) {

    var o = $.extend( {}, _defaults, options );

return this.each(function() {

  var $container = $(this);

制作片段:

  var width = $container.width(),
      height = $container.height(),
      $img = $container.find('img'),
      n_fragments = o.x * o.y ,
      fragments = [], $fragments;

  for ( var i = 0; i < n_fragments ; i++ ) {
    fragments.push('<div class="fragment"/>');
  }

  $fragments = $( fragments.join('') );

  // Hide original image and insert fragments in DOM
  $img.hide().after( $fragments );

  // Set background
  $fragments.css({
    width: width / o.x,
    height: height / o.y,
    backgroundImage: 'url('+ $img.attr('src') +')'
  });

  // Adjust position
  $fragments.each(function() {
    var pos = $(this).position();
    $(this).css( 'backgroundPosition', -pos.left +'px '+ -pos.top +'px' );
  });

为片段添加动画:

  var fragmentsArr = range( 0, n_fragments, o.random ),
      fragmentSpeed = o.speed / n_fragments; // time to clear a single fragment

  // Public method
  $container.on( 'animate', function() {

    fragmentsArr.forEach(function( fragment, i ) {
      setTimeout(function(){
        $fragments.eq( fragment ).toggleClass( 'fragment-animated' );
      }, i * fragmentSpeed );
    });

  });

});

  };


}( jQuery, window ));

$('.fragments').fragments({ x: 3, y: 3});

$('button').click(function() {
    $('.fragments').trigger('animate');
});

谢谢!

1 个答案:

答案 0 :(得分:2)

您必须阻止animate事件的默认操作才能使其在所有浏览器中都有效。

// Public method
$container.on( 'animate', function(event) {

  fragmentsArr.forEach(function( fragment, i ) {
    setTimeout(function(){
      $fragments.eq( fragment ).toggleClass( 'fragment-animated' );
    }, i * fragmentSpeed );
  });

  event.preventDefault();
});

请参阅this jsfiddle

显然,这是因为jQuery为jQuery.isFunction( elem[ type ] )返回了不同的结果。在Chrome elem[type]中有一个(基本上是空的)函数,因此jQuery返回true并执行默认操作,然后导致错误。

在Firefox中,语句返回false,因为elem[type]未定义。因此,jQuery永远不会尝试执行默认事件,即使它没有被特别阻止。因此,永远不会达到抛出错误的代码。