前端面试题目---页面抖动的原因、如何避免、如何解决
前端页面抖动是一个常见且影响用户体验的问题,下面将从抖动发生的场景、解决办法以及预防措施三个方面进行详细阐述。
页面抖动发生的场景
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的形式输入输出,与力扣的形式不一样,考察头文件的书写、数据结构的书写、…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...

7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...

51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...