前端优化:首屏加载速度的实践

news2024/11/23 23:46:35

目录

目录

前言

多图片的懒加载

避免用户多次点击请求

骨架屏原理

结束语


前言

随着互联网技术的飞速发展,前端网页逐渐取代了传统客户端成为用户获取信息、进行交互的重要渠道,但是网页也有常见的弊端,比如网页首屏加载速度的快慢直接影响着用户体验,那么如何提升网页的首屏加载速度,成为了前端开发者必须面对的问题。本文将从多图片懒加载、避免用户多次点击请求以及骨架屏原理等方面,简单分享一下前端优化首屏加载速度的策略优化。欢迎大家在评论区留言交流。

多图片的懒加载

用户对网页体验要求越来越高的时候,再加上网页设计的丰富和多媒体内容的增加,图片成为了网页中不可或缺的元素。实际开发中可以看到过多的图片会导致网页加载速度变慢,影响用户体验,为了解决这个问题,前端开发者可以采用懒加载。

其实懒加载是一种只在需要时才加载图片,它通过在用户滚动到图片位置之前,不加载图片或只加载低分辨率的图片占位符,来减少首屏加载时的网络请求和带宽占用。当用户滚动到图片位置时,再加载实际的高清图片。这样可以在保证用户体验的前提下,有效减少首屏加载时间。

还有就是实现懒加载的方式有多种,比如使用JavaScript监听滚动事件,判断图片是否进入视口;或者使用Intersection Observer API,更加精确地判断图片与视口的交集情况,这些方式都可以根据实际需求进行选择和调整。那么接下来就分享一个简单的示例,以使用JavaScript和Intersection Observer API实现图片懒加载的简单示例,具体的示例代码如下所示:

<!DOCTYPE html>  
<html lang="en">  
<head>  
<meta charset="UTF-8">  
<meta name="viewport" content="width=device-width, initial-scale=1.0">  
<title>图片懒加载示例</title>  
<style>  
  .lazy-image {  
    /* 初始状态下使用低分辨率图片或占位符 */  
    background: url('placeholder.jpg') no-repeat center center;  
    background-size: cover;  
    width: 300px;  
    height: 200px;  
  }  
</style>  
</head>  
<body>  
  
<img src="placeholder.jpg" data-src="real-image1.jpg" class="lazy-image" alt="Image 1">  
<img src="placeholder.jpg" data-src="real-image2.jpg" class="lazy-image" alt="Image 2">  
<!-- 更多图片... -->  
  
<script>  
// 监听图片与视口的交集情况  
const observer = new IntersectionObserver((entries, observer) => {  
  entries.forEach(entry => {  
    if (entry.isIntersecting) {  
      // 当图片进入视口时,加载真实图片  
      const lazyImage = entry.target;  
      const realSrc = lazyImage.dataset.src;  
      lazyImage.src = realSrc;  
      // 停止观察当前图片  
      observer.unobserve(lazyImage);  
    }  
  });  
});  
  
// 获取所有需要懒加载的图片  
const lazyImages = document.querySelectorAll('.lazy-image');  
  
// 对每张图片应用观察器  
lazyImages.forEach(image => {  
  observer.observe(image);  
});  
</script>  
  
</body>  
</html>

在上面的示例代码中,把需要懒加载的图片的src属性替换为data-src属性,并使用一个占位符作为背景图,然后使用Intersection Observer API来监听图片是否进入视口,一旦进入视口,就将data-src的值赋给src属性,从而触发图片的加载。

避免用户多次点击请求

还有一种情况在前端开发中经常遇到,那就是在网页中有些功能可能需要用户进行多次点击或输入操作才能触发,但是如果这些操作会导致额外的网络请求或数据处理,那么就会增加首屏加载的时间,为了避免这种情况,我们前端开发者可以采取以下措施:

  • 使用防抖和节流:防抖是在一定时间内只触发一次函数,节流是在一定时间内只触发有限次数的函数,这两种技术都可以有效减少用户连续点击或输入导致的额外请求。
  • 合并请求:将多个相关的网络请求合并成一个请求发送,可以减少网络传输的时间和带宽占用,比如可以将多个图片的URL合并成一个数组,一次性发送给后端进行处理。
  • 缓存数据:对于不需要实时更新的数据,可以将其缓存在前端或后端,避免重复请求,也可以通过设置合理的缓存策略来减少不必要的网络请求。

