【发布时间】:2015-12-01 19:05:40
【问题描述】:
经过一番谷歌搜索和一些脑力劳动,我想出了这个小脚本来延迟加载我的图像:
function elementInViewport(el) {
var rect = el.getBoundingClientRect();
return (rect.top >= 0 && rect.left >= 0 && rect.top <= (window.innerHeight || document.documentElement.clientHeight));
}
function lazyLoad() {
var els, backgroundImage;
els = document.getElementsByClassName('lazyLoad');
for (var i = 0; i < els.length; i++) {
backgroundImage = els[i].dataset.bgimg;
if (elementInViewport(els[i])) {
els[i].style.backgroundImage = 'url('+backgroundImage+')';
};
};
};
lazyLoad();
window.addEventListener('scroll',lazyLoad);
还有html:
<div class="lazyLoad" data-bgimg="<?php echo $image_url; ?>"></div>
我想知道这是否真的有效,因为它似乎确实有效:背景图像样式仅在元素出现在视图中时才正确应用,我通过开发工具进行了检查,但它执行得如此之快以至于实际上似乎图像已经加载到某个地方,可能是因为 data-bgimg 在内存中?我还 ctrl+shift+r 重新加载了页面,以便不使用缓存但结果相同:太快而不真实。
【问题讨论】:
-
请注意,onscroll 每秒可以触发数百次,并且您甚至会重置已加载的图像...
-
你是在本地主机上测试吗?如果你这样做,那么加载将非常快。首先在开发工具打开时禁用缓存(有一个选项)。其次尝试使用网络节流来降低加载速度。
-
感谢@dandavis,没想到。稍后我将添加一个条件来检查元素是否已经应用了 bg img。如果我理解你对 onscroll 事件的意思,我总是有点害怕使用它,原因与你写的一样,但是客户要求延迟加载,我想尽量减少插件和库的使用
-
不知道网络限制,谢谢@Cristy!我正在实时服务器中进行测试,但我刚刚意识到问题可能在于图像始终相同......出于测试目的
-
至于@dandavis 提出的观点,请考虑对 onscroll 事件进行去抖动或节流。 davidwalsh.name/javascript-debounce-function