【发布时间】:2014-06-18 11:21:36
【问题描述】:
我正在使用基于百分比的 CSS 网格系统。我有一个有 4 列的网格,每列占页面总宽度的 25%。我在每个“25% 单元格”中输出我的图像标签,如下所示:
<img src="foo.jpg" style="max-width:100%" />
随着浏览器调整大小,图像也会调整大小以填充每个 25% 单元格的 100%。浏览器选择一个高度,就好像我放了“height:auto”(省略时是隐含的)。
现在我想为此添加延迟加载功能。问题是在加载图像之前,它们在页面上的高度是未知的。浏览器必须下载图像并观察其纵横比,并为其计算高度。在此之前,所有图像的高度均为 1px。由于每张图片的高度为 1px,因此它们都被视为“在视口内”并立即加载。
目前我有一个概念证明,在输出 img 标签之前,我在服务器上计算图像的纵横比,并在数据属性中输出:
<img src="foo.jpg" style="max-width:100%" data-aspect="1.7742" />
然后,在“文档准备就绪”事件发生时,我循环遍历每个图像并在延迟加载之前设置一个固定的“高度”值(以像素为单位):
$('img').each(function() {
var img = $(this);
var width = img.width();
var ratio = img.data('aspectratio');
var height = width / ratio;
$(this).css('height', height+'px');
});
这似乎有效,因为它不再同时加载所有图像,而是仅在我滚动时加载图像。
但是,它似乎可能会导致新的问题,例如当用户调整浏览器大小时图像会被拉伸。当延迟加载完成后触发回调时,我必须将“高度”切换回“自动”。这将处理用户看到的图像 - 但是在调整浏览器大小时,折叠下方的图像仍然具有不正确的“高度”值。每次调整浏览器的大小时,我都必须迭代所有以前在折叠之下的图像,测量它们的更新宽度,读取它们的纵横比,并更新新的高度,然后重新触发延迟加载以处理现在高于折叠的任何图像折叠。如果我不这样做,由于这些图像的高度值错误,加载可能会过早或过晚触发。
我的问题是,除了我在这里描述的确切方法之外,还有其他方法可以延迟加载未知高度的图像,这会产生什么后果?除了编程很痛苦之外,我的方法有什么缺点吗?
【问题讨论】:
-
看起来你已经成功了。浏览器只有两种方法可以知道图像的尺寸:下载它,或者在 HTML 中指定它。
-
感谢您的保证。我还设想了某种方法,它会延迟加载前 4 个图像,然后阻塞直到它们完成,然后重新评估剩余图像的新位置。唯一的问题是阻塞会比没有延迟加载更慢。
-
好的,我刚刚意识到填充底部的技巧:thisisthat.co.uk/notebook/…andmag.se/2012/10/…
-
写下来作为你自己问题的答案。
-
你能把计算比例的代码放在服务器上吗?这是我找到的解决这个问题的最佳解决方案,但找不到如何做到这一点
标签: javascript jquery html css image