JS实现非首屏图片延迟加载的示例

作者:Shapeying 时间:2024-04-23 09:27:49 

目标

减少资源加载可以明显的优化页面加载的速度,所以可以减少页面载入时立即下载的图片的数量,以提高页面加载速度,其他的图片在需要的时候再进行加载。

思路

想要实现以上的目标,有几个地方需要思考。

1、如何判断哪些图片需要立即加载,哪些可以晚些再加载?

2、如何控制图片在指定的时候加载?

对于第一个问题,页面打开就会被用户看到的图片肯定需要立即加载,其他的可以延后。即在视窗中的图片需要立即加载。那么如何判断图片是否在视窗内呢?getBoundingClientRect可以返回元素的大小及其相对于视口的位置(详细说明)

JS实现非首屏图片延迟加载的示例

可以通过图中top和right的值判断图片是否在视窗中。

对于第二个问题,先不给img指定src,而是将图片链接地址存放再元素的data-src属性(自定义)中,需要加载的时候再赋值给src,才会开始下载图片。

实现

思路有了,我们开始实现。用以下HTML进行测试



<div class="container">
<h1>图片懒加载</h1>
<p>测试性配文,测试图片懒加载</p>
<p>测试性配文,测试图片懒加载</p>
<p>测试性配文,测试图片懒加载</p>
<p>测试性配文,测试图片懒加载</p>
<p>测试性配文,测试图片懒加载</p>
<p>测试性配文,测试图片懒加载</p>
<p>测试性配文,测试图片懒加载</p>
<p>测试性配文,测试图片懒加载</p>
<img src="" alt="" class="lazy-img" data-src="http://c.hiphotos.baidu.com/zhidao/pic/item/1f178a82b9014a909461e9baa1773912b31bee5e.jpg">
<p>测试性配文,测试图片懒加载</p>
<p>测试性配文,测试图片懒加载</p>
<p>测试性配文,测试图片懒加载</p>
<p>测试性配文,测试图片懒加载</p>
<p>测试性配文,测试图片懒加载</p>
<p>测试性配文,测试图片懒加载</p>
<p>测试性配文,测试图片懒加载</p>
<p>测试性配文,测试图片懒加载</p>
<img src="" alt="" class="lazy-img" data-src="http://img2.niutuku.com/desk/1208/1718/ntk-1718-66531.jpg">
<p>测试性配文,测试图片懒加载</p>
<p>测试性配文,测试图片懒加载</p>
<p>测试性配文,测试图片懒加载</p>
<p>测试性配文,测试图片懒加载</p>
<p>测试性配文,测试图片懒加载</p>
<p>测试性配文,测试图片懒加载</p>
<p>测试性配文,测试图片懒加载</p>
<p>测试性配文,测试图片懒加载</p>
<img src="" alt="" class="lazy-img" data-src="http://2t.5068.com/uploads/allimg/151105/48-151105112944-51.jpg">
<p>测试性配文,测试图片懒加载</p>
<p>测试性配文,测试图片懒加载</p>
<p>测试性配文,测试图片懒加载</p>
<p>测试性配文,测试图片懒加载</p>
<p>测试性配文,测试图片懒加载</p>
<p>测试性配文,测试图片懒加载</p>
<p>测试性配文,测试图片懒加载</p>
<p>测试性配文,测试图片懒加载</p>
<img src="" alt="" class="lazy-img" data-src="http://img2.niutuku.com/desk/anime/4654/4654-4708.jpg">
<p>测试性配文,测试图片懒加载</p>
<p>测试性配文,测试图片懒加载</p>
<p>测试性配文,测试图片懒加载</p>
<p>测试性配文,测试图片懒加载</p>
<p>测试性配文,测试图片懒加载</p>
<p>测试性配文,测试图片懒加载</p>
<p>测试性配文,测试图片懒加载</p>
<p>测试性配文,测试图片懒加载</p>
<img src="" alt="" class="lazy-img" data-src="http://img2.niutuku.com/desk/1208/1721/ntk-1721-66572.jpg">
<p>测试性配文,测试图片懒加载</p>
<p>测试性配文,测试图片懒加载</p>
<p>测试性配文,测试图片懒加载</p>
<p>测试性配文,测试图片懒加载</p>
<p>测试性配文,测试图片懒加载</p>
<p>测试性配文,测试图片懒加载</p>
<p>测试性配文,测试图片懒加载</p>
<p>测试性配文,测试图片懒加载</p>

