js-图片懒加载的实现

目录

1.什么是图片懒加载

2.懒加载的优点

3.如何实现图片懒加载


1.什么是图片懒加载

 指当页面加载数据时,只先加载浏览器可视区的图片,而不是直接加载页面中所有图片。只有当鼠标滚轮往下滑,才加载后面的图片。


2.懒加载的优点

使用图片懒加载可以优化页面的渲染速度,减少图片的加载时间以及加载体积(因为你不用等所有的图片都加载好,只需要当前可视区要用到的图片加载好即可,减少服务器发送请求获取图片信息的次数)。同时可以为客户节省流量。


3.如何实现图片懒加载

  • 第一种最简单直接的方式便是监听 scroll 事件,当图片到浏览器顶部的距离小于浏览器可视窗口的高度时,加载图片 

     (document.getBoundingClientRect().top < window.innerHeight)

具体做法:先将在 <img /> 标签中自定义一个属性 data-src ,放实际图片的地址,等需要加载图片的时候再将 data-src 中的值,赋值给 src 属性。

<img data-src="src/views/images/1.jpg" />

:Vue 项目中要 img 的 src 属性的路径要写完整,从脚手架 src 文件夹一级一级往下写,因为后续改完路径之后服务器是直接拼接上地址渲染的,不会识别 ' ./ ' 具体指的是哪个路径) 

完整代码

<img data-src="src/views/images/1.jpg" /><br />
<img data-src="/src/views/images/2.jpg" /><br />
<img data-src="/src/views/images/3.jpg" /><br />
<script>
    const imgs = document.querySelectorAll("img");
    window.addEventListener('scroll',()=>{
        imgs.forEach(img => {
            if(img.getBoundingClientRect().top < window.innerHeight) {
                const data_src = img.getAttribute('data-src');
                img.setAttribute('src',data_src);
                console.log('触发');      // 测试触发次数
            }
        })
    })
</script>

这个方法虽然简单,但弊端也有,每次拖动滚动条,只要图片是在可视窗口内都会触发,但实际上只要是加载过的图片,只需要加载一次就好了,这样无疑是增加了服务器的请求数量。由此引出第二个优化方法。


  •  第二个方法是使用浏览器提供的构造函数 IntersectionObserver (交叉观察)

目标元素和可视窗口之间的产生交叉区域(也就是目标元素出现在可视区域时),交叉区域的出现和消失会调用 IntersectionObserver 的回调函数

  1. 首先实例化一个 IntersectionObserver 对象 ob
  2. 当需要观察目标元素是否进入或退出可视区时,调用 ob 对象的 observe 方法,当不需要观察时调用 ob.unobserve 方法。
  3. 这样我们在图片第一次加载后就可以停止观察了,就不会造成反复观察反复加载。
const ob = new IntersectionObserver(function callback(changes){});

// 观察元素
ob.observe(element);

// 不观察元素
ob.unobserve(element);

callback 回调函数有一个参数(changes)是数组,每个成员都是一个 IntersectionObserverEntry 对象。举例来说,如果同时有两个被观察的对象的可见性发生变化,changes 数组就会有两个成员。

循环遍历参数 changes 中每一个成员,当该成员的 isIntersecting = true 则说明该回调函数所属的目标元素已经出现,将目标元素 img 的真正路径赋值,加载渲染图片。只要目标元素出现过一次已经渲染过了,就可以停止观察了,避免重复加载。

完整代码

const imgs = document.querySelectorAll("img");

const observer = new IntersectionObserver(callback);   // 实例化

function callback(entries) {
  // 循环遍历回调函数中每一个成员
  entries.forEach((entry) => {
    if (entry.isIntersecting) {
      const image = entry.target;       // 提取回调函数所属的目标元素
      const data_src = image.getAttribute("data-src");
      image.setAttribute("src", data_src);   // 修改回调函数所属的目标元素 img 标签的 src
      observer.unobserve(image);       // 关闭目标元素的观察
      console.log('触发');         // 测试触发次数
    }
  });
}

imgs.forEach((img) => {     // 循环所有 img 标签,观察每个 img 标签
  observer.observe(img);
});

