使用 HTML 和 JavaScript 高效加载图像

我之前写过一篇教程,讨论如何使用 html、css 或 javascript 在网页上预加载图像。我们费尽心思预加载图像的原因是为了向用户提供更好的浏览体验,这样他们就不必等待图像加载。

改善用户体验的相同理念也适用于延迟加载图像。当我们浏览网站时,图像是影响页面重量的最大因素之一。以最佳方式加载它们可以提高性能并节省带宽。

在本教程中,我们将了解延迟加载图像的不同方法。

延迟加载图像的必要性

我们将通过了解为什么您应该为延迟加载图像而烦恼来开始本教程。假设您正在为一位摄影师构建一个作品集网站,他们在一个页面上展示了所有最好的图像。

并不是每个人都会滚动到页面底部来查看所有图像。但是,图像仍会由用户的浏览器下载。这在下面的 CodePen 演示中很明显:

立即学习“Java免费学习笔记(深入)”;

即使您没有滚动超过上面演示中的第一个图像,您也会看到浏览器已加载所有图像。以下浏览器开发人员工具中网络选项卡的屏幕截图显示发出了 38 个请求,传输了大约 2.5MB 的数据。浏览器总共下载了 19 个图像,重定向使请求数量增加了一倍。

使用 HTML 和 JavaScript 高效加载图像

我们现在将尝试改进或优化图像加载以节省资源。

使用 HTML 延迟加载图像

延迟加载图像的最简单方法涉及使用 loading 属性。所有现代浏览器都支持图像上的 loading 属性,该属性可用于指示浏览器防止加载不在屏幕上的图像,并且仅在用户滚动到足够近以使其可见时才开始加载它们。 p>

loading 属性可以接受两个可能的值。第一个值是 eager,它告诉浏览器立即加载图像,即使它当前不在视口内。这是浏览器的默认行为。

第二个值是 lazy,它告诉浏览器推迟加载图像,直到它到达距视口的特定距离。该距离由浏览器定义。将 loading 属性的值设置为 lazy 可能会为客户端节省带宽。

请务必记住,浏览器仅延迟加载当前在视口中不可见的图像。通常,网页上的图像与其他文本一起放置,将它们推到视口之外。在这种情况下,您不需要执行任何特殊操作来确保图像延迟加载。

但是,请考虑本教程中的示例,其中网页仅包含图像。在这种情况下,如果您希望延迟加载图像,那么提及图像的大小就变得很重要。否则,所有图像最初的宽度和高度都将为零。这将使浏览器认为所有图像在视口中都可见,并且会立即加载所有图像。

在这种情况下,显式指定图像宽度和高度会将某些图像推出视口。您可以使用 widthheight HTML 属性或在 CSS 中自由指定图像尺寸。

这是延迟加载图像的标记:

使用 HTML 和 JavaScript 高效加载图像

正如我之前所说,您还可以在 CSS 中指定图像尺寸,并从标记中删除 widthheight 属性:

使用 HTML 和 JavaScript 高效加载图像

相应的 CSS 为:

img {  width: 600px;  height: 600px;}

以下 CodePen 演示展示了延迟加载的实际效果:

我的浏览器开发者工具中的网络选项卡显示,这次只下载了四张图像,传输的数据量约为 450 kB。页面上共有 19 张图片,这意味着另外 15 张图片将被延迟下载。就带宽而言,这意味着节省了约 80%。

使用 HTML 和 JavaScript 高效加载图像

这里要记住的一件重要事情是,即使不涉及脚本,图像的延迟加载也仅在启用 JavaScript 时才有效。这样做是为了防止通过策略性放置的图像来跟踪用户的滚动位置。

浏览器如何确定何时应该下载应该延迟加载的图像?触发延迟加载图像下载的确切条件因浏览器而异。然而,两个主要因素似乎是距视口的距离和网络速度。

如果您想精确控制延迟加载图像的下载时间,则必须使用 JavaScript。

使用 JavaScript 延迟加载图像

现在我们将学习如何使用 JavaScript 延迟加载图像。这将使我们能够更好地控制整个过程。如果您认为默认的延迟加载不够激进,您可以使用 Intersection Observer API 创建自己的延迟加载脚本。

在编写任何 JavaScript 之前,我们需要对标记进行一些更改:

使用 HTML 和 JavaScript 高效加载图像

我们的 img 标签现在将包含一个名为 lazy-load 的类,以帮助我们识别哪些图像需要延迟加载。 img 标签将使用 data-src 属性来跟踪图像路径,而不是 src 属性。这会阻止图像立即开始下载。

Intersection Observer API 允许我们检测目标元素是否与其任何祖先元素或文档的视口相交。我们将使用 IntersectionObserver() 构造函数来创建 IntersectionObserver 对象。该构造函数接受回调函数作为其第一个参数,并接受一个用于自定义观察者行为的可选对象作为第二个参数。

