性能增强:如何使用in-view.js加载图像

在本教程中,我将向您展示如何通过使用in-view.js来提高网页的性能。 当某些内容滚动到视口中时,此JavaScript库会向您返回报告,并将帮助我们根据需要动态加载图像。

绩效问题

Web性能很重要,特别是如果您的网站针对连接速度慢且数据计划昂贵的发展中国家。 我们通常承担的改善网站性能的一些基本任务包括缩小JavaScript文件和样式表,“压缩”资产,压缩图像大小,然后我们几乎完成了所有工作。 但是我们呢?

上面的检查器示例显示了一个页面,该页面以固定的3G速度在移动大小的视口中加载24张图像。 正如我们所看到的,页面加载大约在十一秒钟完成! 鉴于我们正在处理一个仅包含少量图像和样式表的简单页面,这确实很慢。 该页面尚未被广告污染,也没有跟踪脚本,这些脚本通常会在页面上添加更多的镇流器。

同样值得记住的是,这仅仅是一个模拟。 它甚至没有考虑服务器设置,延迟和其他技术障碍。 在现实中,性能可能会变差。

那么如何改善页面加载性能呢?

瓶颈

首先,我们有很多图像。 我们页面加载缓慢的原因是,在初始页面加载时所有图像都一起泛滥。 如果您仔细查看上一张图像,您会发现并不会并行发生:只有在渲染了其他图像之后,才开始加载几个图像,这会使整个页面陷入瘫痪。

如果单个页面上有大量图像,则可以考虑异步加载这些图像,并且仅在用户需要它们时才加载。 这使浏览器可以完成加载可见页面,而无需等待所有图像都被渲染,最终节省了用户带宽。

入门

要继续学习,请从repo中获取index-starter.html 。 还有一个随附的css / styles-starter.css,您也可以使用。

首先,我们需要用非常小的图像替换图像源, 最好将其编码为base64以避免任何额外的HTTP请求。 在提供实际图像之前,我们将此图像用作占位符。 话虽如此,我们还必须将实际图像源存储在名为data-src的自定义属性中。

<figure class="post__image">
   <img src="https://img-blog.csdnimg.cn/2022010702040617771.gif" data-src="./images/image-24.jpg" alt="" width="800" height="554">
</figure>

完成此操作并刷新页面后,您应该发现图像当前为空白,并且其尺寸不一定就是最终图像应具有的尺寸。

因此,让我们修复样式。

保持图像比例

我们要使用的图像设置为800 x 550像素。 我们将图像高度( 800px )除以图像宽度( 500px ),然后乘以100% 。 使用结果来设置图像容器的伪元素的padding top 。 最后,我们需要将图像位置设置为absolute位置,并将最大高度设置为100% ,这样就不会增加高度。

figure {
   position: relative;
}
figure img {
   top: 0;
   left: 0;
   position: absolute;
   max-height: 100%;
}
figure:before {
   padding-top: 69.25%; // ( 554 / 800 ) * 100%
}

此时,图像尺寸应该正确。 但是,真实的图像源仍然位于自定义属性中,因此浏览器实际上还无法获取任何图像。

我们的下一步将添加一些将加载图像JavaScript。

加载图像

首先,我们需要将in-view.js加载到页面中。 如前所述,此轻量级库(不依赖jQuery或Waypoints等核心库)可检测元素是在浏览器视口内还是在视口外。

现在创建一个新JavaScript文件,我们将在其中编写我们JavaScript并将其加载到in-view.js中,如下所示:

<script src="./js/in-view.min.js"></script>
<script src="./js/scripts.js"></script>

方法与功能

in-view.js库公开了inView()函数,该函数以选择器作为参数。 在这种情况下,我们将传递figure元素; 包装图片的元素。 选择wrapper元素的原因是因为我们将添加几个类来执行样式转换-当类位于wrapper元素而不是图像本身上时,这更容易实现,因此:

inView('figure')

接下来,我们使用.on()方法将元素与enter事件绑定,以检查元素是否在视口内。 另外,in-view.js还公开了exit事件,其作用与此相反。 这将检测元素何时不在视口中。

inView( 'figure' ).on( 'enter', function( figure ) {

     var img = figure.querySelector( 'img' ); // 1

     if (  'undefined' !== typeof img.dataset.src ) { // 2

         figure.classList.add( 'is-loading' ); // 3

         // 4
         newImg = new Image();
         newImg.src = img.dataset.src;

         newImg.addEventListener( 'load', function() {

            figure.innerHTML = ''; // 5
            figure.appendChild( this );

            // 6
            setTimeout( function() {
               figure.classList.remove( 'is-loading' );
               figure.classList.add( 'is-loaded' );
            }, 300 );
         } );
     }
} );

