【问题标题】:Masonry JS Overlapping Items砌体 JS 重叠项目
【发布时间】:2013-09-21 20:36:57
【问题描述】:

我有一个很奇怪的问题:[Referral Link Removed]。第一行产品项目与第二行中的项目重叠。

砖石项目位于页脚上方的主页下方。如您所见,它与 Chrome 看起来不同。在 Firefox 中,它看起来不错。

这是它在我的 chrome 中的外观:http://clip2net.com/s/5LIRko

我的 jQuery 代码是:

jQuery(function($){
var $container = $('.woocommerce ul.products');
    $container.masonry({
          columnWidth:10, 
          gutterWidth: 15,
          itemSelector: '.product-category'
    });
});

是否有影响行输出的css规则?

【问题讨论】:

  • 只是好奇,你用砖石做什么?它们看起来都一样大。没有什么关于它的“砌体”。如果我在页面上禁用 Javascript 并刷新,网格布局看起来像预期的那样。
  • 是的,但我问的是为什么你甚至需要砖石。我看到了错误,但我看不出砌体为你解决了什么问题,而不是仅仅浮动你的元素。请参阅下面的答案。
  • 我使用了砖石,这样它的响应部分看起来不错。我只想在调整大小时为动画功能放置砌体。
  • 好的,很公平。然后在下面查看我对选项 #2 的回复,即jQuery(window).on('load'

标签: jquery css jquery-masonry


【解决方案1】:

$(window).on('load',function(){ });

$(window).on('load',function(){
//code
});

//use load event instead of document.ready starting of jquery

【讨论】:

    【解决方案2】:

    窗口加载后加载砖石对我有用。

    jQuery(window).on('load', function(){
        //masonry init and options
        // .. codes
    }
    

    【讨论】:

      【解决方案3】:

      使用 CSS 为图片添加最小高度。这将解决问题。

      .image{ min-height: 250px; }
      

      【讨论】:

        【解决方案4】:

        您需要在加载完所有图像后启动 Masonry。 如果您使用的是 jQuery,请尝试:

        var $container = $('#container');
        // initialize Masonry after all images have loaded  
        $container.imagesLoaded( function() {
          $container.masonry();
        });
        

        有关其他选项,请参阅 Masonry 文档 - http://masonry.desandro.com/layout.html#imagesloaded

        【讨论】:

          【解决方案5】:

          使用 ImagesLoaded 库,专门用于在加载每个图像时重新组织块。

          您可以从以下网址下载:

          https://github.com/desandro/imagesloaded

          【讨论】:

          • 您能否添加更多关于如何使用它的详细信息。
          【解决方案6】:

          我已经用 settimeout 函数解决了这个问题。通过允许一秒钟左右的时间(取决于正在下载的图像的 # 和文件大小),您可以先下载图像,然后再应用砌体。

                          $(document).ready(function(){                                                                                                                   
                          setTimeout(function() { masonry_go();masonry_go2();}, 1000);                                                                    
                      });     
                      $(window).resize(function() 
                      {
                          // jQuery
                          $('.grid').masonry( 'destroy')
                          $('.grid2').masonry( 'destroy')                 
                          setTimeout(function() { masonry_go();masonry_go2();}, 1000);                                                                    
                      });                 
                      function masonry_go(){
                          $('.grid').masonry({
                            // options
                            itemSelector: '.grid-item',
                            columnWidth: 300
                          });                         
                      }       
                      function masonry_go2(){
                          $('.grid2').masonry({
                            // options
                            itemSelector: '.grid-item2',
                            gutter: 15,
                            columnWidth: 200
                          });                         
                      }       
          

          【讨论】:

          • 感谢您的解决方案在将 document.ready 替换为 jQuery(window).on('load', function(){
          • masonry('destroy') 是第二次加载前的有效解决方案。
          【解决方案7】:

          问题在于您的图像。在调用 masonry 时,您的图像尚未加载。所以它假设你的元素的高度没有考虑到图像的高度。

          如果您在图像已经缓存后刷新屏幕,您会看到它正确加载。如果您随后清除缓存并刷新,您会看到它们再次重叠。

          四个五个选项:

          • 等到图片加载完成(例如,有插件可以等到某个 div 内的所有图片都加载完毕)
          • 等待加载事件而不是就绪事件。不要使用jQuery(function($){,而是使用jQuery(window).on('load', function(){ var $ = jQuery;,您会看到结果。
          • 图像加载后重新应用砌体(不喜欢这个......你会看到闪烁)
          • 我的最爱,不要在这里使用砖石!禁用页面上的 JS 并查看布局。这就是你想要的。所有 div 的高度和宽度都是均匀的。这里没有真正的理由使用砖石。只需浮动您的元素,让它们自然地显示在网格中。
          • 编辑:另一种选择。指定 div 的高度,以便高度不依赖于它正在加载的图像。

          【讨论】:

          • 我认为这就是问题所在。因为有的时候,当我重新加载时,它加载成功。
          • 如何正确书写?我的javascript不太好。
          • 我添加了第五个选项。至于怎么写,我已经说过了。将 jQuery(function($){ 那行替换为 jQuery(window).on('load', function($){ 那一行环绕你的 masonry 调用(你在 Q 中发布的代码)
          • 应用第二个选项时出现错误,提示:“Uncaught TypeError: object is not a function。”
          • 太棒了!这完美地工作:“等待加载事件而不是就绪事件。而不是使用 jQuery(function($){ 使用 jQuery(window).on('load', function(){ var $ = jQuery; 而你'会看到结果的。”
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多