前端面试题目---页面抖动的原因、如何避免、如何解决
前端页面抖动是一个常见且影响用户体验的问题,下面将从抖动发生的场景、解决办法以及预防措施三个方面进行详细阐述。
页面抖动发生的场景
1. 元素尺寸动态变化
- 图片加载:当页面中图片的宽高没有预先设定,在图片加载完成后,其实际尺寸会撑开所在容器,导致周围元素位置发生变动,从而产生页面抖动。例如,在一个新闻列表中,图片占位区域初始高度为 0,图片加载完成后撑开高度,列表会整体向下移动。
- 内容动态更新:像一些实时更新数据的页面,如股票行情页面,当数据更新时,显示数据的元素内容长度改变,会使元素宽度或高度变化,引发页面抖动。
2. 滚动条出现或消失
- 内容溢出:当页面内容超过可视区域高度或宽度时,滚动条会出现;而当内容减少到不溢出时,滚动条又会消失。滚动条的出现和消失会占据一定的宽度(垂直滚动条)或高度(水平滚动条),导致页面布局发生微小变化,产生抖动。
- 模态框弹出:当模态框弹出时,页面的滚动会被禁止,滚动条消失;模态框关闭后,滚动条又会重新出现,这一过程会造成页面抖动。
3. CSS 动画和过渡
- 动画计算误差:在使用 CSS 动画或过渡效果时,由于浏览器的渲染计算存在一定误差,可能会导致元素在动画过程中出现轻微的位置偏移或抖动。例如,在一个元素的旋转动画中,可能会出现旋转不流畅的抖动现象。
- 动画触发条件:当动画的触发条件频繁变化时,如鼠标悬停在元素上触发动画,鼠标快速进出元素,会使动画不断开始和停止,导致页面抖动。
4. 浏览器重排和重绘
- 频繁操作 DOM:在 JavaScript 中频繁修改 DOM 元素的样式、添加或删除元素等操作,会触发浏览器的重排和重绘。重排是指浏览器重新计算元素的布局信息,重绘是指重新绘制元素的外观。频繁的重排和重绘会导致页面抖动。例如,在一个循环中不断修改元素的宽度和高度。
- 响应式布局切换:当浏览器窗口大小改变时,响应式布局会根据不同的媒体查询规则重新调整元素的布局,这一过程可能会触发多次重排和重绘,引起页面抖动。
解决页面抖动问题的方法
1. 针对元素尺寸动态变化
- 预设图片尺寸:在 HTML 或 CSS 中为图片设置固定的宽度和高度,这样在图片加载过程中,占位区域的大小不会改变,避免页面抖动。例如:
html
<img src="example.jpg" width="300" height="200" alt="Example Image">
- 使用占位符:在内容动态更新前,先显示占位符元素,占位符的尺寸与实际内容的尺寸一致,等内容加载完成后再替换占位符,保证页面布局稳定。
2. 针对滚动条出现或消失
- 固定滚动条:可以通过 CSS 强制页面始终显示滚动条,避免滚动条出现和消失带来的布局变化。例如:
css
html {overflow-y: scroll;
}
- 模态框处理:在模态框弹出时,给页面添加一个类名,通过 CSS 让页面的内容区域可以在模态框内滚动,而不影响页面整体的滚动条状态。
3. 针对 CSS 动画和过渡
- 优化动画代码:检查 CSS 动画和过渡的代码,确保动画的关键帧和过渡属性设置合理,避免出现不必要的计算误差。例如,使用
transform属性进行动画操作,因为transform不会触发重排,性能更好。
css
.element {transition: transform 0.3s ease;
}
.element:hover {transform: scale(1.1);
}
- 防抖和节流:对于频繁触发的动画事件,如鼠标悬停事件,可以使用防抖和节流技术来限制事件的触发频率,避免动画的频繁开始和停止。
4. 针对浏览器重排和重绘
- 批量修改 DOM:将多次 DOM 操作合并为一次,减少重排和重绘的次数。例如,先创建一个文档片段,在文档片段中进行所有的 DOM 操作,最后将文档片段添加到页面中。
javascript
const fragment = document.createDocumentFragment();
const newElement = document.createElement('div');
newElement.textContent = 'New Content';
fragment.appendChild(newElement);
document.body.appendChild(fragment);
- 缓存布局信息:在 JavaScript 中,如果需要多次读取元素的布局信息(如宽度、高度、位置等),可以先将这些信息缓存起来,避免多次读取触发重排。
避免页面抖动问题的预防措施
1. 前端开发规范
- 合理规划布局:在设计页面布局时,充分考虑元素的尺寸和位置变化,避免因内容动态更新或图片加载等因素导致布局不稳定。
- 使用响应式设计:采用响应式设计原则,确保页面在不同设备和屏幕尺寸下都能保持稳定的布局。同时,合理设置媒体查询断点,避免频繁的布局切换。
2. 性能优化
- 图片优化:对图片进行压缩和裁剪,减少图片的加载时间和文件大小。同时,根据不同的设备和屏幕分辨率,提供不同尺寸的图片,避免图片过大或过小导致的布局问题。
- 代码压缩和合并:压缩和合并 CSS 和 JavaScript 文件,减少文件的请求数量和大小,提高页面的加载速度,降低因资源加载导致的页面抖动风险。
3. 测试和调试
- 多浏览器和设备测试:在不同的浏览器和设备上进行页面测试,检查是否存在页面抖动问题。不同浏览器的渲染引擎和性能表现可能会有所差异,及时发现并解决兼容性问题。
- 性能监测工具:使用浏览器的开发者工具和性能监测工具,如 Chrome DevTools 中的 Performance 面板,分析页面的性能瓶颈和重排重绘情况,提前发现并优化可能导致页面抖动的问题。
相关文章:
前端面试题目---页面抖动的原因、如何避免、如何解决
前端页面抖动是一个常见且影响用户体验的问题,下面将从抖动发生的场景、解决办法以及预防措施三个方面进行详细阐述。 页面抖动发生的场景 1. 元素尺寸动态变化 图片加载:当页面中图片的宽高没有预先设定,在图片加载完成后,其实…...
Spring Boot整合DeepSeek实现AI对话(API调用和本地部署)
本篇文章会分基于DeepSeek开放平台上的API,以及本地私有化部署DeepSeek R1模型两种方式来整合使用。 本地化私有部署可以参考这篇博文 全面认识了解DeepSeek利用ollama在本地部署、使用和体验deepseek-r1大模型 Spring版本选择 根据Spring官网的描述 Spring AI是一…...
DeepSeek 的 API 服务引入 WPS Office
以下是将 DeepSeek 的 API 服务引入 WPS Office 的通用集成教程。以调用 DeepSeek 的 AI 功能(如文本生成、数据分析)为例,假设你需要通过 WPS 的宏或插件调用外部 API: 准备工作 注册 DeepSeek 账号并获取 API Key 访问 DeepSe…...
在Vue中,JavaScript数组常用方法,添加,插入,查找,删除等整理
在Vue中,JavaScript数组常用,添加,插入,查找,删除等整理 1.splice()方法可以直接修改原数组,通过指定要删除元素的索引来删除它。 例: let index // 要删除的元素的索引; this.array.splice(i…...
树莓派上 基于Opencv 实现人脸检测与人脸识别
一,需求 基于树莓派4b,usb1080p摄像头,实现人脸检测与人脸识别。尝试了海陵科的模组和百度的sdk。海陵科的模组无法录入人脸,浪费了100多块钱。百度的sdk 在树莓派上也无法录入人脸,官方解决不了。最后只能用opencv自…...
Unity 接入Tripo 文生模型,图生模型
官方网站:https://www.tripo3d.ai/app/home自行注册账号并且登陆下载Unity插件:https://cdn-web.tripo3d.ai/plugin/tripo-unity.zip申请apikey: https://platform.tripo3d.ai/api-keys使用(后续过程就按照第二步下载的插件里面的…...
Redis常见数据结构
目录 基本介绍 特点: 全局命令 数据类型: String Hash List Set Zset 基本介绍 Redis是一个在内存中存储数据的中间件,可作为数据库,缓存,消息队列等。 特点: 持久化:Redis会把数据存储在内存中…...
fps动作系统9:动画音频
文章目录 音频单播放音频文件也是可以的,只不过是2d声音。创建音频蓝图cue(音效)音量乘数 衰减(空间效果)音量自然声音内部半径衰减距离 空间化双声道 绑定到动画动画序列轨道 音频 单播放音频文件也是可以的,只不过是2d声音。 创建音频蓝图 cue(音效…...
十四、GitLab 流水线自动化部署之 Windows Server
一、软件下载 本文章采用 Windows 版本的 Gitlab Runner 客户端,下载地址参考如下: 链接:https://pan.baidu.com/s/1nktWQGR4toRpgzEn9Qj3kQ?pwd0p1d 提取码:0p1d --来自百度网盘超级会员V7的分享 二、环境安装 1、Java 环境…...
数据库数据恢复—MongoDB丢失_mdb_catalog.wt文件导致报错的数据恢复案例
MongoDB数据库存储模式为文档数据存储库,存储方式是将文档存储在集合之中。 MongoDB数据库是开源数据库,同时提供具有附加功能的商业版本。 MongoDB中的数据是以键值对(key-value pairs)的形式显示的。在模式设计上,数据库受到的约束更少。这…...
mysql8.0使用MGR实现高可用与利用MySQL Router构建读写分离MGR集群
MGR是MySQL Group Replication的缩写,即MySQL组复制。 在以往,我们一般是利用MySQL的主从复制或半同步复制来提供高可用解决方案,但这存在以下几个比较严重的问题: 主从复制间容易发生复制延迟,尤其是在5.6以前的版本…...
基于Ubuntu2404搭建k8s-1.31集群
k8s 1.31 环境初始化安装Container安装runc安装CNI插件部署k8s集群安装crictl使用kubeadm部署集群节点加入集群部署Calico网络配置dashboard 本实验基于VMware创建的Ubuntu2404虚拟机搭建k8s 1.31版本集群,架构为一主一从,容器运行时使用Container&#…...
Golang的图形编程应用案例
Golang的图形编程应用案例 一、Golang的图形编程概述 是一种高效、可靠且易于使用的编程语言,具有并发性和简洁性,因此在图形编程领域也有着广泛的应用。Golang的图形编程主要通过各种图形库来实现,其中最知名的是Go图形库(Ebiten…...
PostgreSQL 错误代码 23505 : ERROR: duplicate key value violates unique constraint
目录 1. 确认错误信息2. 检查数据3. 处理重复数据4. 检查唯一约束5. 添加唯一约束6. 使用事务处理并发操作7. 使用触发器8. 使用 ON CONFLICT 子句9. 重置序列10. 捕获异常并重试 错误代码 23505 是 PostgreSQL 中表示违反唯一约束(unique violation)的标…...
基于SpringBoot和PostGIS的省域“地理难抵点(最纵深处)”检索及可视化实践
目录 前言 1、研究背景 2、研究意义 一、研究目标 1、“地理难抵点”的概念 二、“难抵点”空间检索实现 1、数据获取与处理 2、计算流程 3、难抵点计算 4、WebGIS可视化 三、成果展示 1、华东地区 2、华南地区 3、华中地区 4、华北地区 5、西北地区 6、西南地…...
MySQL InnoDB引擎 MVCC
MVCC(Multi-Version Concurrency Control)即多版本并发控制,是 MySQL 的 InnoDB 存储引擎实现并发控制的一种重要技术。它在很多情况下避免了加锁操作,从而提高了数据库的并发性能。 一、原理 MVCC 的核心思想是通过保存数据在某…...
服务器使用centos7.9操作系统前需要做的准备工作
文章目录 前言1.操作记录 总结 前言 记录一下centos7.9操作系统的服务器在部署业务服务之前需要做的准备工作。 大家可以复制到自己的编辑器里面,有需求的注释一些步骤。 备注:有条件的项目推荐使用有长期支持的操作系统版本。 1.操作记录 # 更换阿里云…...
【Prometheus】prometheus结合cAdvisor监控docker容器运行状态,并且实现实时告警通知
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…...
【Stable Diffusion模型测试】测试ControlNet,没有线稿图?
相信很多小伙伴跟我一样,在测试Stable Diffusion的Lora模型时,ControlNet没有可输入的线稿图,大家的第一反应就是百度搜,但是能从互联网上搜到的高质量线稿图,要么收费,要么质量很差。 现在都什么年代了&a…...
算法刷题-数组系列-卡码网.区间和
题目描述 给定一个整数数组 Array,请计算该数组在每个指定区间内元素的总和。 示例: 输入: 5 1 2 3 4 5 0 1 1 3 输出: 3 9 要点 本题目以ACM的形式输入输出,与力扣的形式不一样,考察头文件的书写、数据结构的书写、…...
2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
PostgreSQL——环境搭建
一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在࿰…...
OD 算法题 B卷【正整数到Excel编号之间的转换】
文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的:a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...
前端开发者常用网站
Can I use网站:一个查询网页技术兼容性的网站 一个查询网页技术兼容性的网站Can I use:Can I use... Support tables for HTML5, CSS3, etc (查询浏览器对HTML5的支持情况) 权威网站:MDN JavaScript权威网站:JavaScript | MDN...
从零开始了解数据采集(二十八)——制造业数字孪生
近年来,我国的工业领域正经历一场前所未有的数字化变革,从“双碳目标”到工业互联网平台的推广,国家政策和市场需求共同推动了制造业的升级。在这场变革中,数字孪生技术成为备受关注的关键工具,它不仅让企业“看见”设…...
