【面试题】解释一下什么图片懒加载,那你能讲清楚吗?(二)

简介: 【面试题】解释一下什么图片懒加载,那你能讲清楚吗?(二)

给大家推荐一个实用面试题库

1、前端面试题库 (面试必备)            推荐:★★★★★

地址:web前端面试题库

引言

在上一篇文章中我们了解了一下图片懒加载以及它的实现原理,图片懒加载是一种优化网页性能的技术,它可以在网页加载时只加载当前屏幕可视区域内的图片,而不会一次性加载所有图片,从而提高网页的加载速度、减少后台服务器压力,并提升用户体验。在这篇文章里我们再来一起了解一些可以进一步提高图片懒加载的效率和性能的优化方法。

一、使用 Intersection Observer API

Intersection Observer API是浏览器提供的一种监听元素可见性的方法,它可以在元素进入或离开可视区域时触发回调函数。使用Intersection Observer API可以省去计算元素位置的步骤,并且可以提高性能。

使用 Intersection Observer API 可以简化代码,例如:

const observer = new IntersectionObserver(function(entries) {  
  entries.forEach(function(entry) {  
    if (entry.isIntersecting) {  
      const image = entry.target;  
      image.src = image.dataset.src;  
      observer.unobserve(image);  
    }  
  });  
});  
images.forEach(function(image) {  
  observer.observe(image);  
});  

在上面的代码中,我们首先创建了一个IntersectionObserver对象,并传入了一个回调函数。在回调函数中,我们遍历所有的entries,判断是否在可视区域内,如果是,就将 data-src 属性的值赋给src属性,并调用unobserve()方法停止观察该元素。最后,我们遍历所有带有data-src属性的img标签,并调用observe()方法观察它们。

二、设置阈值

设置阈值可以控制元素何时被视为“可见”,从而进一步优化图片懒加载的效率。例如:

const options = {  
  root: null,  
  rootMargin: '0px',  
  threshold: 0.5  
};  
const observer = new IntersectionObserver(function(entries) {  
  entries.forEach(function(entry) {  
    if (entry.isIntersecting) {  
      const image = entry.target;  
      image.src = image.dataset.src;  
      observer.unobserve(image);  
    }  
  });  
}, options);  

在上面的代码中,我们使用options对象设置了threshold属性为0.5,表示当元素的一半进入可视区域时就被视为“可见”。可以根据实际情况调整threshold属性的值,以实现更加精细的控制。

三、预加载图片

预加载图片可以进一步提高用户体验,例如在鼠标悬停或点击事件时预加载图片。例如:

images.forEach(function(image) {  
  const src = image.dataset.src;  
  const img = new Image();  
  img.src = src;  
  img.onload = function() {  
    image.src = src;  
  };  
});  

在上面的代码中,我们通过创建一个新的Image对象来预加载图片,然后在图片加载完成后将其赋给img标签的src属性。这样可以加快图片加载速度,从而提高用户体验。

四、懒加载非图片资源

除了图片,还有其他类型的资源也可以使用懒加载技术,例如视频音频IFrame 等。对于这些资源,我们可以使用类似于图片懒加载的方法来实现懒加载。

1. 视频和音频懒加载

对于视频和音频,我们可以使用 HTML5 的videoaudio标签来实现懒加载。我们可以将视频或音频文件的地址存储到data-src属性上,然后在用户触发播放事件时再加载资源。例如:

<video controls data-src="video.mp4"></video>  
<script>  
  const videos = document.querySelectorAll('video[data-src]');  
  function isInViewport(element) {  
    const rect = element.getBoundingClientRect();  
    return rect.bottom > 0 &&  
           rect.right > 0 &&  
           rect.left < (window.innerWidth || document.documentElement.clientWidth) &&  
           rect.top < (window.innerHeight || document.documentElement.clientHeight);  
  }  
  function lazyLoad() {  
    videos.forEach(function(video) {  
      if (isInViewport(video)) {  
        video.src = video.dataset.src;  
        video.removeAttribute('data-src');  
      }  
    });  
  }  
  window.addEventListener('scroll', lazyLoad);  
  window.addEventListener('resize', lazyLoad);  
  window.addEventListener('orientationchange', lazyLoad);  
  lazyLoad();  
</script>  

在上面的代码中,我们首先获取所有带有data-src属性的video标签,然后使用 isInViewport() 函数判断元素是否在可视区域内,如果是,就将data-src属性的值赋给src属性,并将data-src属性删除,从而开始加载视频。