我们传递给构造函数的回调函数接收两个参数。第一个是相交元素的数组,第二个是观察者本身。自定义选项允许您指定要检查交集的根元素、向根元素添加额外偏移值的根边距以及确定浏览器何时开始报告交集的阈值。

这是我们的交叉点观察者对象的代码:

function preload_image(img) {  img.src = img.dataset.src;  console.log(`Loading ${img.src}`);}const config_opts = {  rootMargin: '200px 200px 200px 200px'};let observer = new IntersectionObserver(function(entries, self) {  for(entry of entries) {     if(entry.isIntersecting) {      let elem = entry.target;      preload_image(elem);         self.unobserve(elem);    }  }}, config_opts);

我在根元素(本例中为视口)的所有边上提供了 200 像素的边距。只要任何图像位于视口 200 像素范围内,我们的交叉点观察器就会激活。默认情况下,阈值设置为 0。值为零意味着只要图像的一小部分位于我们指定的范围内,就会调用 preload_image() 函数。 unobserve() 方法告诉浏览器停止观察该特定图像以进行进一步的交叉。

preload_image() 函数获取图像的 data-src 属性的值,并将其应用于 src 属性。这会触发我们图像的下载。

我们现在需要做的就是查询文档中的所有图像,然后告诉观察者观察它们是否有交集。这是为我们实现这一目标的代码。

let images = document.querySelectorAll('img.lazy-load');for(image of images) {  observer.observe(image);}

您是否注意到我们正在使用 img.lazy-load 选择器来查询我们的图像?这个类可以帮助我们轻松识别所有想要延迟加载的图像。没有此类的图像将正常加载。

这是一个 CodePen 演示,用于查看我们的图像是否确实延迟加载。

这次,我的浏览器开发者工具中的网络选项卡显示,之前只下载了两张图片,总共传输的数据量约为 192 kB。与原始演示相比,我们的带宽节省现已高达 92%。

使用 HTML 和 JavaScript 高效加载图像

我承认我已经让交叉观察者变得非常激进,只加载非常接近视口的图像。然而,这就是您自己实现该功能的美妙之处。

最终想法

延迟加载图像对每个人来说都是双赢的。它将减少服务器的负载,同时节省用户的带宽。请记住,数据,尤其是移动数据,在世界上的某些地方非常昂贵。

现在浏览器原生支持延迟加载图像,只需对标记进行微小更改即可充分利用该功能。浏览器还足够智能,可以根据网络速度和图像位置确定延迟加载图像的理想时间。您还可以使用 Intersection Observer API 相对轻松地自行实现该功能。

这里要记住的一件重要事情是,如果用户端禁用 JavaScript,这些技术都将不起作用。

以上就是使用 HTML 和 JavaScript 高效加载图像的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1551155.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月21日 21:23:39
下一篇 2025年12月21日 21:23:46

