jquery砌体在chrome / safari中打破(堆叠图像)但仅在第一次加载时

时间:2011-09-19 20:06:30

标签: jquery jquery-masonry

似乎当我尝试加载页面时,所有图像都堆叠在一起。但是如果你点击链接将你带到同一个页面(比如主页链接),那么砌体就会启动。所以我认为砌体加载太早,就像jquery准备页面之前一样。

这是我的jquery电话:

$(document).ready(function(){
    $('#image_roll_container').masonry({
        itemSelector: '.box'
    });

....

以下是相关网页:

http://ratattoos.com/

它在firefox和IE8中运行得很好。

12 个答案:

答案 0 :(得分:18)

我已通过以下调整设法解决了这个问题:

<script type="text/javascript">
    $(document).ready(function(){
        $('img').load(function(){
            $(".content_photo").masonry();
        });
        $(".content_photo").masonry();
    });
</script>

答案 1 :(得分:11)

看起来我需要一个名为imagesLoaded的插件,以便Monsry脚本能够正常使用chrome和safari

答案 2 :(得分:8)

尝试了这个帖子中建议的一切,没有任何效果,然后发现了这个:

$(window).load(function(){   $('#content').masonry(); });

现在工作正常,在这里找到: https://github.com/desandro/masonry/issues/35

原作者: https://github.com/desandro

答案 3 :(得分:4)

你对imagesLoaded是正确的。它在Firefox中运行良好,但在Chrome / Safari中堆叠。

以下是链接http://masonry.desandro.com/demos/images.html

代码:

var $container = $('#container');

$container.imagesLoaded( function(){
  $container.masonry({
    itemSelector : '.box'
  });
});

答案 4 :(得分:1)

我最近遇到过这个问题。为了解决这个问题,我使用了img width和height属性。问题解决了。

答案 5 :(得分:0)

另一种方法,如果你知道图像高度,就是在加载Masonry之前在CSS中分配它们,那么布局比等待图像更快。例如,如果所有图像的大小相同,则此方法有效。然后,您的网站仍会在移动等慢速连接上快速加载。

我在这里发布了一些替代方法的脚本:
http://instancia.net/loading-jquery-masonry-on-mobile/

如果您使用此脚本,请编辑与您的数字相匹配的数字。

答案 6 :(得分:0)

在Firefox和我的iPad 2上,砌体工作正常,但在OS X上的chrome和safari中,元素在页面加载时重叠/堆叠,直到窗口调整大小甚至发生。在挖掘了jquery.masonry.js的代码之后,我发现我可以在创建砌体后立即触发resize(),以便所有元素都能正确重新排列。现在一切正常。

jQuery(document).ready(function(){
var $container = $('#container');
$container.imagesLoaded(function(){
    $container.masonry({
    itemsSelector: '.thumbnail',
    isFitWidth: true
    }).resize();
}); 
})

所有其他解决方案:(窗口).load,设置宽度&amp; CSS和img属性等的高度,对我来说不起作用。

答案 7 :(得分:0)

正如Jennifer所说,这些浏览器需要高度才能正确显示。我使用php的getimagesize()函数来获取图像的高度和宽度。现在工作得很好。

答案 8 :(得分:0)

<script>
        var container = document.querySelector('#masonry');
        var msnry = new Masonry( container, {
            itemSelector: '.item',
            "columnWidth": 200,
        });
        $('.item img').load(function(){
                var msnry = new Masonry( container, {
                itemSelector: '.item',
                "columnWidth": 200,
            });
        })
</script>

答案 9 :(得分:0)

如果使用$(&#39; img&#39;)。load(function()F5(refesh)=&gt;错误

新方法:

&#13;
&#13;
$(window).on('load resize', function() {
  if ($('.masonry-wrap').length) {
    $('.masonry-wrap')
    .css('max-width', $(window).width());
  }
});
$(window).on('load', function() {
  if ($('.masonry-wrap').length) {
    setTimeout(function() {
      $('.masonry').masonry({
        columnWidth: 0,
        itemSelector: '.grid-item'
      });
    }, 1);
  }
});
&#13;
<div class="masonry-wrap">
  <div class="masonry">
    <div class="grid-item">...</div>
    <div class="grid-item">...</div>
    ....
  </div>
</div>
&#13;
&#13;
&#13;

答案 10 :(得分:0)

“load”事件将触发DOM中的每个图像,这是过度的。当DOM中的最后一个图像加载时,您需要更新砌体的布局。这是代码:

$(document).ready(function(){
    // init the masonry on document ready event;
    // at this point the images are not loaded so the layout will break UNLESS you set up the correct values for the "width" and "height" attributes of the img tags
    $('.content_photo').masonry();

    // to make sure the layout will not break apart we update the masonry layout just after the last image from the DOM was loaded
    var total_images = $('img').length;
    var counter = 1;
    $('img').load(function() {
        if(counter == total_images) {
            alert('the last image in the DOM was loaded. now we can update the masonry layout');
            $('.content_photo').masonry('layout');
        }
        counter++;
    });
});

答案 11 :(得分:0)

我遇到了如上所述的反向问题:首先在Mac OS X Safari中加载工作正常,但是使用所有新项目更改网格会导致它们全部堆叠在左上角。此外,等待准备好事件并设置CSS高度&amp;我们元素的宽度没有修复它。

在我们的网站上,我们有在砖石网格中显示的数据类别,并且一次只显示一个类别。用户可以随时切换类别并触发AJAX请求以加载新数据。在最新的Safari(9.1,10)和Chrome等浏览器中,我们可以在更改类别以交换所有新元素时执行此操作:

    // domData is HTML string from the server
    // IMJS is our global variable that we use for globals and lookups
    $("#divTemplateCategoryName").after(domData); // insert new HTML
    var elementsToAdd = $(".grid-item-template-info"); //select the elements
    IMJS.MasonryGrid.masonry('addItems', elementsToAdd); // tell masonry to add them
    IMJS.MasonryGrid.masonry('layout'); // tell masonry to layout again

但是,在某些版本的Safari中无法使用,我们不得不这样做:

    // domData is HTML string from the server
    // IMJS is our global variable that we use for globals and lookups
    IMJS.MasonryGrid.masonry('destroy'); // destroy the grid
    $("#divTemplateCategoryName").after(domData); // insert new HTML
    InitMasonry(); // re-do our entire masonry init

因为我没有时间追踪可能受此bug影响的每个浏览器版本,所以我为所有浏览器切换到后一种方法。