Masonry + LazyLoad - 图像叠加

Masonry + LazyLoad - Images Overlaying

我正在使用 base Mansory layout 构建基本图像网格。必须从数据库加载成百上千张图像以期构建无限滚动页面,我不希望用户必须下载所有图像,这主要是因为加载时间,但也因为所有浪费的流量将意味着(用户不应该加载图像 #500,除非他向下滚动直到到达它)。 为了做到这一点,我尝试使用 jQuery LazyLoad 插件.

这是我填充 Masonry 图像网格的方式:

            <ul class="grid effect-3" id="grid">
            <?php
            for ($i = 0; $i < count($thumbArray); $i++) {
                if ($i < 9) {
                    echo '<li><img class="img-grid" alt="' . $descArray[$i] . '" data-fullsize="' . $imgArray[$i] . '" src="' . $thumbArray[$i] . '"></li>';
                } else {
                    echo '<li><img class="img-grid lazy" alt="' . $descArray[$i] . '" data-fullsize="' . $imgArray[$i] . '" data-original="' . $thumbArray[$i] . '"></li>';
                }

            }
            ?>
        </ul>

基本上预先加载前 9 个图像,然后将 'lazy' CSS class 添加到其他图像,并将 'src' 属性替换为 Lazyload 的 'data-original'.

(您可能会注意到 'alt' 和 'data-fullsize' 属性,我将它们用于灯箱系统,出于这个问题的目的您可以忽略它们。

在 index.php 脚本的末尾我有:

<script src="js/jquery.lazyload.js"></script>
<script>$("img.lazy").lazyload();</script>

正在导入插件并将其应用到带有 class .lazy.

的 img 标签

问题在于,我假设由于不知道图像的高度,Masonry 网格系统覆盖了通过 Lazyload 进程加载的任何图像:

如您所见,在第 9 个图像之后(当 lazyload 规范开始时),图像开始相互叠加。我想这是因为图像位置是通过 Javascript 动态计算的,因为它们都设置了 position:absolute 和 top 和 left 属性,但我不确定。

查看 Masonry 网站,第一个 FAQ item 与此相关并建议使用 imagesLoaded,我尝试这样做但没有成功。

最重要的是,几天来我一直在努力寻找解决方案,现在阅读了类似的帖子并实施了多个解决方案,但无济于事。 Masonry 网格系统是为我的目的而指定的,因为图像大小可能会有所不同(例如,我不希望在每个垂直图像之后都有间隙),但我真的发现将它与 Lazyload 结合起来很麻烦,没有它用户只会体验加载时间比必要的多得多,服务器将承受不必要的压力。

请问图片不重叠的解决办法?提前致谢 (y)

在您的图片完全加载之前,您的砌体正在加载。 运行 你的 .lazyload 里面

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

大多数砖石插件都包含一个重新布局方法,您可以在添加新项目后立即调用该方法以强制完全重新布局项目。在您的情况下,您只需要调用 .masonry('layout');其中 "layout" 是您的砌体实例的名称。在将项目添加到网格后,您需要立即调用它。这应该为您调整所有图像间距。此外,您还需要使用 addItems() 方法在滚动时添加项目。如果您尝试手动添加它们,它们将不会添加到 Masonry 数组中,您将无法对其应用布局。

您可以使用 imagesLoaded 插件,可在此处找到:http://imagesloaded.desandro.com/ 然后每次加载图像时,您都可以刷新网格的布局,它看起来像这样:

// init Masonry
var $grid = $('.grid').masonry({
  // options...
});

// layout Masonry after each image loads
$grid.imagesLoaded().progress( function() {
  $grid.masonry('layout');
});

每次您向网格添加更多项目时,可能通过 AJAX,您将需要执行布局砌体的行

如果你对此有困难,你可以使用一个现成的插件,比如这个:https://codecanyon.net/item/media-boxes-portfolio-responsive-grid/5683020 使用这个插件你可以很容易地指定项目之间的 space,每个分辨率的列数等等,它还具有添加过滤器、排序和搜索字段的能力

您可以通过 2 个步骤使用 images-lazy-load 库:

  1. 在head标签中添加Js库: https://cdn.panberes.ir/scripts/images-lazy-load.min.js

  2. 添加所有带有data-lazy-src的img标签资源(src属性)

<a href="http://www.partonet.ir">
<img class="footer-logo" width="200" height="73" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-lazy-src="http://www.partonet.ir/images/1397/09/21/sabeghe.jpg" alt="office automation" title="office automation">
</a>

参见示例:https://www.panberes.ir