这里也来分享一个简单的使用示例,以使用防抖技术实现避免用户多次点击请求的示例,具体代码如下所示:

function debounce(func, wait) {  
  let timeout;  
  return function executedFunction(...args) {  
    const context = this;  
    clearTimeout(timeout);  
    timeout = setTimeout(() => func.apply(context, args), wait);  
  };  
}  
  
// 假设有一个需要防抖的函数  
function fetchData() {  
  // 发送网络请求...  
  console.log('Fetching data...');  
}  
  
// 使用防抖技术包装函数  
const debouncedFetchData = debounce(fetchData, 500);  
  
// 用户点击事件绑定防抖后的函数  
document.getElementById('myButton').addEventListener('click', debouncedFetchData);

在上面的示例代码中,定义了一个debounce函数,它接受一个需要防抖的函数和一个等待时间作为参数。在防抖函数内部,使用setTimeout来延迟执行原函数,并在每次调用防抖函数时清除上一次的定时器,然后只有在最后一次调用防抖函数后等待指定的时间,才会执行原函数。

骨架屏原理

作为前端开发者,在日常开发中对于骨架屏的使用应该非常熟悉,骨架屏是一种在内容加载期间展示给用户的一种视觉占位符,尤其是在用户等待数据加载时,展示一个大致的页面框架和关键元素,让用户提前感知到页面的结构,从而减少用户等待的焦虑感,它可以让用户在等待过程中感知到页面的加载进度,提升用户体验。

实现骨架屏的方式有多种,比如使用CSS动画和SVG等技术绘制一个简单的页面框架;或者使用专门的骨架屏库来快速生成,但是无论使用哪种方式,我们都需要注意以下几点:

  1. 保持与真实页面的结构和布局一致,让用户能够快速识别和理解;
  2. 加载完成后要及时隐藏骨架屏,避免影响用户体验;
  3. 根据不同的页面和场景选择合适的骨架屏样式和动画效果。

所以这里也来分享一个简单的使用示例,以一个简单的CSS实现骨架屏的示例,具体代码如下所示:


<!DOCTYPE html>  
<html lang="en">  
<head>  
<meta charset="UTF-8">  
<meta name="viewport" content="width=device-width, initial-scale=1.0">  
<title>骨架屏示例</title>  
<style>  
  .skeleton {  
    /* 骨架屏样式 */  
    background: #f3f3f3;  
    border-radius: 4px;  
    height: 200px; /* 根据实际内容调整高度 */  
    width: 100%; /* 根据实际内容调整宽度 */  
    margin-bottom: 20px; /* 根据需要添加 */  
  }  
  
  /* 加载完成后隐藏骨架屏 */
.loaded .skeleton {
display: none;
}
</style>
</head> 
<body>
 <!-- 骨架屏容器 -->
 <div class="skeleton" id="skeleton"></div>
 <!-- 真实内容容器 --> 
<div class="content" id="content" style="display: none;"> 
<!-- 这里放置真实的内容,如图片、文本等 --> 
<h1>欢迎来到我的网站</h1> <p>这是一些示例内容...</p>
 <!-- 更多内容... --> </div> 
<script>
 // 假设这是一个模拟异步加载真实内容的函数 
function loadContent() { 
// 模拟异步加载过程(使用setTimeout)
 setTimeout(() => { 
// 隐藏骨架屏
 document.getElementById('skeleton').classList.add('loaded'); 
// 显示真实内容 
document.getElementById('content').style.display = 'block';
 }, 2000);
 // 假设加载需要2秒 
} 
// 页面加载完成后立即执行
 window.onload = loadContent; 
</script> 
</body> 
</html> 

在上面的示例代码中,创建了一个骨架屏容器和一个真实内容容器,然后在页面加载完成后,通过loadContent函数模拟异步加载真实内容的过程,在这个加载过程中,骨架屏容器可见,真实内容容器隐藏,当真实内容加载完成后,通过修改CSS类名来隐藏骨架屏并显示真实内容。通过这种方式,我们可以在用户等待真实内容加载时,展示一个与页面结构相似的骨架屏,提升用户体验,而且我们也可以根据实际需求调整骨架屏的样式和动画效果,使其更加符合页面的整体风格。

结束语