enter事件将触发一个函数,该函数将执行以下操作:

  1. 在figure选择图像。
  2. 确保它具有data-src属性。
  3. 将is-loading添加到包装器figure元素。
  4. 使用从data-src属性检索到的源加载新图像。
  5. 加载后,将图像添加到容器中。
  6. 最后,将is-loading类替换为is-loaded类。

我们想加载

从上面的代码中可以看到,我们引入了两个新的类is-loading和is-loaded 。 我们使用is-loading类在图像加载时添加微调器动画。 顾名思义,然后使用is-loaded类在图像完全加载后向图像添加过渡效果。

figure.is-loaded img {
   animation: fadeIn 0.38s linear 1s forwards;
}
figure.is-loading {
   position: relative;
}
figure.is-loading:after {
   content: '';
   display: block;
   color: #ddd;
   font-size: 30px;
   text-indent: -9999em;
   overflow: hidden;
   width: 1em;
   height: 1em;
   border-radius: 50%;
   margin: auto;
   position: absolute;
   top: 50%;
   left: 50%;
   margin-left: -0.5em;
   margin-top: -0.5em;
   transform: translateZ(0);
   animation: loading 1.7s infinite ease;
}
@keyframes loading {
   0% {
     transform: rotate(0deg);
     box-shadow: 0 -0.83em 0 -0.4em, 0 -0.83em 0 -0.42em, 0 -0.83em 0 -0.44em, 0 -0.83em 0 -0.46em, 0 -0.83em 0 -0.477em;
   }

   5%,
   95% {
     box-shadow: 0 -0.83em 0 -0.4em, 0 -0.83em 0 -0.42em, 0 -0.83em 0 -0.44em, 0 -0.83em 0 -0.46em, 0 -0.83em 0 -0.477em;
   }
   10%,
   59% {
     box-shadow: 0 -0.83em 0 -0.4em, -0.087em -0.825em 0 -0.42em, -0.173em -0.812em 0 -0.44em, -0.256em -0.789em 0 -0.46em, -0.297em -0.775em 0 -0.477em;
   }
   20% {
     box-shadow: 0 -0.83em 0 -0.4em, -0.338em -0.758em 0 -0.42em, -0.555em -0.617em 0 -0.44em, -0.671em -0.488em 0 -0.46em, -0.749em -0.34em 0 -0.477em;
   }
   38% {
     box-shadow: 0 -0.83em 0 -0.4em, -0.377em -0.74em 0 -0.42em, -0.645em -0.522em 0 -0.44em, -0.775em -0.297em 0 -0.46em, -0.82em -0.09em 0 -0.477em;
   }
   100% {
     transform: rotate(360deg);
     box-shadow: 0 -0.83em 0 -0.4em, 0 -0.83em 0 -0.42em, 0 -0.83em 0 -0.44em, 0 -0.83em 0 -0.46em, 0 -0.83em 0 -0.477em;
   }
}
@keyframes fadeIn {
    0% {
        opacity: 0;
    }

    100% {
        opacity: 1;
    }
}

倒退

希望有最好的,但要有最坏的打算。 因此,以防万一JavaScript被禁用(一种罕见的情况,但完全有可能),我们需要确保图像仍会显示。 在图像源立即指向真实图像源的情况下使用<noscript>元素。

<figure>
   <img src="https://img-blog.csdnimg.cn/2022010702040617771.gif" data-src="./images/image-24.jpg" alt="" width="800" height="554">
   <noscript>
      <img src="./images/image-24.jpg" alt="" width="800" height="554">
   </noscript>
</figure>

我们都准备好了! 刷新页面,如果我们在DevTools中检查网络时间轴,则可以看到页面速度现在得到了显着提高,因为我们只加载了用户可见的内容。

现在,以常规3G速度完成的页面加载仅需1.95秒。 速度提高了500%以上!

结语

在本教程中,我们研究了如何仅在用户看到图像时才渲染图像来改善页面加载。 这种方法俗称“延迟加载”,可以极大地帮助您提高网站性能。

