前端图片渲染性能优化与实践 — 图片懒加载
前言
对于图片量比较大的点上首页APP等,在打开商品展示页面的时候需要再加大量图片,在这种场景下如果直接全量加载,必然会造成页面性能消耗过大,白屏或者卡顿,用户体验非常糟糕,用户真的需要我们显示所有图片一起展示吗?其实并不是,用户看到的只是浏览器可视区域的内容。所以从这个情况我们可以做一些优化,只显示用户可视区域内的图片,当用户触发滚动的瞬间再去请求显示给用户
图片懒加载的实现:
给所有需要展示的 img 标签添加自定义属性: data-src ,同时不要设置 src 属性,data-src的值为图片url。
当页面加载完后,我们需要获取所有需要懒加载的图片的元素集合,判断是否在可视区域,如果是在可视区域的话,再重新设置元素的src属性值为真正图片的地址。
可视化区域的判断:是通过获取元素的getBoundingClientRect属性的top值和页面的clientHeight进行对比,如果top值小于clientHeight,则说明元素出现在可视区域之内。
当用户滚动窗口的时候,此时应该通过每个元素的BoundingClientRect属性来判断元素是否出现在可视区域内,如果在可视区域内,就渲染图片展示在可是区域内。
懒加载的实现:
<!-- 只在可视化区域内加载图片 -->
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head><body> <img style="width: 250px;height: 250px;background-color: grey; display: block;" data-src="./img/test01.PNG"alt=""> <img style="width: 250px;height: 250px;background-color: grey; display: block;"data-src="./img/test01.PNG" alt=""> <imgstyle="width: 250px;height: 250px;background-color: grey; display: block;" data-src="./img/test01.PNG" alt=""><img style="width: 250px;height: 250px;background-color: grey; display: block;" data-src="./img/test01.PNG" alt=""><img style="width: 250px;height: 250px;background-color: grey; display: block;" data-src="./img/test01.PNG" alt=""><img style="width: 250px;height: 250px;background-color: grey; display: block;" data-src="./img/test01.PNG" alt=""><img style="width: 250px;height: 250px;background-color: grey; display: block;" data-src="./img/test01.PNG" alt=""><img style="width: 250px;height: 250px;background-color: grey; display: block;" data-src="./img/test01.PNG" alt=""><img style="width: 250px;height: 250px;background-color: grey; display: block;" data-src="./img/test01.PNG" alt=""><img style="width: 250px;height: 250px;background-color: grey; display: block;" data-src="./img/test01.PNG" alt=""><img style="width: 250px;height: 250px;background-color: grey; display: block;" data-src="./img/test01.PNG" alt=""><img style="width: 250px;height: 250px;background-color: grey; display: block;" data-src="./img/test01.PNG" alt="">
</body>
<script>var viewHeight = document.documentElement.clientHeight; // 可视化区域的高度 var viewWidth = document.documentElement.clientWidth; // 可视化区域的宽度 function lazyload() { //获取所有要进行懒加载的图片 let eles = document.querySelectorAll('img[data-src]'); // 获取属性名中有data-src的 console.log('获取所有的信息', eles)Array.prototype.forEach.call(eles, function (item, index) {let rect;if (item.dataset.src === '') {return;}rect = item.getBoundingClientRect(); // 返回元素的大小及其相对于视口的位置 console.log('返回元素的大小及其相对于视口的位置', rect) //图片一进入可视区,动态加载 if (rect.bottom >= 0 && rect.top < viewHeight) {! function () {let img = new Image();img.src = item.dataset.src;img.onload = function () {item.src = img.src;}item.removeAttribute('data-src');}();}})}lazyload();
</script></html>
上述代码中,我们已经初步完成图片懒加载,但是我们大家都知道,scroll这个事件,用户滚动鼠标就会触发很多次,这也会导致我们的性能急剧下降,所以这就引出了我们的混合体 防抖函数优化我们的性能:
function debounce(fn, gapTime) {let timer = null;return function () {if (timer) {clearTimeout(timer);timer = null;}timer = setTimeout(function () {fn();}, gapTime)}}
最后贴出完整代码:
<!-- 只在可视化区域内加载图片 -->
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><img id="img" style="width: 250px;height: 250px;background-color: grey; display: block;" data-src="./img/test01.PNG" alt=""><img style="width: 250px;height: 250px;background-color: grey; display: block;" data-src="./img/test01.PNG" alt=""><img style="width: 250px;height: 250px;background-color: grey; display: block;" data-src="./img/test01.PNG" alt=""><img style="width: 250px;height: 250px;background-color: grey; display: block;" data-src="./img/test01.PNG" alt=""><img style="width: 250px;height: 250px;background-color: grey; display: block;" data-src="./img/test01.PNG" alt=""><img style="width: 250px;height: 250px;background-color: grey; display: block;" data-src="./img/test01.PNG" alt=""><img style="width: 250px;height: 250px;background-color: grey; display: block;" data-src="./img/test01.PNG" alt=""><img style="width: 250px;height: 250px;background-color: grey; display: block;" data-src="./img/test01.PNG" alt=""><img style="width: 250px;height: 250px;background-color: grey; display: block;" data-src="./img/test01.PNG" alt=""><img style="width: 250px;height: 250px;background-color: grey; display: block;" data-src="./img/test01.PNG" alt=""><img style="width: 250px;height: 250px;background-color: grey; display: block;" data-src="./img/test01.PNG" alt=""><img style="width: 250px;height: 250px;background-color: grey; display: block;" data-src="./img/test01.PNG" alt="">
</body>
<script>var viewHeight = document.documentElement.clientHeight; // 可视化区域的高度var viewWidth = document.documentElement.clientWidth; // 可视化区域的宽度console.log('可视化区域的高度', viewHeight)console.log('可视化区域的宽度', viewWidth)let imgDom = document.getElementById('img');console.log(window.getComputedStyle(imgDom, null).color); // 用来取所有的function lazyload () {//获取所有要进行懒加载的图片let eles = document.querySelectorAll('img[data-src]'); // 获取属性名中有data-src的console.log('获取所有的信息', eles)Array.prototype.forEach.call(eles, function(item, index) {let rect;if(item.dataset.src === '') {return;}rect = item.getBoundingClientRect(); // 返回元素的大小及其相对于视口的位置console.log('返回元素的大小及其相对于视口的位置', rect)//图片一进入可视区,动态加载if(rect.bottom >= 0 && rect.top < viewHeight) {!function () {let img = new Image();img.src = item.dataset.src;img.onload = function () {item.src = img.src;}item.removeAttribute('data-src');}();}})}lazyload();// 添加滚动事件触发图片加载document.addEventListener('scroll', debounce(lazyload, 500), false);// 通过函数防抖来持续优化:function debounce(fn, gapTime) {let timer = null;return function() {if(timer) {clearTimeout(timer);timer = null;}timer = setTimeout(function() {fn();}, gapTime)}}</script>
</html>
掘金链接:
- https://juejin.cn/post/6977945074885722126
前端图片渲染性能优化与实践 — 图片懒加载相关推荐
- 前端性能优化:使用媒体查询加载指定大小的背景图片
日期:2013-7-8 来源:GBin1.com 直到CSS @supports被广泛支持,CSS媒体查询的使用接近于CSS中写逻辑控制.我们经常用CSS媒体查询来根据设备调整CSS属性(通常根据屏 ...
- 前端性能优化(一)提升加载速度
加入QQ群:864680898,一起学习进步!点击群名可查看本人网站,有最新文章! 前端性能优化----(一)提升加载速度 由于现在大部分是做的单页面应用了,那么会导致页面的首次加载时间非常的长.常见 ...
- 关于前端性能优化问题,认识网页加载过程和防抖节流
前端性能优化-网页加载过程.性能优化方法.防抖和节流 一.网页加载过程 1.加载资源的形式 2.加载资源的过程 3.渲染页面的过程 4.关于window.onload 和 DOMContentLoad ...
- 前端性能优化:如何提高页面加载速度和用户体验
第一章:介绍 当今互联网时代,网站的性能对于用户体验至关重要.一个快速加载的网页不仅能提高用户的满意度,还能增加页面的转化率.而在前端开发中,性能优化是一个永恒的话题.本篇博客将为大家分享一些关于前端 ...
- 接手同事vue项目两个月的血和泪,关于vue项目性能优化,缩短首屏加载时间
最近接手了别人做的vue项目,项目跑起来后,有些页面很卡,首屏加载也慢,打包速度也慢.于是,研究了很久vue的项目性能优化,下面我将从两个部分来详解vue项目的性能优化: 代码优化 webpack打包 ...
- 前端女娲补天 HTML(二)什么是懒加载,什么是预加载
什么是懒加载 懒加载可以将页面上的图片src设置为空,真实路径放在data-original属性中,在图片进入可视区域后再将src设置为data-original的值. 具体实现 在DOM中获取所有懒 ...
- 自适应,响应式以及图片的性能优化(响应式图片)
自适应:最常见的就是淘宝无限适配[移动端]+rem单位 index.js · 2.0 · mirrors / amfe / lib-flexible · GitCode 可以将这个淘宝无限适配的ind ...
- 前端性能优化之jQuery按需加载轮播图
引言 关于幻灯轮播图,想必大家都不陌生,尤其是基于 jQuery 的,插件.代码网上一搜一大堆,但是真正符合自己需求的几乎没有,所以我要打造一个符合自身需求,经得起广大网民考验的 jQuery 轮播图 ...
- 前端性能优化:dns-prefetch和preload预加载资源
前端页面加载的时候我们有时会用到一些非模块化的库都是用cdn引入的,如果体积很大的话会阻塞页面的加载,并且这个库可能只在特定页面调用,这样体验很不好 这里可以用dns-prefetch按需加载解决. ...
最新文章
- iOS Plist 文件的 增 删 改
- C++将程序跳转到指定内存地址
- 除了负载均衡,Nginx还可以做很多,限流、缓存、黑白名单等
- 如何处理TCPSocket客户端与服务器端连接中断后的异常
- mysql bin.000047_mysql-bin.0000X 日志文件处理
- 技术干货 | mPaaS 小程序高玩带你起飞:客户端预置小程序无视网络质量
- linux对^M换行符的处理
- JSP include directive 和JSP include的区别
- word中打开vba编辑器方式
- 什么情况下java会出现堆溢出_【Java面试题第三期】JVM中哪些地方会出现内存溢出?出现的原因是什么?...
- IntelliJ IDEA插件开发教程
- 计算机类教育部科目分类,教育部学科门类及一的级学科目录表.doc
- 计算房贷利率月供相关信息(等额本息)
- 爬虫练习案例:交通路况
- magicbook java开发,买前必看,荣耀MagicBook和华为MateBook D(2018版)哪个更适合你?
- 用指针写藏头诗c语言,智能藏头诗小程序:小程序可以自动写诗啦!为“Ta”写首诗表白~...
- 计算机网络通信模型之cs模式(一)简单的socket
- 企业邮箱的优势有哪些?使用企业邮箱的好处
- 华为开发者联盟Severless解决方案为鸿蒙生态构建发力
- 大厂面试题刷屏:一头牛重800kg,一座桥承重700kg,牛如何过桥?
热门文章
- First-Blood
- 完整教程:Springboot 2.2整合elasticsearch 7.x (spring-boot-starter-data-elasticsearch)
- 触宝发布Q4财报:预期2022实现全年盈利,管理层增持展示信心
- skywalking内部测试服务器安装记录
- IE11中图片无法显示(完美解决)
- CentOS7安装教程
- java super父类方法_java super关键字,super调用父类构造方法详解
- 逐行分析鸿蒙系统的 JavaScript 开发框架
- signature=1e5c9cadfac910b9cd55ef06301b71df,Vision-based process control in layered manufacturing
- JavaSE学习笔记 - 基础(1)