通过本文的分享介绍,尤其是作为前端开发者来看,上述几个问题都是很有代表性的,也是日常开发中经常会遇到的,尤其是现在前端技术的不断发展和用户对网页加载速度的要求日益提高,骨架屏作为一种有效的用户体验优化手段,正逐渐受到开发者的青睐,通过为页面加载过程提供视觉反馈,骨架屏能够有效缓解用户的等待焦虑,提高用户的满意度。但是在设计和实现骨架屏时,我们需要注意保持其简洁明了,与页面整体风格相协调,因为合理的动画效果和过渡效果也能进一步提升用户体验。我个人觉得前端优化首屏加载速度需要从多个方面入手,借助通过采用多图片的懒加载、避免用户多次点击请求以及使用骨架屏等技术手段,可以有效提升网页的首屏加载速度提升用户体验,但是也需要注意在优化过程中保持代码的清晰和可维护性,为后续的维护和升级打下基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1879858.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大模型压缩量化方案怎么选?无问芯穹Qllm-Eval量化方案全面评估:多模型、多参数、多维度

基于 Transformer架构的大型语言模型在各种基准测试中展现出优异性能&#xff0c;但数百亿、千亿乃至万亿量级的参数规模会带来高昂的服务成本。例如GPT-3有1750亿参数&#xff0c;采用FP16存储&#xff0c;模型大小约为350GB&#xff0c;而即使是英伟达最新的B200 GPU 内存也只…

5G NR PUSCH物理层过程

物理层过程 加扰 假设要在单个码字q上传输的bit块为 b ( q ) ( 0 ) , . . . , b ( q ) ( M b i t ( q ) − 1 ) b^{(q)}(0),...,b^{(q)}(M_{bit}^{(q)} - 1) b(q)(0),...,b(q)(Mbit(q)​−1) &#xff0c;其中 M b i t ( q ) M_{bit}^{(q)} Mbit(q)​是总比特数&#xff0c;加…

MySQL高级-MVCC-隐藏字段

文章目录 1、介绍2、测试2.1、进入服务器中的 /var/lib/mysql/atguigu/2.2、查看有主键的表 stu2.3、查看没有主键的表 employee2.3.1、创建表 employee2.3.2、查看表结构及其其中的字段信息 1、介绍 ---------------- | id | age | name | ---------------- | 1 | 1 | Js…

云计算与 AI 融合:Amazon Connect 开创客户服务智能时代

在亚马逊云科技 re:Invent 2023 大会上&#xff0c;Amazon Connect 引入生成式人工智能功能&#xff0c;标志着客户服务迎来了智能化的新时代。云计算作为提供弹性、可靠、高效服务的基础&#xff0c;与人工智能的融合为客户服务注入了新的活力。这次推出的新功能不仅仅是技术的…

Python和MATLAB粘性力接触力动态模型半隐式欧拉算法

&#x1f3af;要点 &#x1f3af;运动力模型计算制作过程&#xff1a;&#x1f58a;相机捕捉网球运动图&#xff0c;制定运动数学模型&#xff0c;数值微分运动方程 | &#x1f58a;计算运动&#xff0c;欧拉算法离散积分运动&#xff0c;欧拉-克罗默算法微分运动方程 &#…

神经网络实战2-损失函数和反向传播

其实就是通过求偏导的方式&#xff0c;求出各个权重大小 loss函数是找最小值的&#xff0c;要求导&#xff0c;在计算机里面计算导数是倒着来的&#xff0c;所以叫反向传播。 import torch from torch.nn import L1Lossinputstorch.tensor([1,2,3],dtypetorch.float32) targe…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 灰度图像恢复(100分) - 三语言AC题解(Python/Java/Cpp)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; &#x1f…

Android 根证书管理与证书验证

大部分的安卓应用都免不了与后端服务器进行通信。在通信过程中&#xff0c;主要面临两方面的风险&#xff1a;1、中间人攻击。当通信使用 HTTP 等明文协议&#xff0c;通信内容可被嗅探甚至篡改。2、通信内容被攻击者分析。使用加密的协议&#xff0c;虽然避免了中间人攻击&…

RocketMQ 顺序消息和事务消息及其原理