有许多JavaScript库和jQuery插件可以执行此操作,那么为什么选择in-view.js? 就个人而言,in-view.js一直是我一直在寻找的脚本,因为它不会做太多事情。 它只会处理一件事,并且做得很好。 这种库提供了更多的控制权和更大的灵活性。

举例来说,我们不仅可以在-view.js用于执行延迟加载,但是我们也可以用它的东西,如进行无限滚动 ,或许显示浮动当用户到达页面的最后认购表格( 起飞观看演示以了解实际效果),或者创建垂直时间轴而无需引入另一个JavaScript库。 让我们知道您如何使用它!

更多资源

翻译自: https://webdesign.tutsplus.com/tutorials/web-performance-enhancement-how-to-load-images-using-in-view-js--cms-27714

Spine.js实战:无服务器环境下JSON与Atlas资源处理方案 Spine.js 是一个轻量级的 JavaScript MVC 框架,专为构建结构清晰、易于维护的单页应用(SPA)而设计。其核心理念是通过事件驱动和模块化结构,帮助开发者实现松耦合、高内聚的前端架构。相比 Angular、React 等现代框架,Spine.js 更加轻量,适合需要高度定制化且不依赖复杂构建流程的项目。其核心特性包括基于类的组织结构、事件绑定机制、以及简洁的模型-视图-控制器(MVC)实现方式。开发者可以通过继承和扩展类快速构建模块化组件,同时利用事件系统实现组件间的通信。 阅读详情

相关推荐

inview-animate:JQuery.inview 的简单演示

视图动画 简单 要求 < script src =" https://code.jquery.com/jquery-1.11.2.min.js " > </ script > < script src =" js/jquery.inview.min.js " > </ script > <!-- Wrapper function --> < script src =" js/inview.animate.js " > </ script > 用法 我为 JQuery inview 创建了一个包装函数,以便 通过 ID 定位元素 在查看和查看时切换类 < script type = "text/javascript" > // Simple usage inViewRunner('section1Title', 'goAnim

rCore-Tutorial-v3网络协议栈:在RISC-V上实现TCP/IP的终极指南 [特殊字符]

**rCore-Tutorial-v3网络协议栈**是一个在RISC-V架构上用Rust语言从零构建的完整TCP/IP协议栈实现。这个开源项目为操作系统学习者提供了在裸机环境中理解和实现网络协议栈的绝佳机会。通过本指南,您将掌握如何在RISC-V平台上构建功能完整的网络协议栈,从底层驱动到高层套接字API。 ## 📊 为什么选择rCore-Tutorial-v3网络协议栈? rCore-Tu

gitblog_00082的博客 514

inviewjs得到通知当DOM元素进入或退出窗口时

in-view.js:得到通知当DOM元素进入或退出窗口时

in-view.js — 精准掌握元素视口状态的利器!

in-view.js — 精准掌握元素视口状态的利器! 在网页开发中,我们经常需要监控DOM元素是否进入或退出可视区域,以此来实现诸如懒加载、动画效果等高级功能。in-view.js,一个轻量级(压缩后仅约1.9KB)、无依赖、兼容IE9+的JavaScript工具库,正是解决此类问题的理想选择。 项目简介 in-view.js提供了简单易用的API,允许你为选定的DOM元素注册进入和退出视口时...

gitblog_00245的博客 636

inView:一个小的jQuery插件,用于检测元素何时进入视口

已折旧 不要使用此功能,首先jQuery已死,其次是是更好的选择。 inView v1.1.0 一个小的jQuery插件,用于检测元素何时进入视口。 目录 输入 这是一个插件,因此必须在该插件之前导入jQuery。 将“ inView.js”导入文档,可以在此存储库的“ src”目录中找到此脚本。 <head> [removed][removed] [removed][removed] </head> 用 HTML使用 只能使用HTML来启动此插件,您仍然需要JavaScript来定义处理程序。 <head> <script src='http://code.jquery.com/jquery-2.1.1.min.j

前端项目-jquery.inview.zip

前端项目-jquery.inview,RemySharp的jquery插件添加了一个可绑定的“inview”事件,用于在元素滚动到视图中时进行检测。

InversifyJS 基础示例项目教程

InversifyJS 基础示例项目教程 1. 项目的目录结构及介绍 inversify-basic-example/ ├── src/ │ ├── entities/ │ │ └── battle/ │ │ └── epic_battle.ts │ ├── interfaces/ │ ├── constants/ │ ├── main.ts ├── .gi...

gitblog_00642的博客 426

vue-inview:Vue插件(用于视图中的程序包)