2. IFrame 懒加载

IFrame 是一种嵌入式的网页元素,也可以使用懒加载技术来优化性能。我们可以将 IFrame 的地址存储到 data-src 属性上,然后在用户触发事件时再加载资源。例如:

<button id="load-iframe">Load IFrame</button>  
<iframe frameborder="0" data-src="https://www.example.com"></iframe>  
<script>  
  const button = document.getElementById('load-iframe');  
  const iframe = document.querySelector('iframe[data-src]');  
  button.addEventListener('click', function() {  
    iframe.src = iframe.dataset.src;  
    iframe.removeAttribute('data-src');  
  });  
</script>  

在上面的代码中,我们首先获取带有 data-src 属性的 iframe 标签,并将其存储到 iframe 变量中。然后,我们绑定一个点击事件到按钮上,在用户点击按钮时将 data-src 属性的值赋给 src 属性,并将data-src属性删除,从而开始加载 IFrame

总结

总之,我们可以通过一些其他的方法来进一步优化图片懒加载,而且除了图片外,还有其他类型的资源也可以使用懒加载技术来优化性能。我们可以使用类似于图片懒加载的方法来实现懒加载,例如使用 HTML5 的 videoaudio标签来实现视频和音频懒加载,使用IFrame标签来实现嵌入式网页的懒加载等,通过使用懒加载技术,来提高网页的加载速度、减少后台服务器压力,并提升用户体验,从而实现优化。

那么这篇文章就到这里结束啦~

如果你想了解更多这类文章,点赞关注作者更新更多~

给大家推荐一个实用面试题库

1、前端面试题库 (面试必备)            推荐:★★★★★

地址:web前端面试题库

相关文章
|
19天前
|
存储 缓存 编解码
Android经典面试题之图片Bitmap怎么做优化
本文介绍了图片相关的内存优化方法,包括分辨率适配、图片压缩与缓存。文中详细讲解了如何根据不同分辨率放置图片资源,避免图片拉伸变形;并通过示例代码展示了使用`BitmapFactory.Options`进行图片压缩的具体步骤。此外,还介绍了Glide等第三方库如何利用LRU算法实现高效图片缓存。
39 20
Android经典面试题之图片Bitmap怎么做优化
|
存储 前端开发 算法
前端经典面试题 | 性能优化之图片优化
前端经典面试题 | 性能优化之图片优化
|
测试技术
软件测试面试题:如果截取某一个元素的图片,不要截取全部图片
软件测试面试题:如果截取某一个元素的图片,不要截取全部图片
135 0
|
JavaScript 前端开发 测试技术
面试题: JS 获取图片宽高
一般用于审核后台,比如说要求图片在一定区间内才能加精。 也用于在 canvas 中裁图时计算缩放比例。
199 0
面试题: JS 获取图片宽高
|
2月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
2月前
|
Java
【Java基础面试四】、介绍一下Java的数据类型
这篇文章介绍了Java的数据类型,包括8种基本数据类型(整数、浮点、字符、布尔)和3类引用数据类型(数组、类、接口),并提供了基本数据类型所占内存空间和数据范围的详细信息。
|
2月前
|
Java C++
【Java基础面试十七】、Java为什么是单继承,为什么不能多继承?
这篇文章讨论了Java单继承的设计原因,指出Java不支持多继承主要是为了避免方法名冲突等混淆问题,尽管Java类不能直接继承多个父类,但可以通过接口和继承链实现类似多继承的效果。
【Java基础面试十七】、Java为什么是单继承,为什么不能多继承?
|
2月前
|
XML 存储 JSON
【IO面试题 六】、 除了Java自带的序列化之外,你还了解哪些序列化工具?
除了Java自带的序列化,常见的序列化工具还包括JSON(如jackson、gson、fastjson)、Protobuf、Thrift和Avro,各具特点,适用于不同的应用场景和性能需求。
|
2月前
|
Java
【Java基础面试三十七】、说一说Java的异常机制
这篇文章介绍了Java异常机制的三个主要方面:异常处理(使用try、catch、finally语句)、抛出异常(使用throw和throws关键字)、以及异常跟踪栈(异常传播和程序终止时的栈信息输出)。
|
2月前
|
Java
【Java基础面试三十八】、请介绍Java的异常接口
这篇文章介绍了Java的异常体系结构,主要讲述了Throwable作为异常的顶层父类,以及其子类Error和Exception的区别和处理方式。
下一篇
无影云桌面