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


Posted in Javascript onJanuary 06, 2018

目标

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

思路

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

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实现非首屏图片延迟加载的示例

以上这篇JS实现非首屏图片延迟加载的示例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
入门基础学习 ExtJS笔记(一)
Nov 11 Javascript
jQuery EasyUI API 中文文档 - Calendar日历使用
Oct 19 Javascript
js实现连个数字相加而不是拼接的方法
Feb 23 Javascript
JS父页面与子页面相互传值方法
Mar 05 Javascript
JavaScript 实现完美兼容多浏览器的复制功能代码
Apr 28 Javascript
JS建造者模式基本用法实例分析
Jun 30 Javascript
jQuery on()绑定动态元素出现的问题小结
Feb 19 Javascript
详解Vue路由History mode模式中页面无法渲染的原因及解决
Sep 28 Javascript
Node.js的进程管理的深入理解
Jan 09 Javascript
React 全自动数据表格组件——BodeGrid的实现思路
Jun 12 Javascript
JS中数据结构与算法---排序算法(Sort Algorithm)实例详解
Jun 17 Javascript
javascript实现左右缓动动画函数
Nov 25 Javascript
jQuery中库的引用方法
Jan 06 #jQuery
基于JavaScript中标识符的命名规则介绍
Jan 06 #Javascript
js生成word中图片处理方法
Jan 06 #Javascript
详解webpack中的hash、chunkhash、contenthash区别
Jan 05 #Javascript
浅谈webpack对样式的处理
Jan 05 #Javascript
js实现HTML中Select二级联动的实例
Jan 05 #Javascript
详解tween.js 中文使用指南
Jan 05 #Javascript
You might like
一个程序下载的管理程序(四)
2006/10/09 PHP
php检查页面是否被百度收录
2015/10/28 PHP
浅谈socket同步和异步、阻塞和非阻塞、I/O模型
2016/12/15 PHP
Laravel框架实现的使用smtp发送邮件功能示例
2019/03/12 PHP
thinkphp框架使用JWTtoken的方法详解
2019/10/10 PHP
javascript事件模型代码
2007/07/01 Javascript
js类中获取外部函数名的方法与代码
2007/09/12 Javascript
jQuery照片伸缩效果不影响其他元素的布局
2014/05/09 Javascript
js 自带的sort() 方法全面了解
2016/08/16 Javascript
jQuery Dialog 取消右上角删除按钮事件
2016/09/07 Javascript
JS前向后瞻正则表达式定义与用法示例
2016/12/27 Javascript
angular中实现控制器之间传递参数的方式
2017/04/24 Javascript
JavaScript无操作后屏保功能的实现方法
2017/07/04 Javascript
js 事件的传播机制(实例讲解)
2017/07/20 Javascript
JQuery判断正整数整理小结
2017/08/21 jQuery
基于es6三点运算符的使用方法(实例讲解)
2017/10/12 Javascript
JS实现去除数组中重复json的方法示例
2017/12/21 Javascript
详解webpack babel的配置
2018/01/09 Javascript
使用puppeteer爬取网站并抓出404无效链接
2018/12/20 Javascript
python 字典(dict)遍历的四种方法性能测试报告
2014/06/25 Python
Python的Flask开发框架简单上手笔记
2015/11/16 Python
Python自然语言处理之词干,词形与最大匹配算法代码详解
2017/11/16 Python
轻松实现TensorFlow微信跳一跳的AI
2018/01/05 Python
Python多线程thread及模块使用实例
2020/04/28 Python
如何使用Python自动生成报表并以邮件发送
2020/10/15 Python
澳大利亚电子产品购物网站:Dick Smith
2017/02/02 全球购物
利物浦足球俱乐部官方网上商店:Liverpool FC Official Store
2018/01/13 全球购物
香港莎莎官网Sasa.com:亚洲著名国际化妆品商城
2019/11/10 全球购物
MySQL面试题
2014/01/12 面试题
学生会副主席竞聘书
2014/03/31 职场文书
施工协议书范本
2014/04/22 职场文书
赔偿协议书怎么写
2015/01/28 职场文书
员工自我工作评价
2015/03/06 职场文书
2015年上半年物业工作总结
2015/03/30 职场文书
mysql备份策略的实现(全量备份+增量备份)
2021/07/07 MySQL
python语言中pandas字符串分割str.split()函数
2022/08/05 Python