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 相关文章推荐
js字符编码函数区别分析
Jun 05 Javascript
Jquery 插件学习实例1 插件制作说明与tableUI优化
Apr 02 Javascript
js加强的经典分页实例
Mar 15 Javascript
jQuery实现hover合成事件的方法
Aug 06 Javascript
轻松掌握JavaScript中的Math object数学对象
May 26 Javascript
让编辑器支持word复制黏贴、截屏的js代码
Oct 17 Javascript
写jQuery插件时的注意点
Feb 20 Javascript
快速理解 JavaScript 中的 LHS 和 RHS 查询的用法
Aug 24 Javascript
JavaScript引用类型Date常见用法实例分析
Aug 08 Javascript
vue实现的仿淘宝购物车功能详解
Jan 27 Javascript
js获取本日、本周、本月的时间代码
Feb 01 Javascript
jQuery中event.target和this的区别详解
Aug 13 jQuery
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
解析php中var_dump,var_export,print_r三个函数的区别
2013/06/21 PHP
PHP同时连接多个mysql数据库示例代码
2014/03/17 PHP
PHP框架Laravel插件Pagination实现自定义分页
2020/04/22 PHP
PHP attributes()函数讲解
2019/02/03 PHP
js Flash插入函数免激活代码
2009/03/31 Javascript
自写的一个jQuery圆角插件
2010/10/26 Javascript
基于jquery的关于动态创建DOM元素的问题
2010/12/24 Javascript
Javascript实现视频轮播在pc端与移动端均可
2013/09/29 Javascript
js判断字符长度以及中英文数字等
2013/12/31 Javascript
使用jquery实现以post打开新窗口
2014/03/19 Javascript
自写的jQuery异步加载数据添加事件
2014/05/15 Javascript
jquery 取子节点及当前节点属性值
2014/07/25 Javascript
jQuery html()方法使用不了无法显示内容的问题
2014/08/06 Javascript
使用Nodejs开发微信公众号后台服务实例
2014/09/03 NodeJs
jquery+json实现动态商品内容展示的方法
2016/01/14 Javascript
jQuery点击其他地方时菜单消失的实现方法
2016/04/22 Javascript
JS控制层作圆周运动的方法
2016/06/20 Javascript
教你一步步用jQyery实现轮播器
2016/12/18 Javascript
彻底学会Angular.js中的transclusion
2017/03/12 Javascript
vue中eventbus被多次触发以及踩过的坑
2017/12/02 Javascript
nodejs制作小爬虫功能示例
2020/02/24 NodeJs
在Python中使用PIL模块对图片进行高斯模糊处理的教程
2015/05/05 Python
Python基于checksum计算文件是否相同的方法
2015/07/09 Python
Python实现在线音乐播放器
2017/03/03 Python
python pandas 对series和dataframe的重置索引reindex方法
2018/06/07 Python
使用 Python 处理 JSON 格式的数据
2019/07/22 Python
python类共享变量操作
2020/09/03 Python
西雅图电动自行车公司:Rad Power Bikes
2020/02/02 全球购物
医学检验专业个人求职信范文
2013/12/04 职场文书
新领导上任欢迎词
2014/01/13 职场文书
幼儿园运动会加油词
2014/02/14 职场文书
企业党员个人自我评价
2014/09/20 职场文书
2014年军人思想汇报范文
2014/10/12 职场文书
房屋产权共有协议书范本
2014/11/03 职场文书
门店店长岗位职责
2015/04/14 职场文书
Pytorch数据读取之Dataset和DataLoader知识总结
2021/05/23 Python