我想将两张图片分成几块,然后让它们在同一时间内随机消失。
这里是链接: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');
});
谢谢!
答案 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永远不会尝试执行默认事件,即使它没有被特别阻止。因此,永远不会达到抛出错误的代码。