测试结果:三张图片只会触发三次,达到预期

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: 可以使用 Intersection Observer API 实现图片懒加载。这个 API 可以监听一个元素是否进入了视口(viewport),进入了就会触发一个回调函数,我们就可以在这个回调函数中加载图片。 具体步骤如下: 1. 将页面中所有需要懒加载的图片的 `src` 属性替换成一个 `data-src` 属性,表示真实的图片路径。 2. 使用 Intersection Observer API 监听所有需要懒加载的图片元素。 3. 当某个图片元素进入视口时,将其 `data-src` 属性的值赋给 `src` 属性,从而加载真实的图片。 代码示例: ```html <img data-src="path/to/image.jpg" class="lazyload" /> <script> const lazyloadImages = document.querySelectorAll('.lazyload'); const observer = new IntersectionObserver(entries => { entries.forEach(entry => { if (entry.isIntersecting) { const img = entry.target; img.src = img.dataset.src; observer.unobserve(img); } }); }); lazyloadImages.forEach(img => { observer.observe(img); }); </script> ``` 在上面的代码中,我们首先获取到页面中所有需要懒加载的图片元素,并使用 Intersection Observer API 监听它们。当某个图片元素进入视口时,我们将其 `data-src` 属性的值赋给 `src` 属性,并调用 `unobserve` 方法停止监听该元素。这样就可以实现图片懒加载了。 ### 回答2: 图片懒加载是一种优化网页加载性能的技术,可以通过延迟加载页面上的图片来加快页面加载速度。即在页面初始化时,不会一次性加载所有图片,而是当图片进入可视区域时才进行加载,从而提高页面加载速度。 如果不使用lazy-loader,可以通过监听页面滚动事件实现图片的懒加载。具体步骤如下: 1. 在页面中将需要懒加载的图片的src属性设置为一个占位符,例如data-src。 2. 监听页面滚动事件,在滚动事件的回调函数中,判断需要懒加载的图片是否进入了可视区域。 3. 判断图片是否进入可视区域的方法是比较图片在页面中的位置和可视区域的位置,可以通过使用getBoundingClientRect()方法获取图片的位置信息,再与可视区域的信息进行比较。 4. 当图片进入可视区域时,将data-src属性的值赋给src属性,即实现图片的实际加载。 需要注意的是,为了避免滚动事件频繁触发,可以使用节流或防抖技术进行优化,以提高滚动事件的响应速度。 总结起来,不使用lazy-loader可以通过监听页面滚动事件,判断图片是否进入可视区域,从而实现图片的懒加载。这样可以减少页面加载时间,提高用户体验。 ### 回答3: 图片懒加载是一种优化网页加载速度的技术,它通过延迟加载图片,减少页面的初始加载时间,提升用户体验。如果不使用lazy-loader,我们可以通过以下步骤来实现图片懒加载。 首先,将所有需要懒加载的图片的src属性保存在一个自定义属性中,例如"data-src"。 其次,通过监听页面的滚动事件,判断图片是否进入可视区域。当图片进入可视区域时,获取其自定义属性值,将其赋给src属性,从而触发图片加载。 具体实现步骤如下: 1. 在HTML中设置需要懒加载图片的img标签,将图片的src属性设置为占位图或空白。 ```html <img class="lazy-img" data-src="path_to_image.jpg" src="placeholder_image.jpg"> ``` 2. 使用JavaScript获取页面中所有class为"lazy-img"的img元素,并将其存储为一个数组。 ```javascript var lazyImages = document.querySelectorAll('.lazy-img'); ``` 3. 监听页面的滚动事件,判断图片是否进入可视区域。 ```javascript window.addEventListener('scroll', function() { for (var i = 0; i < lazyImages.length; i++) { if (isElementInViewport(lazyImages[i])) { lazyImages[i].src = lazyImages[i].getAttribute('data-src'); } } }); ``` 4. 编写一个函数isElementInViewport来判断图片是否进入可视区域。 ```javascript function isElementInViewport(element) { var rect = element.getBoundingClientRect(); return ( rect.top >= 0 && rect.left >= 0 && rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && rect.right <= (window.innerWidth || document.documentElement.clientWidth) ); } ``` 通过以上步骤,我们可以实现图片的懒加载效果,当图片进入可视区域时,才加载真实的图片资源,从而减少网页的初始加载时间。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值