当前位置: 首页 > news >正文

前端基础入门三大核心之HTML篇:深入理解重绘与重排 —— 概念、区别与实战演练

前端基础入门三大核心之HTML篇:深入理解重绘与重排 —— 概念、区别与实战演练

    • HTML渲染基础回顾
    • 重绘与重排的概念
      • 重绘(Repaint)
      • 重排(Reflow)
    • 区别与影响
    • 实战示例:优化策略与代码演示
      • 示例1:避免连续修改样式属性
      • 示例2:使用`requestAnimationFrame`控制动画重绘
      • 示例3:离线DOM操作与批量修改
    • 安全性与性能优化小贴士
    • 结语与讨论

在前端开发的征途中,性能优化始终是开发者绕不开的话题。而深入理解浏览器的渲染机制,特别是“重绘”(Repaint)与“重排”(Reflow)这两个核心概念,对于提升页面加载速度及用户体验至关重要。本文将从基本概念出发,逐步深入探讨它们的区别、应用场景以及如何通过实战示例来优化这些过程,确保你的前端项目既高效又健壮。

HTML渲染基础回顾

在正式展开之前,让我们快速回顾一下浏览器如何渲染HTML文档。浏览器接收到HTML、CSS及JavaScript后,会经历以下几个关键步骤:

  1. 解析:将HTML转换为DOM树。
  2. 样式计算:结合CSS生成CSSOM(CSS Object Model)。
  3. 布局:将DOM与CSSOM合并,计算出每个节点的几何位置,形成布局树(Layout Tree)。
  4. 绘制:根据布局树,将元素绘制到屏幕上。

重绘与重排的概念

重绘(Repaint)

当元素的外观发生变化,但不涉及布局时(如颜色改变),浏览器仅需重新绘制该元素。这一过程相对轻量级,因为它不涉及布局计算。

重排(Reflow)

当页面的布局结构发生变化,导致浏览器需要重新计算元素的位置和尺寸时,就会触发重排。重排是一个成本高昂的过程,因为它会从DOM树开始,重新执行样式计算、布局和绘制等一系列步骤。

区别与影响

  • 区别:重绘仅更新元素的视觉外观,不改变布局;而重排则涉及到布局的重新计算,影响更为广泛。
  • 性能影响:频繁的重排会导致页面响应缓慢,用户体验下降。因此,减少不必要的重排是性能优化的关键。

实战示例:优化策略与代码演示

示例1:避免连续修改样式属性

问题场景:连续修改多个会影响布局的样式属性,如宽度和高度。

优化前代码:

let element = document.getElementById('myElement');
element.style.width = '200px';
element.style.height = '100px';

优化后代码:

let element = document.getElementById('myElement');
// 使用CSS class或一次性设置style,减少重排次数
element.classList.add('newSize'); // 在CSS中定义.newSize { width: 200px; height: 100px; }
// 或者
element.style.cssText = 'width: 200px; height: 100px;';

示例2:使用requestAnimationFrame控制动画重绘

问题场景:直接使用setTimeoutsetInterval进行动画可能会导致不必要的重绘。

优化代码:

function animate() {let element = document.getElementById('animatedElement');let position = 0;function step() {// 使用requestAnimationFrame进行动画,浏览器会自动优化重绘时机requestAnimationFrame(() => {position += 5;element.style.left = position + 'px';if (position < 900) {step();}});}step();
}
animate();

示例3:离线DOM操作与批量修改

问题场景:直接在DOM上频繁添加或删除元素。

优化代码:

let fragment = document.createDocumentFragment();
for(let i = 0; i < 1000; i++) {let item = document.createElement('div');item.textContent = 'Item ' + i;fragment.appendChild(item);
}document.getElementById('container').appendChild(fragment); // 一次性添加到DOM

安全性与性能优化小贴士

  • 避免在布局临界区(Layout Thrashing):减少在JavaScript中读取布局属性(如offsetWidth)的次数,因为每次读取都可能触发重排。
  • 使用will-change属性:谨慎使用,仅对确实需要优化动画性能的元素预声明可能的变化,以允许浏览器提前优化。
  • 考虑CSS动画和过渡:相较于JavaScript动画,CSS动画通常由浏览器更高效地处理,减少重排和重绘的需求。

结语与讨论

深入理解并有效管理重绘与重排,是前端性能优化的重要一环。通过上述实例,我们不仅学习了如何识别和避免性能瓶颈,还掌握了实用的优化策略。但前端领域的探索永无止境,欢迎大家分享更多实战经验和见解,共同推进前端技术的发展,让我们的网页更加流畅和高效。是否还有其他特定场景下的重排/重绘问题困扰着你?留言区期待你的提问与讨论!


欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。


推荐:DTcode7的博客首页。
一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身农奴把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟!


【专栏导航】

  • 《微信小程序相关博客》:结合微信官方原生框架、uniapp等小程序框架,记录请求、封装、tabbar、UI组件的学习记录和使用技巧等
  • 《Vue实战相关博客》:详细总结了常用UI库elementUI的使用技巧以及Vue的学习之旅。
  • 《HTML网站开发相关博客》:以实战为线素,逐步深入HTML开发各个环节,掌握web前端常用性能体验优化思路,打造完整前端工作流,提升工程化编码能力和思维能力。
  • 《前端基础入门三大核心之html相关博客》:前端基础入门三大核心之html板块的内容,入坑前端或者辅助学习的必看知识。
  • 《前端基础入门三大核心之JS相关博客》:前端JS是JavaScript语言在网页开发中的应用,负责实现交互效果和动态内容。它与HTML和CSS并称前端三剑客,共同构建用户界面。通过操作DOM元素、响应事件、发起网络请求等,JS使页面能够响应用户行为,实现数据动态展示和页面流畅跳转,是现代Web开发的核心。
  • 《前端基础入门三大核心之CSS相关博客》:介绍前端开发中遇到的CSS疑问和各种奇妙的CSS语法,同时收集精美的CSS效果代码,用来丰富你的web网页。
  • 《canvas绘图相关博客》:Canvas是HTML5中用于绘制图形的元素,通过JavaScript及其提供的绘图API,开发者可以在网页上绘制出各种复杂的图形、动画和图像效果。Canvas提供了高度的灵活性和控制力,使得前端绘图技术更加丰富和多样化。
  • 《算法系列相关博客》:算法与数据结构学习总结,通过JS来编写处理复杂有趣的算法问题,提升你的技术思维。
  • 《python相关博客》:Python,简洁易学的编程语言,强大到足以应对各种应用场景,是编程新手的理想选择,也是专业人士的得力工具。
  • 《sql数据库相关博客》:SQL数据库:高效管理数据的利器,学会SQL,轻松驾驭结构化数据,解锁数据分析与挖掘的无限可能。
  • 《IT信息技术相关博客》:作为信息化人员所需要掌握的底层技术,涉及软件开发、网络建设、系统维护等领域的知识。
  • 《信息化技能面试宝典相关博客》:涉及信息化相关工作基础知识和面试技巧,提升自我能力与面试通过率,扩展知识面。
  • 《前端开发习惯与小技巧相关博客》:罗列常用的开发工具使用技巧,如 Vscode快捷键操作、Git、CMD、游览器控制台等
  • 《AIGC相关博客》:AIGC、AI生产力工具的介绍,例如stable diffusion这种的AI绘画工具安装、使用、技巧等总结
  • 《photoshop相关博客》:基础的PS学习记录,含括PPI与DPI、物理像素dp、逻辑像素dip、矢量图和位图以及帧动画等的学习总结
  • 《日常开发&办公&生产【实用工具】分享相关博客》:分享介绍各种开发中、工作中、个人生产以及学习上的工具,丰富阅历,给大家提供处理事情的更多角度,学习了解更多的便利工具,如Fiddler抓包、办公快捷键、虚拟机VMware等工具。

吾辈才疏学浅,摹写之作,恐有瑕疵。望诸君海涵赐教。望轻喷,嘤嘤嘤
非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。愿斯文对汝有所裨益,纵其简陋未及渊博,亦足以略尽绵薄之力。倘若尚存阙漏,敬请不吝斧正,俾便精进!

相关文章:

  • vue 纵向滚动菜单, 点击滚动到选中菜单
  • 【项目托管git】本地项目托管到 Gitee
  • 机器学习-决策树算法
  • IDEA连接MySQL后如何管理数据库
  • JavaSE——类和对象(二)~~封装
  • 光耦合器的特性和应用概述
  • Mac电脑太卡了怎么办 Mac电脑常见问题 cleanmymacX有必要买吗
  • tensorflow下载
  • 编一个自己的万年历
  • 接口使用实例——数组排序
  • (delphi11最新学习资料) Object Pascal 学习笔记---第13章第1节 (全局数据、栈和堆)
  • Android Audio基础——AudioFlinger回放录制线程(七)
  • 【NUCLEO-G071RB】007——IWDG-喂狗
  • 网站策划是什么
  • 专注于运动控制芯片、运动控制产品研发、生产与销售为一体的技术型芯片代理商、方案商——青牛科技
  • 「面试题」如何实现一个圣杯布局?
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • docker python 配置
  • linux安装openssl、swoole等扩展的具体步骤
  • Node + FFmpeg 实现Canvas动画导出视频
  • PHP 的 SAPI 是个什么东西
  • Python3爬取英雄联盟英雄皮肤大图
  • Python爬虫--- 1.3 BS4库的解析器
  • v-if和v-for连用出现的问题
  • vue:响应原理
  • 从零开始学习部署
  • 后端_ThinkPHP5
  • 记一次用 NodeJs 实现模拟登录的思路
  • 离散点最小(凸)包围边界查找
  • 前端技术周刊 2019-01-14:客户端存储
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 什么软件可以剪辑音乐?
  • 一道面试题引发的“血案”
  • 带你开发类似Pokemon Go的AR游戏
  • 移动端高清、多屏适配方案
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • ​渐进式Web应用PWA的未来
  • #stm32整理(一)flash读写
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • %check_box% in rails :coditions={:has_many , :through}
  • (¥1011)-(一千零一拾一元整)输出
  • (4) PIVOT 和 UPIVOT 的使用
  • (pojstep1.1.2)2654(直叙式模拟)
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (每日一问)基础知识:堆与栈的区别
  • (南京观海微电子)——COF介绍
  • (十)c52学习之旅-定时器实验
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版