基础前端面试题:HTML网站开发中,如何实现图片的懒加载

ops/2025/2/22 8:57:49/
htmledit_views">

懒加载,顾名思义,在当前网页,滑动页面到能看到图片的时候再加载图片

故问题拆分成两个:

  1. 如何判断图片出现在了当前视口 (即如何判断我们能够看到图片)
  2. 如何控制图片的加载

方案 1:使用 IntersectionObserver(推荐)

IntersectionObserver 是现代浏览器提供的 API,可高效监听元素是否进入视口。

实现步骤
  1. img 添加 data-src 存储真实图片 URL,初始 src 设为空或占位图。
  2. 使用 IntersectionObserver 监听图片是否进入视口。
  3. 进入视口时,将 data-src 赋值给 src,触发图片加载。
代码示例
html"><img class="lazy" data-src="real-image.jpg" src="placeholder.jpg" alt="Lazy Image">
document.addEventListener("DOMContentLoaded", function () {let lazyImages = document.querySelectorAll("img.lazy");let observer = new IntersectionObserver((entries, observer) => {entries.forEach(entry => {if (entry.isIntersecting) {let img = entry.target;img.src = img.dataset.src;img.classList.remove("lazy"); // 移除类,避免重复加载observer.unobserve(img); // 取消观察,减少性能消耗}});}, {root: null, // 视口threshold: 0.1 // 触发懒加载的阈值});lazyImages.forEach(img => observer.observe(img));
});

优点

  • 高效:浏览器 API 提供回调,仅在图片进入视口时触发。
  • 可控:可自定义触发阈值 threshold(例如 0.1 表示 10% 进入视口时加载)。

方案 2:使用 getBoundingClientRect() + scroll 事件(兼容旧浏览器)

如果需要支持不兼容 IntersectionObserver 的旧版浏览器,可以使用 getBoundingClientRect() 结合 scroll 事件手动监听。

实现步骤
  1. 监听 scroll 事件,遍历所有 lazy 图片。
  2. 使用 getBoundingClientRect() 判断图片是否进入视口。
  3. 进入视口后加载图片并移除监听。
代码示例
function lazyLoad() {let lazyImages = document.querySelectorAll("img.lazy");let windowHeight = window.innerHeight;lazyImages.forEach(img => {let rect = img.getBoundingClientRect();if (rect.top < windowHeight && rect.bottom > 0) { // 判断是否在视口内img.src = img.dataset.src;img.classList.remove("lazy");}});if (document.querySelectorAll("img.lazy").length === 0) {window.removeEventListener("scroll", lazyLoad); // 所有图片加载完后移除事件监听}
}document.addEventListener("DOMContentLoaded", () => {window.addEventListener("scroll", lazyLoad);lazyLoad(); // 初次执行,确保首屏图片加载
});

缺点

  • 性能问题scroll 事件会频繁触发,需要使用 防抖debounce)优化。
  • 兼容性好:适用于旧版浏览器。

方案 3:使用 loading="lazy"(最简单,浏览器原生支持)

HTML5 提供 loading="lazy" 属性,浏览器会自动判断图片是否需要懒加载。

html"><img src="real-image.jpg" loading="lazy" alt="Lazy Image">

优点

  • 最简单,无需 JS,浏览器自动处理懒加载。
  • 兼容性一般,现代浏览器(Chrome 76+,Firefox 75+,Edge 79+)支持。

缺点

  • 无法自定义触发时机,受浏览器策略控制。
  • 不支持旧版浏览器,如 Safari 15 之前。

最佳方案推荐

  1. 现代浏览器:使用 IntersectionObserver(推荐)
  2. 兼容性要求高scroll + getBoundingClientRect()
  3. 简单项目:直接用 loading="lazy"(最方便)

http://www.ppmy.cn/ops/160471.html

相关文章

【Mastering Vim 2_05】第四章:深入理解 Vim 的结构化文本

【最新版《Mastering Vim》封面&#xff0c;涵盖 Vim 9.0 版特性】 文章目录 第四章 深入理解结构化文本1 Vim 内置的自动补全功能2 YouCompleteMe 插件对自动补全的增强3 tags 文件的用法4 Exuberant Ctags 简介5 借助 Undotree 插件实现 Vim 撤销树的可视化 写在前面 本章围绕…

ADCS证书服务

应用场景 上一章详细说明了证书链和证书校验的细节&#xff0c;那么在域内如果让域用户使用证书访问域内服务&#xff1f; 根 ADCS 服务器&#xff08;根CA&#xff09; 子 ADCS 服务器&#xff08;中间CA&#xff09; web 服务 域用户 如果采用 根CA证书------中间CA证书…

【目标检测】【PANet】Path Aggregation Network for Instance Segmentation

实例分割的路径聚合网络 0.论文摘要 信息在神经网络中的传播方式至关重要。在本文中&#xff0c;我们提出了路径聚合网络&#xff08;PANet&#xff09;&#xff0c;旨在增强基于提议的实例分割框架中的信息流动。具体而言&#xff0c;我们通过自底向上的路径增强&#xff0…

nats集群搭建

本次使用三台机器搭建nats集群&#xff0c;ip分别为192.168.20.7、192.168.20.8、192.168.20.10&#xff0c;预先在三台机器上装好nats&#xff0c;版本为0.0.35。 1. 在192.168.20.7机器上操作&#xff0c;配置server.conf # 为节点设置唯一的名称 server_name: node1 port: …

使用 ONLYOFFICE API 新方法,从第二页开始插入自定义页码!

ONLYOFFICE 宏是一种功能强大的工具&#xff0c;可以让用户扩展编辑器的功能并对其进行定制&#xff0c;以满足特定需求。随着 8.3 版本的发布&#xff0c;我们推出了一系列新的 API 方法&#xff0c;能够帮您简化工作流程。 在本文中&#xff0c;我们将使用其中一种方法创建一…

通信系统中物理层与网络层联系与区别

在通信系统中&#xff0c;物理层和网络层是OSI&#xff08;开放系统互连&#xff09;模型中的两个重要层次&#xff0c;分别位于协议栈的最底层和第三层。它们在功能、职责和实现方式上有显著的区别&#xff0c;但同时也在某些方面存在联系。以下是物理层与网络层的联系与区别的…

如何调用 DeepSeek API:详细教程与示例

目录 一、准备工作 二、DeepSeek API 调用步骤 1. 选择 API 端点 2. 构建 API 请求 3. 发送请求并处理响应 三、Python 示例&#xff1a;调用 DeepSeek API 1. 安装依赖 2. 编写代码 3. 运行代码 四、常见问题及解决方法 1. API 调用返回 401 错误 2. API 调用返回…

在本地使用 Llama 3.2-Vision:分步指南

通过直观的用户界面或强大的端点服务&#xff0c;在本地与先进的多模态 Llama 模型进行交互。 Llama 3.2-Vision 是一个强大的多模态模型&#xff0c;能够处理文本和图像数据。它具有 110 亿&#xff08;11B&#xff09;和 900 亿&#xff08;90B&#xff09;参数规模&#xff…