</div>

html中链接都来自百度图片,可在network中观察是否加载,这里忽略样式。按照之前的思路,有以下代码


//所有的图片
var imgs = document.querySelectorAll('.lazy-img');
//首屏图片加载
lazyLoad(imgs)
//剩余图片加载---监听滚动事件
window.addEventListener('scroll',function(){
//滚动事件触发太频繁了,所以加上节流
throttle(lazyLoad(imgs),200,500)
})
}

下面就是如何实现lazyLoad


function lazyLoad(imgs,offset){
offset = offset || 100;
if (!imgs || imgs.length < 1) {
console.log('imgs为空');
return ;
}
[].slice.call(imgs).forEach(function(element,index){
//元素的DomRect
var rect = element.getBoundingClientRect()
//出现在视窗中
if (rect.top <= window.innerHeight + offset && rect.right > 0) {
element.setAttribute('src',element.getAttribute('data-src'))
}
})
}

通过window.innerHeight获取到视窗的高度,当元素距离视窗上边沿为offset时,加载图片;其中offset为指定的偏移距离。

节流函数如下


function throttle (fn, delay, atleast) {
let timer = null
let startTime = new Date()

return function () {
let context = this
let args = arguments
let curTime = new Date()

clearTimeout(timer)
if (curTime - startTime >= atleast) {
fn.apply(context, args) // apply 指定函数指向的 上下文(this) 和 参数列表
startTime = curTime
} else {
timer = setTimeout(function () {
fn.apply(context, args)
startTime = curTime
}, delay)
}
}
}

效果

页面载入完成,只加载了一张图片

JS实现非首屏图片延迟加载的示例

向下滚动到指定位置,才会依次加载后续图片

JS实现非首屏图片延迟加载的示例

来源:https://www.cnblogs.com/shapeY/archive/2018/01/05/8205694.html

标签:JS,非首屏,图片,延迟,加载
0
投稿

猜你喜欢

  • Python列表元素删除和remove()方法详解

    2023-04-07 08:48:54
  • 微信公众平台实现获取用户OpenID的方法

    2023-11-17 05:55:56
  • 一篇文章讲解清楚MySQL索引

    2024-01-28 11:59:24
  • Python import与from import使用及区别介绍

    2022-05-17 12:09:19
  • 《色彩解答》系列之二 色彩比例

    2008-02-17 14:38:00
  • go语言K8S 的 informer机制浅析

    2024-05-13 10:44:51
  • 解压版MYSQL中文乱码问题解决方案

    2024-01-21 12:40:12
  • vue更多筛选项小组件使用详解

    2023-07-02 17:06:01
  • python re正则表达式模块(Regular Expression)

    2021-01-26 20:22:26
  • OpenCV4.1.0+VS2017环境配置的方法步骤

    2022-11-21 18:22:38
  • Python常见MongoDB数据库操作实例总结

    2023-07-08 08:48:34
  • 模仿IE自动完成功能

    2010-03-18 15:51:00
  • python去除字符串中空格的6种常用方法

    2023-09-25 12:36:53
  • MySQL binlog_ignore_db 参数的具体使用

    2024-01-20 12:32:59
  • mysql外键的三种关系实例详解

    2024-01-24 18:27:39
  • 键盘扫描码[比较完整]

    2022-09-26 20:20:48
  • 适宜做简单搜索的MySQL数据库全文索引

    2009-01-04 13:11:00
  • vue递归获取父元素的元素实例

    2024-05-05 09:24:34
  • 通过python爬虫赚钱的方法

    2023-04-27 11:48:17
  • python爬虫如何解决图片验证码

    2021-04-27 11:58:57
  • asp之家 网络编程 m.aspxhome.com