五分钟带你学会--图片懒加载| 8月更文挑战

简介: 五分钟带你学会--图片懒加载| 8月更文挑战

这是我参与8月更文挑战的第3天,活动详情查看:8月更文挑战

什么是图片懒加载

随着网页中流媒体的不断增多,网页可能包含的图片也是越来越多,但是这些图片往往需要消耗巨大的流量,所以为了提高网页加载的效率,当用户请求一个网页的时候,并不会一次性把该网页中包含的图片全部发送给用户,而是只发送给用户当前浏览器窗口可视区域内的图片,这就是图片懒加载技术。

如何实现图片懒加载?

方法1:监听scroll事件

通过本方法来实现图片懒加载之前我们需要先知道两个概念即

  1. 窗口显示区域的高度(window.innerHeight)
  2. 图片到视窗最上面的距离(getBoundingClientRect().top)

image.png

<img data-src="./CSS.png" alt="">
<img data-src="./Debug.png" alt="">
<img data-src="./Flex布局.png" alt="">
复制代码

实现代码

// 获取所有图片的DOM节点
const images = document.querySelectorAll('img');
// 监听scroll事件,并计算每一个图片距离视窗顶部的高度和视窗高度的关系
window.addEventListener('scroll',(e) => {
    images.forEach(image => {
        // 获取图片距离浏览器视窗顶部的高度
        const imageTop = image.getBoundingClientRect().top;
        if (imageTop < window.innerHeight) {
            const data_src = image.getAttribute('data-src');
            image.setAttribute('src',data_src);
        }
        console.log('scroll触发');
    })
})
复制代码

存在的问题

只要浏览器监听到滚动变化,就会不断触发调用,严重影响性能。

方法2:通过IntersectionObserver(交叉观察)(推荐使用)

这个API指的是当视窗和目标对象发生交集的时候调用。

详细思路代码版

// 获取所有图片的DOM节点
const images = document.querySelectorAll('img');
// 观察函数的回调函数在观察到的时候触发一次,观察不到再触发一次
callback = (entries) => {
    // 这个entries参数是绑定好的所有元素数组
    // 如果某个元素被观察到了则修改属性,加载图片,然后取消观察,因为已经加载出来了
    entries.forEach(entry => {
        if (entry.isIntersecting) {
            const image = entry.target;
            const data_src = image.getAttribute('data-src');
            image.setAttribute('src',data_src);
            observer.unobserve(image);
            console.log('触发单个观察');
        }
    })
}
// 构造IntersectionObserver函数
const observer = new IntersectionObserver(callback);
// 给每一张图片绑定观察函数
images.forEach(image => {
    observer.observe(image);
})
复制代码

CodeSandBox在线实现

思维导图

image.png

相关文章
|
4天前
|
JavaScript
懒加载图片案例
懒加载图片案例
|
4天前
|
小程序 API
微信小程序如何利用createIntersectionObserver实现图片懒加载
微信小程序如何利用createIntersectionObserver实现图片懒加载
|
4天前
|
JavaScript 算法 前端开发
JS懒加载 -- 适用于商城主页商品懒加载、图片懒加载,算法简单、易于理解、萌新福音
JS懒加载 -- 适用于商城主页商品懒加载、图片懒加载,算法简单、易于理解、萌新福音
22 0
|
12月前
|
缓存 开发工具
ADMob 原生广告展示不完全,mediaView无图片数据
在接入原生广告时,比如在splash 请求一个原生广告,然后缓存起来,跳转带首页展示一个原生广告,结果遇到了广告展示不完全的问题(有文案,title,appIcon,点击按钮,如果不缓存直接请求展示则没有问题),可以进行点击跳转,但是却没有广告大图,改了好一会儿,终于解决了这个问题。
|
前端开发
前端学习案例2-图片懒加载2
前端学习案例2-图片懒加载2
43 0
前端学习案例2-图片懒加载2
|
前端开发
前端学习案例4-图片懒加载4
前端学习案例4-图片懒加载4
44 0
前端学习案例4-图片懒加载4
|
前端开发
前端学习案例3-图片懒加载3
前端学习案例3-图片懒加载3
48 0
前端学习案例3-图片懒加载3
|
前端开发
前端学习案例1-图片懒加载1
前端学习案例1-图片懒加载1
51 0
前端学习案例1-图片懒加载1
|
前端开发
前端开发实现图片懒加载思路
可以给img标签统一自定义属性data-src='default.png',当检测到图片出现在窗口之后再补充src属性,此时才会进行图片资源加载。
90 0
|
前端开发 JavaScript
前端性能优化之企业项目实战图片和字体优化(3)
前端性能优化之企业项目实战图片和字体优化(3)
73 0