Vue检视V2 此版本正在开发中,因此,如果您想使用vueinview,请 星星 如果您喜欢vue-inview,在此存储库上给我加星标 奇特聊天 学习,提问并提出解决问题 信用 基于https://github.com/camwiegert/in-view的vue-inview nanoid模块https://github.com/ai/nanoid 动画模块https://github.com/daneden/animate.css

图片延时加载jquery.inview.js用法详解

我们在网站上总能见到这样的效果,若是有图片,图片都是先用loading加载一小段时间,然后紧接着出来要显示的图片,即效果如下:   v2_loading.gif,几秒钟时间过渡到v2_pic_01_s.jpg这样,这就是图片延时加载。 具体实现技术如下: 1)引入jquery库文件; 2)引入jquery.inview.min.js文件; 3)html结构: <a href="h...

weixin_30843605的博客 219

美团mtgsig 3.1.0算法还原:从加密入口到d1生成的完整链路拆解

本文详细拆解了美团mtgsig 3.1.0签名算法的完整逆向过程。通过定位加密入口函数eH,理清a6、a5、a8到d1的生成依赖链,并运用插桩技术,在JSVMP混淆环境下逐步还原了核心参数的生成逻辑,为逆向工程实践提供了清晰的纯算还原方法论。

oo7890的博客 777

WOL唤醒配置(以太网、PHY、MAC)

MAC 就是以太网控制器,属于OSI的数字链路层。phy 属于OSI的物理层(Physical layer),所以叫phy。CPU Mac与phy通信通过MII接口,数据的传输通过MDIO数据线。通过配置phy的相关寄存器实现不同的功能。

qq_58264156的博客 8632

viewer.js预览图片插件使用

参考学习链接: https://www.jqhtml.com/6750.html 官方文档及其插件下载链接: https://github.com/fengyuanchen/viewerjs#options 使用步骤: 导入文件,js版,不需要导入其他的了 <link rel="stylesheet" href="${ctx}/plug-in/viwer/css/viewer.min.css...

tlimited的博客 1万+

Linux内核4.14版本——drm框架分析(1)——drm简介

drm框架分析

yangguoyu8023的博客 1万+

js-cloudimage-360-view:为产品展示提供虚拟全景体验

js-cloudimage-360-view 是一个简单、互动的全景图资源,它可以用于为您的产品提供虚拟漫游体验。该项目基于云图像技术,允许用户通过360度旋转查看产品,提供更加直观和详细的视觉体验。无论是电子商务平台上的商品展示还是房产、旅游行业的场景展示,js-cloudimage-360-view 都能极大地提升用户体验。 ## 项目技术分析 js-cloudimage-360-view...

gitblog_00045的博客 836

PCL 动态半径滤波【2025最新版】

使用PCL实现的2022年最新SCI论文——【Design of Dust-Filtering Algorithms for LiDAR Sensors Using Intensity and Range Information in Off-Road Vehicles】 一文中提出用于自动驾驶点云剔除粉尘、雨雪等影响因素导致的噪声点滤波算法。

点云侠的博客 1473

【AIGC】大模型面试高频考点09-大模型Agent框架

聚焦AIGC专业技术分享

一个内容严谨、方向前沿、极具实践价值的AI大模型技术分享站 1967

渐入渐出的图像融合算法_如何构建自己的渐进式图像加载器

渐入渐出的图像融合算法 You may have encountered progressive images on Facebook and Medium. A blurred low-resolution image is replaced with a full-resolution version when the element is scrolled into view: 您可能在F...

culh2177的博客 1394

解析AI人工智能领域AI芯片的散热技术

当你用ChatGPT写代码、用AI生成高清图片时,背后的AI芯片可能正在“发高烧”——全球TOP500超算的平均功耗已突破10兆瓦,单颗GPU的峰值功耗超过700W(相当于3台家用空调同时运行)。本文将聚焦AI芯片的散热技术,覆盖从基础原理到前沿方案的全链条解析,帮助读者理解“散热为什么比算力更重要”。

AIGC应用创新大全的博客 936

Tesseract.js移动端适配方案:在React Native中使用OCR

