当前位置: 首页 > news >正文

实现图片懒加载

实现图片懒加载

图片懒加载就是当页面需要展示较多图片时,首先只加载显示在当前屏幕位置的图片,在页面向下滚动时,再加载其他需要显示在当前屏幕位置的图片,这样可以防止一次性对服务器发送大量请求,并可以在用户不需要完整浏览页面的情况下减少服务器资源消耗。

实例

<!DOCTYPE html>
<html>
<head><title>图片懒加载</title><style type="text/css">.imgUnitContainer{height: 300px; /* 固定一个高度 */width: 500px; /* 固定一个宽度 */overflow: hidden; /* 图片超出容器则隐藏 */border: 1px solid #eee; /* 边框 */margin: 10px; /* 外边距 */display: flex; /* 弹性布局 此处主要目的为使图片居中 */align-items: center; /* 垂直居中 */justify-content: center; /* 水平居中 */}</style>
</head>
<body><div id="container"></div> <!-- 图片容器 -->
</body><script type="text/javascript">var imgNodeList = []; // 所有懒加载图片的引用(function(){ // 初始化操作var imgUrlArr = [ // 所有需要加载的图片链接"http://www.sdust.edu.cn/__local/9/7A/B1/F29B84DEF72DD329997E8172ABA_664BA3EF_32466.jpg","http://www.sdust.edu.cn/__local/B/F3/E4/693AB931C9FFB84646970D53BFE_C506394A_4282CA.jpg","http://www.sdust.edu.cn/__local/F/7A/AA/E1459849AA8AB0C89854A41BD41_BF3BD857_BC0D8.jpg","http://www.sdust.edu.cn/__local/1/95/CB/EDC1450B8FD1B8A25FAAC726AA4_A36D4253_16C91.jpg","http://www.sdust.edu.cn/__local/9/7A/B1/F29B84DEF72DD329997E8172ABA_664BA3EF_32466.jpg","http://www.sdust.edu.cn/__local/B/F3/E4/693AB931C9FFB84646970D53BFE_C506394A_4282CA.jpg","http://www.sdust.edu.cn/__local/F/7A/AA/E1459849AA8AB0C89854A41BD41_BF3BD857_BC0D8.jpg","http://www.sdust.edu.cn/__local/1/95/CB/EDC1450B8FD1B8A25FAAC726AA4_A36D4253_16C91.jpg","http://www.sdust.edu.cn/__local/9/7A/B1/F29B84DEF72DD329997E8172ABA_664BA3EF_32466.jpg","http://www.sdust.edu.cn/__local/B/F3/E4/693AB931C9FFB84646970D53BFE_C506394A_4282CA.jpg","http://www.sdust.edu.cn/__local/F/7A/AA/E1459849AA8AB0C89854A41BD41_BF3BD857_BC0D8.jpg","http://www.sdust.edu.cn/__local/1/95/CB/EDC1450B8FD1B8A25FAAC726AA4_A36D4253_16C91.jpg",];var innerContainer = document.createElement("div"); // 最小化操作DOM 全部图片首先加载到此节点 最后一并挂载到图片容器imgUrlArr.forEach(v => { // 遍历图片的引用var imgUnitContainer = document.createElement("div"); // 图片外层div 主要为统一图片尺寸imgUnitContainer.className = "imgUnitContainer"; // 设置classvar img = new Image(); // new一个img节点img.src = "https://cdn.jsdelivr.net/gh/sentsin/layui@15d7241/dist/css/modules/layer/default/loading-2.gif"; // 显示loadingimg.setAttribute("data-src", v); // 存储真实需要加载的urlimg.setAttribute("loaded","no"); // 存储图片是否加载完成imgNodeList.push(img); // 将节点引用加入数组imgUnitContainer.appendChild(img); // 将img加入外层divinnerContainer.appendChild(imgUnitContainer); // 将外层div加入内部容器})document.getElementById("container").appendChild(innerContainer); // 一次性加入文档container节点})();function lazyLoad(){var height = window.innerHeight; // 可视区域高度var scrollTop = document.documentElement.scrollTop || document.body.scrollTop; //滚动区域高度imgNodeList.forEach(v => { // 遍历if(v.getAttribute("loaded") === "yes") return ; // 如果已经加载完成 便不再重复加载if((height + scrollTop) > v.offsetTop){ // 如果已经出现在屏幕内v.setAttribute("loaded", "yes"); // 首先设置已加载避免重复加载var tmp = new Image(); // new一个缓存img节点 主要是为了实现隐式加载tmp.src = v.getAttribute("data-src"); // 设置缓存节点的src 使其开始加载tmp.onload = function(){ // 缓存img加载完成事件v.src = v.getAttribute("data-src"); // 缓存img加载完成后将真实url赋值文档显示的图片节点 浏览器会直接读取缓存}}})}window.onscroll = function(){ // 浏览器滚动事件lazyLoad();}window.onload = function(){ // 文档加载完成事件lazyLoad();}</script>
</html>

每日一题

https://github.com/WindrunnerMax/EveryDay

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 使用Cce Cash混币器进行安全的ETH-USDT跨链兑换
  • 【办公软件】Office 2019以上版本PPT 做平滑切换
  • pytest的安装和介绍和 Exit Code 含义
  • IOS-05 Swift循环控制语句
  • 修复SteamUI.dll加载失败的指南,快速修复failed to load steamui.dll
  • 【Android】Fragment的添加
  • 【Golang 面试 - 基础题】每日 5 题(五)
  • opencascade AIS_ManipulatorOwner AIS_MediaPlayer源码学习
  • 使用 Docker Compose 部署 RabbitMQ 的一些经验与踩坑记录
  • Python 消费Kafka手动提交 批量存入Elasticsearch
  • 微信小程序-使用Component方法代替Page方法构造页面
  • Profinet转EtherNet/IP协议转化网关(功能与配置)
  • DT浏览器使用教程之如何写书法笔记
  • mysql特殊字符、生僻字存储设置
  • idea-springboot后端所有@注释含义汇总-持续更新!
  • ES6指北【2】—— 箭头函数
  • AWS实战 - 利用IAM对S3做访问控制
  • CentOS7简单部署NFS
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • Java 内存分配及垃圾回收机制初探
  • k个最大的数及变种小结
  • MaxCompute访问TableStore(OTS) 数据
  • Node 版本管理
  • Python实现BT种子转化为磁力链接【实战】
  • vuex 笔记整理
  • 从0实现一个tiny react(三)生命周期
  • 从tcpdump抓包看TCP/IP协议
  • 高程读书笔记 第六章 面向对象程序设计
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 利用jquery编写加法运算验证码
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 判断客户端类型,Android,iOS,PC
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 前端知识点整理(待续)
  • 实现菜单下拉伸展折叠效果demo
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 小试R空间处理新库sf
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 在Docker Swarm上部署Apache Storm:第1部分
  • raise 与 raise ... from 的区别
  • UI设计初学者应该如何入门?
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​业务双活的数据切换思路设计(下)
  • #git 撤消对文件的更改
  • #include
  • #微信小程序(布局、渲染层基础知识)
  • (BFS)hdoj2377-Bus Pass
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (C#)一个最简单的链表类
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (附源码)php投票系统 毕业设计 121500
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