相关推荐

  • 我们如何在HTML中使用标签进行变量格式化?

    <img src="https://img.php.cn/upload/article/000/887/227/169296967350226.jpg" alt="我们如何在html中使用标签进行变量格式化?”> 我们使用标签来定义编程或数学表达…

    好文分享 2025年12月21日
    000
  • 如何将当前语言环境的约定,将日期的“时间”部分作为字符串返回?

    要使用当前语言环境的约定以字符串形式返回日期的“时间”部分,请使用 toLocaleTimeString() 方法。 toLocaleTimeString 方法依赖于格式化日期的底层操作系统。它使用运行脚本的操作系统的格式约定将日期转换为字符串。例如,在美国,月份出现在日期之前 (04/15/98)…

    2025年12月21日
    000
  • 如何在HTML中标记删除线文本?

    要在html中标记删除线文本,请使用…标签。它会呈现一个删除线文本。html已经弃用了这个标签,在html5中不应该使用它。作为替代,可以使用css的text-decoration属性。 要使用CSS属性,请使用style属性。style属性为元素指定了内联样式。该属性可以与HTML的 标签一起使用…

    2025年12月21日
    000
  • 在HTML中显示下标文本

    使用 标签创建下标文本。 HTML 标签用于定义下标文本,例如 x1+ x2 示例 您可以尝试运行以下代码来显示 HTML 中的下标文本 – HTML sub Tag Value of x1 + x2 = 17 以上就是在HTML中显示下标文本的详细内容,更多请关注创想鸟其它相关文章!

    2025年12月21日
    000
  • 如何在HTML页面中使用动画图像?

    html 中的动画图像是网页上移动的图像。它是 gif 格式,即图形交换格式文件。 我们需要在HTML中使用标签和src属性来添加一个动画图像。 src属性添加了图像的URL(文件位置) 此外,我们还可以使用 height 和 width 属性设置图像的高度和宽度。 语法 示例 1 以下是一个示例,…

    2025年12月21日 好文分享
    000
  • 如何使用JavaScript显示文档的标题?

    In this tutorial, we will understand two approaches to display the document’s title usingJavaScript. Using document.title Property One of the mo…

    2025年12月21日
    000
  • 在JavaScript中,ctrlKey鼠标事件的作用是什么?

    The ctrlkey mouse event property is used to show whether the CTRL key is pressed or not when the mouse button is clicked. Example You can try to run t…

    2025年12月21日
    000
  • iframe有什么弊端

    iframe的弊端有:1、加载速度慢,由于iframe需要加载嵌入的网页,因此会增加整体页面的加载时间;2、对搜索引擎不友好,搜索引擎通常会忽略iframe中的内容,这意味着嵌入的网页的内容不会被搜索引擎索引;3、安全性问题,恶意网站可以通过iframe来进行钓鱼、点击劫持等攻击,从而危害用户的隐私…

    2025年12月21日
    000
  • 使用文件系统API将本地驱动器上的文件上传到本地文件系统的HTML中

    To upload from local drive to the local file system, we can use − Webkitdirectory attribute on − This allows the user to select a directory by the app…

    2025年12月21日
    000
  • 在HTML中添加一条水平线

    HTML 标签是用于创建水平线的标签。HTML 标签支持以下附加属性: 属性   值              描述  align 立即学习“前端免费学习笔记(深入)”;  left  right  center  已弃用  – 指定水平线的对齐方式。  noshade  Noshade…

    2025年12月21日
    000
  • 当HTML中的元素发生变化时执行脚本?

    <img src="https://img.php.cn/upload/article/000/465/014/169293367387110.jpg" alt="当html中的元素发生变化时执行脚本?”> 当提示改变时,oncuechange …

    好文分享 2025年12月21日
    000
  • WML和HTML的区别

    像HTML和WML这样的标记语言主要用于提供网站内容。每种语言所针对的系统是WML和HTML之间的基本区别。HTML是为了将材料传递给个人计算机而开发的,这些计算机有足够的计算能力来处理和渲染信息。当互联网开始传播到移动设备时,很快就明确了这些设备缺乏处理能力、屏幕尺寸和色域范围来支持HTML。WM…

    2025年12月21日
    000
  • 在HTML中,enctype=’multipart/form-data’是什么意思?

    使用 enctype 属性来指定浏览器在将数据发送到服务器之前如何对数据进行编码。可能的值有 – application/x-www-form-urlencoded − 这是大多数表单在简单场景中使用的标准方法。 mutlipart/form-data − 这用于在表单中上传二进制数据,…

    2025年12月21日
    000
  • canvas图形一般分为哪些类型

    canvas图形一般分为矩形、圆形、路径、多边形、弧线、文本、图像、渐变、阴影和图像合成等类型。详细介绍:1、矩形是Canvas图形中最基本的形状之一,通过指定矩形的起点坐标和宽度、高度可以绘制出一个矩形;2、绘制圆形需要指定圆心坐标和半径,Canvas提供了“arc()”方法来绘制圆形,通过设置起…

    2025年12月21日
    000
  • html如何引用本地图片路径

    html引用本地图片路径的方法:1、使用相对路径,如果图片与HTML文件在同一个文件夹下,可以直接使用图片的文件名作为相对路径;2、使用绝对路径,可以使用绝对路径来引用本地图片,但这通常不是最佳实践,因为绝对路径可能在不同的环境中引发问题;3、使用Base64编码,Base64编码是一种将图片转换为…

    2025年12月21日 好文分享
    000
  • 当在HTML中点击表单中的重置按钮时执行脚本?

    当表单被重置时,onreset 属性会触发。您可以尝试运行以下代码来实现onreset属性 − 示例 Student Name: Student Subject: function display() { alert(“Form reset successfull!”); } 以上就是当在HTML中…

    2025年12月21日
    000
  • 如何在HTML5中绘制SVG标志?

    在接下来的文章中,我们将学习如何在HTML5中绘制SVG标志。在我们开始阅读文章之前,让我们先讨论一些关于SVG的事情。可缩放矢量图形(SVG)是一种使用矢量数据的图像格式。与其他格式不同,SVG不使用独特的像素来构建图像,而是使用矢量数据。 使用它最好的一点是,使用SVG可以制作适应任何分辨率的图…

    2025年12月21日
    000
  • 如何在HTML中指定元素的内容是否应该被翻译?

    The translate attribute is useful to set that the content of an element is to be translated or not. The following are the attributes − AttributeValue …

    2025年12月21日
    000
  • 如何选择具有特定HTML内容匹配值的Divs?

    The division tag is also known as the div tag. HTML uses the div tag to create content divisions in web pages such (text, images, header, footer, navi…

    2025年12月21日
    000
  • 如何在HTML中的fieldset中包含一个标题?

    使用 标签来包含一个标题。HTML 标签用于为 标签定义一个标题。它支持以下属性− 属性 值 描述 Align 立即学习“前端免费学习笔记(深入)”; top bottom left right 已弃用 − 指定内容对齐方式。 示例 您可以尝试运行以下代码来实现HTML中的 标签− HTML leg…

    2025年12月21日
    000

发表回复

登录后才能评论
关注微信