RocketMQ 顺序消息和事务消息 1、Spring Cloud Alibaba RocketMq 架构图2、RocketMQ 顺序消息2.1、RockerMQ 实现顺序消费2.1.1、顺序发消息2.1.2、顺序收消息 2.2、顺序发送的技术原理2.3、顺序消费的技术原理 3、RocketMQ 的事务消息3.1、RocketMQ 事务消息流程3.2、事务消息…

查看Windows启动时长

&#xff08;附图片&#xff09;电脑自带检测开机时长---查看方式_电脑开机时长命令-CSDN博客 eventvwr - Windows日志 - 系统 - 查找 - 6013.jpg

如何借助 LLM 设计和实现任务型对话 Agent

1 引言 在人工智能的快速发展中&#xff0c;任务型对话 Agent 正成为提升用户体验和工作效率的关键技术。这类系统通过自然语言交互&#xff0c;专注于高效执行特定任务&#xff0c;如预订酒店或查询天气。尽管市场上的开源框架如 Rasa 和 Microsoft Bot Framework 在对话理解…

使用ioDraw,AI绘图只需几秒钟!

只需几秒钟&#xff0c;就能将文字或图片转化为精准的思维导图、流程图、折线图、柱状图、饼图等各种图表&#xff01; 思维导图 思维导图工具使用入口 文字转思维导图 将文本大纲或想法转换成可视化的思维导图&#xff0c;以组织和结构化您的想法。 图片转思维导图 从现有…

汽车电子工程师入门系列——AUTOSAR通信服务框架(下)

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…

垃圾回收与算法

目录 一、判断对象已经 "死亡" 1、引用计数法 2、可达性分析 二、垃圾收集算法 1、标记清楚算法 2、复制算法 3、标记整理算法 4、分代收集算法 4.1、新生代与复制算法 4.2老年代与标记复制算法 一、判断对象已经 "死亡" 1、引用计数法 在 Java 中&#…

基于STM32的温湿度检测TFT屏幕proteus恒温控制仿真系统

一、引言 本文介绍了一个基于STM32的恒温控制箱检测系统&#xff0c;该系统通过DHT11温湿度传感器采集环境中的温湿度数据&#xff0c;并利用TFT LCD屏幕进行实时显示。通过按键切换页面显示&#xff0c;通过按键切换实现恒温控制箱的恒温控制。为了验证系统的可靠性和稳定性&…

低代码表单配置平台替代普通表单配置平台,前端部分重构的设计和思路

前言 最近将公司的旧表单配置平台重构为低代码表单配置平台&#xff0c;这里记录一下这个过程的设计和思路&#xff0c;不涉及具体的代码&#xff1b;另外这篇文章基本只涉及前端部分&#xff0c;也不涉及与后端数据交互部分。 需求 固化的表单配置平台 -> 灵活的表单配置…

python格式文件

python小白考后复习 CSV格式文件ini格式文件我们可以读取所有节点还可以输出一个节点下所有键值对组成的元组获取节点下的键对应的值判断节点是否存在添加节点还可以添加键值还可以删除节点 XML格式文件读取若是文件格式存在的xml若是以字符串形式存在的xml获取子标签还有获取子…

【最长公共前缀 动态规划】2430. 对字母串可执行的最大删除数

如果有不明白的&#xff0c;请加文末QQ群。 本文涉及知识点 最长公共前缀 动态规划 动态规划汇总 LeetCode 2430. 对字母串可执行的最大删除数 给你一个仅由小写英文字母组成的字符串 s 。在一步操作中&#xff0c;你可以&#xff1a; 删除 整个字符串 s &#xff0c;或者 …

Sping源码(九)—— Bean的初始化(非懒加载)— Bean的创建方式(构造器方法)

序言 前面几篇文章介绍了Spring中几种方式下Bean对象的实例化的过程&#xff0c;那如果之前的几种都不满足&#xff0c;按照Spring中正常Bean的实例化步骤&#xff0c;该如何创建这个Bean对象呢&#xff1f; 测试类 我们先创建几个debug中用到的栗子。 Person 以一个平平无…

pytest-两种不同写法

XUnit 的写法 熟悉 unittest 框架的人都知道&#xff0c;unittest 里面 fixture 的写法是 setUp 和 tearDown&#xff0c;setUp_class 和 tearDown_class&#xff0c;只有这一种写法&#xff0c;而且是固定的写法哈。 Pytest 是兼容 unittest 的&#xff0c;当然也支持这样写…