JS图片懒加载的优点及实现原理


Posted in Javascript onJanuary 10, 2020

这篇文章主要介绍了JS图片懒加载的优点及实现原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

图片懒加载优势:

增强用户体验

  • 优化代码
  • 减少http的请求
  • 减少服务器端压力
  • 服务器的按需加载

图片懒加载原理:

先将图片的src设置为同一张图片或者不设置,同时给img标签设置一个特殊属性,例如:data-src用于存放图片的真实预览地址;若图片未进入可视区域时,展示同一张图片或者直接不展示图片,此时就不会发生http请求,当图片进入可视区域时,将data-src上的值赋给src,此时再发送http请求。

关键:判断图片是否进入到可视区域(关键函数)

  •  页可见区域宽: document.body.clientWidth;
  •  网页可见区域高: document.body.clientHeight;
  •  网页可见区域宽: document.body.offsetWidth (包括边线的宽);
  •  网页可见区域高: document.body.offsetHeight (包括边线的宽);
  •  网页正文全文宽: document.body.scrollWidth;
  •  网页正文全文高: document.body.scrollHeight;
  •  网页被卷去的高: document.body.scrollTop;
  •  网页被卷去的左: document.body.scrollLeft;
  •  网页正文部分上: window.screenTop;
  •  网页正文部分左: window.screenLeft;
  •  屏幕分辨率的高: window.screen.height;
  •  屏幕分辨率的宽: window.screen.width;
  •  屏幕可用工作区高度: window.screen.availHeight;
  •  当前元素相对于其 offsetParent 元素的顶部的距离: HTMLElement.offsetTop;
  •  浏览器窗口的视口(viewport)高度(以像素为单位): window.innerHeight; (如果有水平滚动条,也包括滚动条高度)

代码实现

html部分

<div>
  <img src="./img/1.jpg" data-src="./img/1.jpg" alt="">
  <img src="./img/1.jpg" data-src="./img/2.jpg" alt="">
  <img src="./img/1.jpg" data-src="./img/3.jpg" alt="">
  <img src="./img/1.jpg" data-src="./img/4.jpg" alt="">
  <img src="./img/1.jpg" data-src="./img/5.jpg" alt="">
  <img src="./img/1.jpg" data-src="./img/6.jpg" alt="">
  <img src="./img/1.jpg" data-src="./img/7.jpg" alt="">
  <img src="./img/1.jpg" data-src="./img/8.jpg" alt="">
  <img src="./img/1.jpg" data-src="./img/9.jpg" alt="">
  <img src="./img/1.jpg" data-src="./img/10.jpg" alt="">
 </div>

js部分

window.onload = () => {
   // 获取某节点与浏览器顶部的距离
   function getTop(e) {
    if (!e) return
    return e.offsetTop
   }
   let imgs = document.getElementsByTagName('img')
   function lazyLoading(imgs) {
    // 可是区域高度
    let innerHeight = window.innerHeight;
    // 滚动区域高度
    let scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
    for (let i = 0; i < imgs.length; i++) {
     // 图片距离顶部的距离大于可视区域和滚动区域之和时加载
     if (scrollTop + innerHeight > getTop(imgs[i])) {
      imgs[i].src = imgs[i].getAttribute('data-src')
     }
    }
   }
   lazyLoading(imgs)
   window.onscroll = () => {
    lazyLoading(imgs)
   }
  }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
使用onbeforeunload属性后的副作用
Mar 08 Javascript
Knockout visible绑定使用方法
Nov 15 Javascript
Jquery通过JSON字符串创建JSON对象
Aug 24 Javascript
基于Jquery插件实现跨域异步上传文件功能
Apr 26 Javascript
简单实现轮播图效果的实例
Jul 15 Javascript
vuejs动态组件给子组件传递数据的方法详解
Sep 09 Javascript
jQuery progressbar通过Ajax请求实现后台进度实时功能
Oct 11 Javascript
React.js中常用的ES6写法总结(推荐)
May 09 Javascript
JS原型继承四步曲及原型继承图一览
Nov 28 Javascript
微信小程序发送短信验证码完整实例
Jan 07 Javascript
ES6中的迭代器、Generator函数及Generator函数的异步操作方法
May 12 Javascript
微信小程序语音同步智能识别的实现案例代码解析
May 29 Javascript
jQuery操作元素的内容和样式完整实例分析
Jan 10 #jQuery
jquery选择器和属性对象的操作实例分析
Jan 10 #jQuery
js实现旋转木马轮播图效果
Jan 10 #Javascript
微信小程序新闻网站详情页实例代码
Jan 10 #Javascript
如何在Node和浏览器控制台中打印彩色文字
Jan 09 #Javascript
JavaScript复制变量三种方法实例详解
Jan 09 #Javascript
js实现左右轮播图
Jan 09 #Javascript
You might like
php在线生成ico文件的代码
2007/10/09 PHP
php 随机数的产生、页面跳转、件读写、文件重命名、switch语句
2009/08/07 PHP
php解析html类库simple_html_dom(详细介绍)
2013/07/05 PHP
php中使用base HTTP验证的方法
2015/04/20 PHP
PHP的PDO操作简单示例
2016/03/30 PHP
php-fpm开启状态统计的方法详解
2017/06/23 PHP
PHP标准库(PHP SPL)详解
2019/03/16 PHP
js 完美图片新闻轮转效果,腾讯大粤网首页图片轮转改造而来
2011/11/21 Javascript
Javascript封装DOMContentLoaded事件实例
2014/06/12 Javascript
jquery JSON的解析方式示例介绍
2014/07/27 Javascript
JavaScript原生xmlHttp与jquery的ajax方法json数据格式实例
2015/12/04 Javascript
在web中js实现类似excel的表格控件
2016/09/01 Javascript
Windows系统下安装Node.js的步骤图文详解
2016/11/15 Javascript
基于vue2.0+vuex+localStorage开发的本地记事本示例
2017/02/28 Javascript
Bootstrap 树控件使用经验分享(图文解说)
2017/11/06 Javascript
JavaScript作用域、闭包、对象与原型链概念及用法实例总结
2018/08/20 Javascript
Vue3 的响应式和以前有什么区别,Proxy 无敌?
2020/05/20 Javascript
Django实现图片文字同时提交的方法
2015/05/26 Python
Python根据当前日期取去年同星期日期
2019/04/14 Python
python os.fork() 循环输出方法
2019/08/08 Python
python super的使用方法及实例详解
2019/09/25 Python
使用Python刷淘宝喵币(低阶入门版)
2019/10/30 Python
基于梯度爆炸的解决方法:clip gradient
2020/02/04 Python
python实现井字棋小游戏
2020/03/04 Python
Python基于Tkinter编写crc校验工具
2020/05/06 Python
利用Pycharm + Django搭建一个简单Python Web项目的步骤
2020/10/22 Python
Html5剪切板功能的实现代码
2018/06/29 HTML / CSS
Sam’s Club山姆会员商店:沃尔玛旗下高端会员制商店
2017/01/16 全球购物
Booking.com德国:预订最好的酒店和住宿
2020/02/16 全球购物
巴西最大的玩具连锁店:Ri Happy
2020/06/17 全球购物
安全生产管理责任书
2014/04/16 职场文书
计算机专业求职信
2014/06/02 职场文书
社区矫正工作方案
2014/06/04 职场文书
安全施工责任书
2014/08/25 职场文书
Nginx实现负载均衡的项目实践
2022/03/18 Servers
python使用pycharm安装pyqt5以及相关配置
2022/04/22 Python