前端面试题之性能优化篇

懒加载

图片懒加载

懒加载的概念

懒加载也叫延迟加载,按需加载,指在长网页中延时加载图片数据,是一种比较好的网页性能优化的方式。在比较长的网页或应用中,如果图片加载很多,所有图片都加载出来,而用户只能看到可是窗口的那一部分图片,这样就浪费性能。

懒加载的特点

  • 减少无用资源的加载:使用懒加载明显减少服务器的压力和流量,同时减少浏览器的负担
  • 提升用户体验:如果同时加载较多图片,可能需要等待的时间较长,这样影响了用户体验
  • 防止加载过多的图片而影响其他资源文件的加载

懒加载实现原理

图片的加载是由src引起的,当对src赋值时,浏览器会请求图片资源,根据这个原理,我们使用HTML5 的data-xxx属性来存储图片路径,在需要加载图片的时候,会将data-xxx中的图片路径赋值给src,这样就实现了图片的按需加载,即懒加载

回流和重绘

回流和重绘的概念和触发条件

(1)回流(也叫重排)
当渲染树中部分或者全部元素的尺寸,结构或者属性发生变化时,浏览器会重新渲染部分或者全部文档过程称为回流

下面这些操作会导致回流:

  • 页面的首次渲染
  • 浏览器的窗口大小发生变化
  • 元素的内容发生变化
  • 元素的尺寸或者位置发生变化
  • 元素的字体大小发生变化
  • 激活css伪类
  • 查询某些属性或者调用某些方法
  • 添加或者删除可见DOM元素

在触发回流(重排)的时候,由于浏览器渲染页面是基于流式布局的,所以当触发回流时会导致周围的DOM元素重新排列,它的影响范围有两种:

  • 全局范围:从根节点开始,对整个渲染树进行重新布局
  • 局部范围:对渲染树的某部位或者一个渲染对象进行重新布局

(2)重绘
当页面中某个元素的样式发生变化,但是不会影响其在文档流中的位置时,浏览器会对元素进行重新绘制,这个过程就叫重绘

下面的操作会导致重绘

  • color、background相关属性:background-color、background-image等
  • outline相关属性:outline-color、outline-width、text-decoration
  • border-radius、visibility、box-shadow

注意:当触发回流时,一定会触发重绘,但是重绘不一定引发回流

如何减少回流和重绘

  • 操作DOM时,尽量在低层级的DOM节点进行操作
  • 不要使用table布局,一个小的改动可能会使整个table进行重新布局
  • 不要频繁的操作元素的样式,对于静态页面,可以修改类名,而不是样式
  • 使用absolute或者fixed,使文档脱离文档流,这样它们发生改变就不会影响其他元素
  • 避免频繁的操作DOM,可以创建一个文档片段documentFragment,在它上面应用所有DOM操作,最后把它添加到文档中

防抖和节流

对防抖和节流的理解

  • 函数防抖是指在事件被触发n秒后在执行回调,如果在这n秒内事件又被触发则重新计算,这可以使用在一些点击请求的事件上,避免因为用户多次点击后向后端发送多次请求
  • 函数节流是指在规定的时间内,只能触发一次回调函数,如果在同一单位时间内某件事被触发多次,只能一次生效。节流可以使用在scroll函数的事件监听上,通过事件节流来降低事件调用的频率

防抖函数的应用场景

  • 按钮提交的场景:防止多次提交按钮,只执行最后提交的一次
  • 服务端验证场景:表单验证需要服务端配合,只执行一段连续的输入事件的最后一次,类似于搜索联想词功能

节流函数的应用场景

  • 拖拽场景:固定时间内只执行一次,防止超高频的触发位置变动
  • 缩放场景:监控浏览器的resize
  • 动画场景:避免短时间内多次触发动画引起性能问题

实现防抖和节流函数

防抖函数的实现

function debounce(fn, wait) {// 首先定义一个定时器let timer = null;// 返回一个函数// 使用闭包能保存变量的值return function () {// 获取参数const args = argumentsconsole.log(timer)// 如果再次触发,先判断定时器状态timer && clearTimeout(timer)// 定时器timer = setTimeout(() => {// this 表示调用debounce()的对象fn.apply(this, args)timer = null}, wait)}
}