你是否在React Native项目中遇到过这些OCR挑战?识别速度慢到无法忍受?应用体积膨胀难以接受?图片预处理复杂到无从下手?本文将系统解决这些问题,提供一套完整的Tesseract.js移动端适配方案,让你在React Native应用中轻松实现高效文字识别功能。 读完本文你将掌握: - React Native环境下Tesseract.js的完整集成流程 - 三种核心优化策略(预加载/并...

gitblog_01017的博客 571

解锁RK3588 HDMI输出:分辨率与EDID的深度探索

本文详细探讨了瑞芯微RK3588处理器的HDMI输出分辨率配置与EDID解析技术。文章首先介绍了RK3588处理器的性能特点及其HDMI功能在多媒体和工业领域的应用价值,随后分别阐述了HDMI输出分辨率的硬件连接要求和软件配置方法,包括4K/8K等不同分辨率的配置实例。在EDID部分,深入解析了EDID的数据结构、交互机制,以及数据获取与修改的具体方法。最后总结了配置过程中常见问题的解决方案,并展望了RK3588在高分辨率显示领域的发展前景。全文为开发者提供了RK3588 HDMI显示配置的完整技术指南。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 592

电能质量仿真:电能质量改善措施仿真_(12).电能质量改善措施综合仿真案例

假设我们有一个微电网系统,该系统包含分布式电源(如光伏板、风力发电机)、储能设备、负荷和电网连接。电压波动:由于负荷的波动和分布式电源的间歇性输出,系统电压出现了不稳定的情况。谐波污染:非线性负荷和逆变器的运行导致系统中出现了显著的谐波污染。频率偏差:分布式电源的波动和负荷的突变导致系统频率出现了偏差。我们需要通过仿真来评估这些问题的影响,并提出相应的改善措施。

2401_87715305的博客 1360

Panorama View 开源项目教程

Panorama View 开源项目教程 项目介绍 Panorama View 是一个基于开源技术实现的全景图像查看器,允许用户浏览和交互式的体验360度全景图像和视频。该项目利用HTML5和WebGL技术,提供2D与3D视角切换,支持从本地计算机加载图像和视频文件。虽然提供的链接并非直接指向上述描述的具体GitHub仓库,但假设该仓库遵循了类似的开发目标和技术栈,我们将基于通用的开源全景查看器项...

gitblog_00481的博客 731

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

android webview 代替,android-增强webView的性能(应该与本机Web浏览器的性能相同)...

我终于明白了android webview性能不好的原因。请注意下面的图像...从OnPageStarted到OnPageFinished使用了12秒。 因为它应该加载CSS,javascript和... AJAX ...我注意到JQuery和JQueryMobile需要在Html中加载所有DOM结构。因此,如果我在OnPageFinished之后懒加载javascript,它应该可以更快地显示页...

weixin_26843605的博客 357

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Hyperlapse.js与Three.js集成实战:打造沉浸式街景体验

Hyperlapse.js是一款基于JavaScript的街景延时摄影工具,它能与Three.js完美结合,帮助开发者轻松创建令人惊叹的沉浸式街景体验。通过这两者的强大组合,你可以将普通的街景图像转化为流畅、动态的视觉旅程,为用户带来身临其境的感觉。 ## 准备工作:搭建开发环境 在开始之前,我们需要准备必要的开发环境。首先,克隆项目仓库到本地: ```bash git clone http

gitblog_00709的博客 363

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

利用CSS、JavaScript及Ajax实现图片预加载的三大方法

Perishable Press网站近日发表了一篇文章《3 Ways to Preload Images with CSS, JavaScript, or Ajax》,分享了利用CSS、JavaScript及Ajax实现图片预加载的三大方法。下面为译文。 预加载图片是提高用户体验的一个很好方法。图片预先加载到浏览器中,访问者便可顺利地在你的网站上冲浪,并享受到极快的加载速度。这对图片画廊及...

weixin_34014555的博客 64

**推荐一款Vue.js视口检测插件:提升页面互动性与响应式体验**

推荐一款Vue.js视口检测插件:提升页面互动性与响应式体验 项目介绍 在现代Web开发中,了解元素是否处于可视区域(即浏览器的视口内)对于创建动态和响应式的用户体验至关重要。vue-check-view 正是为此目的而生的一款轻量级Vue.js插件,它能无缝地检查元素的位置,并根据元素是否位于视口内添加相应的CSS类。不仅如此,它还支持服务器端渲染(SSR),并在没有依赖的情况下运行于最新版本的...

gitblog_00088的博客 459
上一篇: 静态原型_如何在静态,低保真和高保真原型之间做出选择
下一篇: bootstrap 网格_在10分钟内使用Salvattore和Bootstrap构建动态网格
daique1908
博客等级 码龄10年 29粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值