重绘和重排版

浏览器下载完所有的HTML标记,Javascript,CSS,图片之后,它解析文件并创建两个内部数据结构

DOM树 表示页面结构
渲染树 表示DOM节点如何显示

渲染树中为每个需要显示的DOM树木=节点存放至少一个节点(隐藏DOM元素在选桉树中没有对应节点)
渲染树上的节点称为"框"或者"盒",符合CSS模型的定义,将页面元素看作一个具有填充,边距,边框和位置的盒。一
旦DOM树和渲染树构造完毕,浏览器就可以显示(绘制)页面上的元素了。

当DOM改变影响到了元素的几何属性(宽和高)--改变了边框宽在段落中添加文字,将发生一系列后续动作。
浏览器需要重新计算元素的几何属性,而且其他元素的几何属性和位置也会因此改变收到影响。浏览器使渲染树上受到
影响的部分失效,然后重构渲染树。这个过程被称作重排版。重排版完成时。浏览器在一个重绘进程中重新绘制屏幕上
受影响的部分。

不是所有的DOM改变都会影响几何属性。 例如改变元素的背景颜色不会影响它的宽度或高度。在这种情况下,只需要重
绘(不需要重排版),元素的布局没有改变。

发生重排版的情况:

添加或删除可见的DOM元素
元素的位置改变
元素的尺寸改变(边距,填充,边框宽度,宽度,高度等属性改变)
内容改变 文本改变或图片被另外一个不同尺寸的所替代
最初的页面渲染
浏览器窗口改变尺寸

根据改变的性质,渲染树上或大或小的一部分需要重新计算。某些改变个导致重排版整个页面。例如,当一个滚动条出
现。

因为计算量与每次重排版有关,大多数浏览器通过对劣化修改和批量显示优化重排版过程,然而,你可能强迫队列刷新
并要求所有计划改变的部分立刻应用。获取布局信息的操作将导致刷新队列动作。
offsetTop..offsetLeft...offsetWidth...offsetHeight
scrollTop ....
clientTop.....
getComputedStyle() currentStyle in IE //获取非行间样式的兼容性
document.body.currentStyle getComputedStyle(document.body)

布局信息由这些属性和方法返回最新的数据,所以浏览器不得不运行渲染队列中待改变的项目并重新排版以返回正确的
值。

在改变风格的过程中,最好不要使用前面列出的那些属性。任何一个访问都将刷新渲染队列。即使你正在获取那些最近
未发生改变的或与最新的改变无关的布局信息。

最小化重绘和重排版

el.style.borderLeft="1px";
el.style.borderRight="2px";
el.style.borderPadding="5px";

这里改变的三个风格属性,每次改变都影响到了元素的几何属性。它导致浏览器重排版了三次。
大多数现代浏览器优化了这种情况只进行了一次重排版,但老式的浏览器中,效率低下。

一次性改变风格的办法:
cssText属性:
el.style.cssText="border-left:1px; border-right:2px; padding:5px;"
cssText会覆盖之前的CSS样式,
el.style.cssText+="border-left:1px;"

修改CSS的类名称
el.className="active"

批量修改DOM

减少重绘和重排的次数
1.从文档中摘除该元素
2.对其应用多重改变

转载于:https://www.cnblogs.com/xxza/p/4696391.html