使用方法一

document.getElementById("click").addEventListener("click", debounce(callback, 1000))

使用方法二

        const debounceFn = debounce(callback, 1000)document.getElementById("click").addEventListener("click", function(e) {debounceFn(e)})

注意: 不能把 debounce防抖函数放在 监听事件的回调函数里面 否则每次会生成多个防抖函数,不能实现防抖功能

// 注意:这是错误的调用document.getElementById("click").addEventListener("click", function(e) {debounce(callback, 1000)(e)})

节流函数的实现

function throttle(fn, wait) {// 获取当前时间戳let currentTime = Date.now()// 使用闭包return function () {// 获取参数const args = arguments// 获取调用时的时间戳let nowTime = Date.now()// 判断条件if(nowTime - currentTime >= wait) {// 执行回调函数fn.apply(this, args)currentTime = Date.now()}}
}

使用方法

window.addEventListener('resize', throttle(resize, 1000))

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

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

相关文章

c# 字符串转化成语音合成,System.Speech

C# 语音合成可以使用 System.Speech.Synthesis 命名空间中的 SpeechSynthesizer 类来实现。SpeechSynthesizer 类提供了一系列方法和属性,可以用来控制语音合成的过程,包括设置语音、音调、语速等。 下面是一个简单的示例,用来演示如何使用 …

[量子计算与量子信息] 2.1 线性代数

2.1 线性代数 符号对照表 量子力学中,向量使用 ∣ ψ ⟩ \ket \psi ∣ψ⟩ (ket)来表示,可以理解为一个列向量。其对偶向量为 ⟨ ψ ∣ \bra \psi ⟨ψ∣ ,可以理解为行向量。 向量空间中零向量直接用 0 0 0 表示, ∣ 0 ⟩ \…

