首页 > 其他分享 >js面试题 图片懒加载!

js面试题 图片懒加载!

时间:2024-08-21 21:23:25浏览次数:7  
标签:src 面试题 js 图片 视口 entry document 加载

一、原理

只加载可视区域内的图片,而那些还未滑动到可视区域的图片先不加载,直到用户滚动到这些资源即将可见的时候才进行加载。

若一个页面有大量的图片资源,网页首次打开时,若同时加载完这些资源,需要消耗大量的时间,利用图片懒加载,先加载部分图片,既不会影响用户体验,又能大幅提升首屏加载速度。

二、实现

1.那么如何控制图片被加载和不被加载呢?

        加载:当网页被打开时,浏览器会自动解析img标签,查看src属性,得到图片url,发请求获取图片资源。

        不加载:更改src属性名,变为data-src,这样浏览器就不会自动加载图片资源了。

注:data-* 属性是自定义数据属性,不会影响布局和表现,可以通过DOM元素身上的dataset属性获取,是HTML5引入的新功能。

2.如何判断图片是否在可视区域内呢?

        (1)视口方法

利用视口高度window.innerHeight 和 元素距离视口顶部的高getBoundingClientRect().top

若getBoundingClientRect().top < window.innerHeight,则说明元素在可视区域内

        (2)页面方法

利用元素距离页面顶部的高度offsetTop 和 页面滚动的高度document.documentElement.scrollTop 和 页面视口高度document.documentElement.clientHeight

三、代码实现

1.监听页面滚动事件

<script>
  let images = document.querySelectorAll('img');
  //监听滚动事件
  window.addEventListener('scroll',()=>{
    //滚动高度
    let scrollTop = document.documentElement.scrollTop;
    //视口高度
    let clientHeight = document.documentElement.clientHeight;

    images.forEach(image=>{
      //进入视口
      if(image.offsetTop <= scrollTop + clientHeight){
        image.src = image.dataset.src;}
    })
  })  
</script>

痛点:监听事件触发次数太多了!简单滚动就会达到上百次触发

2.优化——Intersection Observer API交叉观察器

这是一种现代的、性能更优的方法,它允许开发者定义一个回调函数,当目标元素与视口的交叉状态变化时自动触发。使用这个API可以更精确地控制懒加载行为,减少滚动事件的直接使用,从而避免潜在的性能问题。

<script>
  let images = document.querySelectorAll('img');

  //元素引入视口和离开视口都会触发一次
  const callback = (entries)=>{
    console.log('观察者');
    entries.forEach(entry=>{
      //与视口相交
      if(entry.isIntersecting){
        entry.target.src = entry.target.dataset.src;
        //图片加载过之后取消监听
        observer.unobserve(entry.target);
      }
    })
  }

  //构造observer观察器
  const observer = new IntersectionObserver(callback);
  //观察每一个图片
  images.forEach(image=>{
    observer.observe(image);
  })
</script>

标签:src,面试题,js,图片,视口,entry,document,加载
From: https://blog.csdn.net/m0_75276704/article/details/141366213

相关文章

  • js 手写图片懒加载插件
    一、目标模仿vue-lazyload插件只需将img标签的src属性名替换为自定义属性v-lazy,即可实现图片懒加载功能例如:二、实现不清楚图片懒加载原理的参考我的上一篇博客1.封装自定义插件:暴露一个对象,包含一个install方法先介绍一下自定义插件使用方法和通用写法://main.jsimp......
  • 「OC」视图控制器的懒加载策略
    「OC」视图控制器的懒加载策略文章目录「OC」视图控制器的懒加载策略懒加载懒加载的优点常见的懒加载实现方法使用懒加载的注意事项控制器的懒加载参考资料懒加载懒加载(LazyLoading)是一种设计模式,其核心思想是在需要时才进行对象的创建或资源的加载,而不是在对象......
  • 高级java每日一道面试题-2024年8月21日-框架篇[Spring篇]-使用IOC容器应该注意哪些?
    如果有遗漏,评论区告诉我进行补充面试官:使用IOC容器应该注意哪些?我回答:1.理解IOC的基本概念控制反转:在传统的编程模式中,程序会主动控制依赖关系的创建和管理。而在IoC容器中,这种控制权被反转给了容器本身。程序员只需要声明依赖关系,而由容器负责实例化和注入这些依......
  • Java笔试面试题AI答之集合(1)
    文章目录1.Java集合类框架的基本接口有哪些?2.为什么Java集合类没有实现Cloneable和Serializable接口?关于Cloneable接口关于Serializable接口为什么不默认实现这些接口?3.Java中的HashMap的工作原理是什么?1.数据结构2.哈希函数3.处理哈希冲突4.动态扩容5.Java8......
  • 跨域、JSONP、CORS、Spring、Spring Security解决方案
    概述JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象。跨域是浏览器(如Chrome浏览器基于JSV8引擎,可以简单理解为JS解释器)的一种同源安全策略,是浏览器单方面限制脚本的跨域访问。因此,仅有客户端运行在浏览器时才存在跨域问题,才需要考虑如何解决这个问题。浏览器控制台......
  • 【Three.JS零基础入门教程】第七篇:材质详解
      前期回顾:【Three.JS零基础入门教程】第一篇:搭建开发环境【Three.JS零基础入门教程】第二篇:起步案例【Three.JS零基础入门教程】第三篇:开发辅助【Three.JS零基础入门教程】第四篇:基础变换【Three.JS零基础入门教程】第五篇:项目规划【Three.JS零基础入门教程】第六篇:物......
  • 前端高频面试题整理
    1.在React中,如何检验props?为什么要验证props?在React中,你可以使用PropTypes库来检查组件的props。这可以确保组件收到的props类型正确,避免在应用运行过程中出现意外错误。具体的做法是导入PropTypes库,并为每个prop定义相应的类型和是否必需。首先,你需要安装prop......
  • 网络增加安全策略,兼容模式下打不开网页的问题,用到了js中的获取时间
    1、遇到了403的问题,查到原因是因为要url转义,可是转义后,发现极速模式可以用,兼容模式依然是403的问题。所以认为兼容模式与极速模式的解析url中存在很大差异,通过比较兼容模式与极速模式的url,发现兼容模式有中文字符,极速模式下是转义的,所以将中文字符换成英文,发现可以打开链接了。......
  • 基于nodejs+vue协同过滤算法的音乐推荐系统 [程序+论文+开题]-计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展,数字音乐已成为人们日常生活中不可或缺的一部分。面对海量的音乐资源,用户往往难以快速找到符合个人喜好的音乐作品。传统的音乐搜......
  • 基于nodejs+vue农村医保信息系统[程序+论文+开题]-计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着我国农村经济的快速发展和人民生活水平的提高,农村医疗保障体系的建设日益受到重视。然而,传统的农村医保管理方式存在信息孤岛、流程繁琐、效率低下等问......