下面是我要做的。我有一个有很多图像的网格,所以我使用imagesLoaded库和砖石结构。
这是我的CSS:
.grid {
opacity:0;
}
和HTML:
<div class="grid">
<div class="grid-sizer"></div>
<div class="gutter-sizer"></div>
<div class="item">image</div>
<div class="item">image</div>
<div class="item">image</div>
</div>
这是我的JS:
var $container = $('.grid');
// initialize Masonry after all images have loaded
$container.imagesLoaded( function() {
$container.masonry({
columnWidth: '.grid-sizer',
itemSelector: '.item',
gutter: '.gutter-sizer'
});
$container.masonry('on', 'layoutComplete', function(){
console.log('got here');
$container.animate({'opacity':1});
});
});
我的目标是隐藏网格,直到加载所有图像并完成布局,然后将其淡入。由于上面代码中的某些原因,它永远不会进入onlayoutComplete块。
如果我将该块移动到imagesLoaded之外,$container.masony在该点未定义。
有什么想法吗?
小提琴在这里
如果将栅格不透明度更改为1,您可以看到所有东西都布置得很好。只是想弄清楚如何调用layoutComplete来将不透明度设置为1。
您不需要在砖石上使用layoutComplete
事件。因为你可以在砖石初始化下添加你的动画代码。
加载完所有图像后,将执行imageLoaded函数。然后,您可以创建砖石对象并立即设置动画,如下所示:
var $grid = $('.grid').imagesLoaded( function() {
// init Masonry after all images have loaded
$grid.masonry({
columnWidth: 200,
itemSelector: '.item',
gutter: 10
});
console.log('got here');
$('.grid').animate({'opacity':1});
});
这里有一个jsfiddle演示了
jQuery(document).ready(function($){
var wdm_wait = function(){
jQuery("body").find("img").each(function(i) {
if(!this.complete)
{
return false;
}
});
// when code reaches here Its assured that all the images are loaded
clearInterval(waiting);
console.log('got here');
var $container = $('.grid');
// initialize Masonry after all images have loaded
$container.masonry({
columnWidth: 100,
itemSelector: '.item',
gutter: 10
});
$container.animate({'opacity':1});
}
waiting = setInterval(wdm_wait,100);
});
这当然可以确保您的js代码只有在所有图像都加载(渲染)之后才能执行
希望这能有所帮助!:)
你试过这个吗,我想这就是你的答案
var $container = $('.grid').masonry({
columnWidth: 200,
itemSelector: '.item',
gutter: 10
});
$container.masonry( 'on', 'layoutComplete', function() {
$container.animate({'opacity':1});
});
$container.masonry();