[100天算法】-目标和(day 79)

题目描述 给定一个非负整数数组,a1, a2, ..., an, 和一个目标数,S。现在你有两个符号 和 -。对于数组中的任意一个整数,你都可以从 或 -中选择一个符号添加在前面。返回可以使最终数组和为目标数 S 的所有添加符号的方法数。示例&#xff…

卸载本地开发环境,拥抱容器化开发

以前在公司的时候,使用同事准备的容器化环境,直接在 Docker 内进行开发,爽歪歪呀。也是在那时了解了容器化开发的知识,可惜了,现在用不到那种环境了。所以打算自己在本地也整一个个人的开发环境,不过因为我…

S-Clustr(影子集群) 重磅更新!黑入工业PLC设备!

公告 项目地址:https://github.com/MartinxMax/S-Clustr 更新预告内容进度SIEMENS S7-200 SMART远程控制进行中 开发人员Blog联系方式提交时间提交内容授权情况ASH_HHhttps://blog.csdn.net/m0_53711047/article/details/133691537?spm1001.2014.3001.5502匿名2023-10-16 2…

USB复合设备构建CDC+HID鼠标键盘套装

最近需要做一个小工具,要用到USB CDCHID设备。又重新研究了一下USB协议和STM32的USB驱动库,也踩了不少坑,因此把代码修改过程记录一下。 开发环境: ST-LINK v2 STM32H743开发板 PC windows 11 cubeMX v6.9.2 cubeIDE v1.13.2 cub…

Feature Pyramid Networks for Object Detection(2017.4)

文章目录 Abstract1. Introduction3. Feature Pyramid NetworksBottom-up pathwayTop-down pathway and lateral connections 7. Conclusion FPN Abstract 特征金字塔是识别系统中检测不同尺度物体的基本组成部分。但最近的深度学习对象检测器避免了金字塔表示,部分…

VS Code画流程图:draw.io插件

文章目录 简介快捷键 简介 Draw.io是著名的流程图绘制软件,开源免费,对标Visio,用过的都说好。而且除了提供常规的桌面软件之外,直接访问draw.io就可以在线使用,堪称百分之百跨平台,便捷性直接拉满。 那么…

重生之我是一名程序员 31

大家晚上好!前面给大家分享了指针与数组的知识,所以今天要给大家分享的知识是——指针数组 相信大家在这里都会有疑问,指针数组是指针还是数组? 在这我们可以类⽐⼀下其他类型的数组,比如整型数组是存放整型的数组&am…

python科研绘图:绘制X-bar图

目录 1.X-bar 图的基本概念 2.X-bar 图的绘制过程 3.X-bar 图的优势 4.X-bar 图的绘制 1.X-bar 图的基本概念 X-bar控制图是一种统计工具,用于监控和控制生产过程中的质量变量。它是过程能力分析和统计过程控制(SPC,Statistical Process…

SystemVerilog学习 (5)——接口

一、概述 验证一个设计需要经过几个步骤: 生成输入激励捕获输出响应决定对错和衡量进度 但是,我们首先需要一个合适的测试平台,并将它连接到设计上。 测试平台包裹着设计,发送激励并且捕获设计的输出。测试平台组成了设计周围的“真实世界”,…

Python---数据序列中的公共方法

公共方法就是 支持大部分 数据 序列。 常见公共方法---简单 运算符描述支持的容器类型合并字符串、列表、元组*复制字符串、列表、元组in元素是否存在字符串、列表、元组、字典not in元素是否不存在字符串、列表、元组、字典 案例: 合并 代码: # …

【Nginx】nginx | 微信小程序验证域名配置

【Nginx】nginx | 微信小程序验证域名配置 一、说明二、域名管理 一、说明 小程序需要添加头条的功能,内容涉及到富文本内容显示图片资源存储在minio中,域名访问。微信小程序需要验证才能显示。 二、域名管理 服务器是阿里云,用的宝塔管理…

【探索Linux】—— 强大的命令行工具 P.15(进程间通信 —— system V共享内存)

阅读导航 引言一、system V的概念二、共享内存(1) 概念(2) 共享内存示意图(3) 共享内存数据结构 三、共享内存的使用1. 共享内存的使用步骤(1)包含头文件(2)获取键值(ftok函数)(3)创…

计算机视觉基础(7)——相机基础

前言 从这一节开始,我们来学习几何视觉。中层视觉包括相机模型、单目几何视觉、对极几何视觉和多目立体视觉等。在学习几何视觉最开始,我们先来学习一下相机模型,了解相机的基本原理,了解相机如何记录影像。 一、数字相机 1.1 基…

nodejs+vue黄河风景线旅游网站的设计与实现-微信小程序-安卓-python-PHP-计算机毕业设计

本文首先对该系统进行了详细地描述,然后对该系统进行了详细的描述。管理人员增加了系统首页、个人中心、用户管理、景点分类管理、景点简介管理、旅游路线管理、文章分类管理、公告文章管理、系统管理理等功能。这套黄河风景线旅游网站是根据当前的现实需要&#xf…

js如何阻塞固定时间

js本身没有提供睡眠方法,因为js阻塞了会导致页面渲染等工作也阻塞,所以一般没有这个需求,但是有时候为了测试,需要一个阻塞方法,下面是方法: 方法一: 使用while循环 let sleep function(ms){…

css中的hover用法示例(可以在vue中制作鼠标悬停显示摸个按钮的效果)

css中的hover 1、hover的定义 hover选择器用于选择鼠标指针浮动在上面的元素,它适用于所有元素,可以用来实现类似于js的一些功能。 2.hover的作用 css中hover属性,鼠标移到上面的时候可以激活,它可以实现悬浮元素上改变样式&a…

如何在 Nginx Proxy Manager(NPM)上部署静态网站

前言 众所周知,我们在之前介绍过 Nginx Proxy Manager(以下简称 NPM) 这个反向代理的神器,对于一些 Docker 搭建的 Web 项目,NPM 能够很轻松地给他们做反向代理。 然而对于一些静态网站,小伙伴们可能不知道怎么用 NP…

Unity反编译:IL2CPP 打包输出的cpp文件和dll(程序集)位置、Mono打包输出的dll(程序集)位置

目录 如题:IL2CPP 打包输出的cpp文件和dll位置(并不会出现在APK里) 如题:Mono打包输出的dll位置 校验平台:Android 如题:IL2CPP 打包输出的cpp文件和dll位置(并不会出现在APK里) Unity Assets同级目录下 Temp/StagingArea/Il2…