【发布时间】:2017-06-25 09:20:45
【问题描述】:
我正在使用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 类,以及将 'src' 属性替换为 Lazyload 的 'data-original'。
(您可能会注意到“alt”和“data-fullsize”属性,我将它们用于灯箱系统,出于本问题的目的,您可以忽略它们)。
在 index.php 脚本的末尾我有:
<script src="js/jquery.lazyload.js"></script>
<script>$("img.lazy").lazyload();</script>
导入插件并将其应用于带有 .lazy 类的 img 标签。
问题在于,我假设由于不知道图像的高度,Masonry 网格系统会覆盖通过 Lazyload 进程加载的任何图像:
如您所见,在第 9 张图像之后(延迟加载规范开始时),图像开始相互叠加。我想这是因为图像位置是通过 Javascript 动态计算的,因为它们都设置了 position:absolute 和 top 和 left 属性,但我不确定。
查看Masonry网站,第一个FAQ item与此有关,并建议使用imagesLoaded,我尝试过但没有成功。
- 我已尝试通过 PHP 的 getimagesize() 计算图像的高度并将其设置为内联样式属性,但它在服务器上过于密集且加载时间过长。
- 我也尝试过在到达页面末尾时动态添加项目(通过 XHR 获取 db 项目将是一个简单的解决方案)但我没有成功 - 可能我需要为此使用 Masonry 的附加功能?
底线是,几天来我一直在尝试寻找解决方案,现在阅读了类似的线程并实施了多种解决方案,但无济于事。 Masonry 网格系统是出于我的目的而指示的,因为图像大小可能会有所不同(例如,我不希望在每个垂直图像之后都有间隙),但我真的发现将它与 Lazyload 结合起来很麻烦,没有它,用户只会体验超过必要的加载时间,服务器将承受不必要的压力。
请解决图像不重叠的问题?提前致谢(y)
【问题讨论】:
标签: javascript html css jquery-masonry masonry