高性能javascript读书笔记(三.DOM 编程2)相关推荐

  1. 高性能JavaScript 读书笔记

    第一章:加载和执行 浏览器的JavaScript的引擎是编译器层的优化: 当浏览器执行JavaScript代码时,不能同时做其他任何事情(单一进程),意味着<script>标签每次出现都霸 ...

  2. ie插件获取dom_读书笔记《DOM编程艺术》DOM

    DOM的理解 1.1 D:当创建了一个网页并把它加载到Web浏览器中时,DOM就生成了,它将我们编写的网页文档转换成一个文档对象. 1.2 O:"对象"是一种自足的数据集合,相关联 ...

  3. 《编程之美》读书笔记(三):烙饼问题与搜索树

    <编程之美>读书笔记三:烙饼问题与搜索树 薛笛 EMail:jxuedi#gmail.com 前面已经写了一些关于烙饼问题的简单分析,但因为那天太累有些意犹未尽,今天再充实一些内容那这个问 ...

  4. mysql数据库权威指南_MySQL_MySQL权威指南读书笔记(三),第二章:MYSQL数据库里面的数 - phpStudy...

    MySQL权威指南读书笔记(三) 第二章:MYSQL数据库里面的数据 用想用好MYSQL,就必须透彻理解MYSQL是如何看待和处理数据的.本章主要讨论了两个问题:一是SQL所能处理的数据值的类型:二是 ...

  5. 读书笔记——《Python编程从入门到实践》第二章

    读书笔记--<Python编程从入门到实践>第二章 读书笔记--<Python编程从入门到实践>第二章 变量 如何使用变量 如何规范变量命名 字符串 字符串是什么 如何修改字符 ...

  6. 《How Tomcat Works》读书笔记(三)--Connector(连接器)

    <How Tomcat Works>读书笔记(三)--Connector(连接器) 这是<How Tomcat Works>第三四章的读书笔记.主要写了Tomcat4.0默认的 ...

  7. 构建高性能WEB站点笔记三

    构建高性能WEB站点笔记三 第10章 分布式缓存 10.1数据库的前端缓存区 文件系统内核缓冲区,位于物理内存的内核地址空间,除了使用O_DIRECT标记打开的文件以外,所有对磁盘文件的读写操作都要经 ...

  8. Python学习笔记三之编程练习:循环、迭代器与函数

    Python学习笔记三之编程练习 1. 编程第一步 # 求解斐波纳契数列 #/user/bin/python3#Fibonacci series:斐波那契数列 #两个元素的总和确定了下一个数 a,b= ...

  9. TCPIP详解Protocol 读书笔记(三) IP协议讲解

    TCP/IP详解:Protocol 读书笔记(三) Chapter3 IP:网际协议 文章目录 TCP/IP详解:Protocol 读书笔记(三) Chapter3 IP:网际协议 IP协议 IP数据 ...

最新文章

  1. 记java关键词_Java关键词及含义
  2. mysql隔离级别 简书_InnoDB 事务隔离级别(Mysql篇)
  3. 浅析Microsoft .net PetShop程序中的购物车和订单处理模块(Profile技术,异步MSMQ消息)转...
  4. 通常你会在什么地方遇到DBNull?
  5. VS Code 的常用快捷键
  6. 自定义手势--输入法手势技术
  7. LeetCode 242. 有效的字母异位词 (计数排序思想字符处理)
  8. Python调用API接口的几种方式
  9. 【DFS + backtrack】LeetCode 37. Sudoku Solver
  10. 微信小程序开发入门与实践
  11. C++笔记----运算符重载
  12. 《塞尔达传说》系列游戏评测
  13. 全国计算机二级ps考什么,计算机二级ps考试内容有哪些
  14. npy/npz/pkl/csv长字符串存储
  15. 2021-06-03TunePat Amazon Video Downloader使用教程:如何下载电影和电视节目
  16. trouble processing xxxx.class: Ill-advised or mistaken usage of a core class (java.* or javax.*)
  17. Git汇总--版本库操作
  18. SLO 和 SLI的最佳实践
  19. RIDE 访问数据库
  20. I.MX6U嵌入式Linux应用编程学习

热门文章

  1. android 广播观察者,作业三——观察者模式在Android广播机制上的应用
  2. 迁移学习SSD深度网络模型,实现文本行检测
  3. 结合上下文和篇章特征的多标签情绪分类
  4. 如何配置神经网络中的层数和节点数
  5. tensorflow支持python3.7吗_前端开发行业真的会被AI取代吗?
  6. mysql安装与测试,MySQL NDB 安装的安装配置与测试
  7. VS2012下基于Glut 绘制矩形管示例程序:
  8. [HTML5]使用Box2dWeb模拟飞行箭矢
  9. android没有实现glFlush或glFinish
  10. Linux下卸载vmware