当用户访问ip地址,比如 www. aa .com/bb/cc/dd.html

正常情况下是访问一个叫aa.com的服务器里的bb文件夹里的cc文件夹里的dd.html这个文件(其实很多情况都是假的地址,做了服务器代理,前端路由等安全处理,就先这么理解吧!)

然后服务器读取本地的dd.html这个文件,通过网线传给用户的浏览器,浏览器通过自带的解析方式把dd.html解析

从上到下是html标签,title标签,meta标签,还有link,body,div等等,在解析到src和href时,会再去对应的ip地址请求到数据,一个网页的全部数据可以在F12里查看,如下图所示

一个Frames就是一个网页的意思,有时候一个页面里有很多个Frames,因为html有个标签叫<iframe>可以引入网页,这个标签不熟,没怎么用,在Frames里的Fonts是指文字样式文件,scripts是js文件,stylesheets是css文件,还会有image图片文件

解析文件的全过程

  • 解析 HTML,构建 DOM Tree
  • Bytes => characters => tokens => nodes => DOM
  • 下载 CSS,解析 CSS,生成 CSS Tree
  • Bytes => characters => tokens => nodes => CSSOM
  • 合并 DOM Tree 和 CSS Tree,生成 Render Tree
  • Render Tree 和 DOM Tree 相对应的,但不是严格意义上的一一对应,不可见的 DOM 元素不会插入到 Render Tree 中 display: none 等
  • 对 Render Tree 的计算通常只需要遍历一次就可以完成,但 table 及其内部元素除外,他们可能需要多次计算,通常要花3倍于同等元素的时间
  • CSS 下载时异步,不会阻塞浏览器构建 DOM Tree,但是会阻塞 Render Tree 渲染,
  • 位于css加载语句前的那个js代码先执行了,但是位于css加载语句后面的代码迟迟没有执行, 直到css加载完成后,它才执行,css加载会阻塞后面的js语句的执行
  • 当遇到 JS 时,Render Tree渲染过程会被吊起,因为他怕JS运行过程中修改DOM或者CSS,就白渲染了,所以等待 JS 执行完毕,这就是js加载会拦截DOM渲染,这也是为什么script标签需要被放在html的最下面的原因

下面就是Render Tree的理解模型

var html = {
style:"", //样式
attr:"", //属性
event:"", //方法
child:[
head:{
...
},
body:{
...
}
]
}

初绘,重排,重绘

先解析后再根据样式,什么颜色,什么大小,什么位置画上浏览器被用户看到,这个绘制的过程叫做初绘

后续的页面会通过用户的使用而发生改变,比如按钮被点击后变色,比如添加一个输入框,删除一个输入框

元素的改变会引起三种变化,

  1. 重绘(无关本身大小的变化,如颜色)
  2. 重排(本身大小的变化,甚至会引起整个页面一起变化)
  3. 回流(就是重绘 + 重排)

重排对浏览器的计算是非常大的,整个循环无异于再做一个初绘,所以减少页面的重排是非常有力的优化

  1. 能通过改变一次的样式别改两次
  2. 别把整个删了再重新添加上去
  3. 通过fragment把多个元素一起添加上去
  4. ....

上面的优化都是js方面的,学完js就能理解

有些极端的优化还讲究css的写法优先顺序,比如一个div先写width,再写定位是错的,因为浏览器先把div的宽度画出来后发现这个div是定位的,定位的默认宽度是0,于是浏览器把刚画的width擦掉了,等定位画完又去找到这个width,重新画了一次宽度,所以极端主义设计了css的书写规则

  1. 先写定位/浮动/display,
  2. 然后位置top,left,
  3. 然后宽高,
  4. 然后是内外边距/行高,
  5. 最后是字体,颜色

关于dom树的更多相关文章

  1. DOM树操作

    DOM 操作 访问与树关系(节点) 绘制 DOM 树: childNodes, attributes 从一个中心元素访问其所有的直系亲属元素 访问父节点: parentNode 访问上一个兄弟节点: ...

  2. 通过Ztree生成页面html元素Dom树,以及拖拽改变元素的位置

    zTree 是一款依靠 jQuery 实现的多功能 "树插件",http://www.treejs.cn/v3/main.php#_zTreeInfo,功能强大,不多赘述. 下面我 ...

  3. 【VB6】使用VB6创建和访问Dom树【爬虫基础知识 】

    使用VB6创建和访问Dom树 关键字:VB,DOM,HTML,爬虫,IHTMLDocument 我们知道,在VB中一般大家会用WebBrowser来获取和操作dom对象. 但是,有这样一种情形,却让我 ...

  4. jquery: json树组数据输出到表格Dom树的处理方法

    项目背景 项目中需要把表格重排显示 处理方法 思路主要是用历遍Json数组把json数据一个个append到5个表格里,还要给每个单元格绑定个单击弹出自定义对话框,表格分了单双行,第一行最后还要改ro ...

  5. jQuery操作列表数据转成Json再输出为html dom树

    jQuery 把列表数据转成Json再输出为如下 dom树 <div id="menu" class="lv1"> <ul class=&qu ...

  6. 【浏览器渲染原理】渲染树构建之渲染树和DOM树的关系(转载 学习中。。。)

    在DOM树构建的同时,浏览器会构建渲染树(render tree).渲染树的节点(渲染器),在Gecko中称为frame,而在webkit中称为renderer.渲染器是在文档解析和创建DOM节点后创 ...

  7. dom树的介绍,及原理分析

    三.解析和DOM树的构建 1.解析: 由于解析渲染引擎是一个非常重要的过程,我们将会一步步的深入,现在让我们来介绍解析. 解析一个文档,意味着把它转换为一个有意义的结构——代码可以了解和使用的东西,解 ...

  8. 页面全部加载完毕和页面dom树加载完毕

    dom树加载完毕 $(document).ready()//原生写法document.ready = function (callback) {            ///兼容FF,Google   ...

  9. 从Chrome源码看浏览器如何构建DOM树

    .aligncenter { clear: both; display: block; margin-left: auto; margin-right: auto } p { font-size: 1 ...

  10. DOM树的增查改删总结

    DOM树的增查改删总结 摘要:对HTML DOM的操作是前端JavaScript编程时必备的技能,本文是我自己对DOM树操作的总结,主要是方法的罗列,原理性的讲述较少,适合大家用于理清思路或是温习 一 ...

随机推荐

  1. Java 中 VO、PO、DTO、BO、POJO、DAO 之间的区别与解释

    转载:https://www.cnblogs.com/hunmeng/p/11298680.html VO value object:值对象 通常用于业务层之间的数据传递,由new创建,由GC回收. ...

  2. MFC加载图片

    目录 1. 自适应方法 2. 加载原图方法 1. 自适应方法 /* 自适应方法 */ CRect rect; CRect rect1; CImage image; //创建图片类 image.Load ...

  3. Excel使用小技巧

    1.Excel随机设置单元格的内容为整数0或1: 在单元格中写公式:  =ROUND(RAND(),0) 2.设置某个单元格的值为1或0,根据其他3个单元格的值为0或1来确定: 在该单元格中写公式: ...

  4. 【PAT甲级】1010 Radix (25 分)(二分)

    题意: 输入两个数可能包含小写字母,1或者2,进制大小.第三个数为代表第一个数是第四个数进制的,求第二个数等于第一个数时进制的大小,不可能则输出Impossible,第三个数为2代表第二个数是第四个数 ...

  5. Xcode 8 修改已创建工程的 organizion name

    在创建工程时,会需要填写公司信息,对于已创建的工程,新建文件时,公司信息显示为刚开始创建的公司信息.如果需要对公司名称进行修改,需进行以下 可以 打开 工程名.xcodeproj 文件 (显示包内容) ...

  6. 解决 U2000 R017 安装报错: 检查SQL server数据库环境变量信息 ( 异常 ) [ 详细信息 ] PATH环境变量中缺少数据库路径的信息

    U2000 R017 安装报错: 检查SQL server数据库环境变量信息 ( 异常 ) [ 详细信息 ] PATH环境变量中缺少数据库路径的信息 管理员模式打开注册表位置: HKEY_LOCAL_ ...

  7. 本周总结(19年暑假)—— Part7

    日期:2019.8.25 博客期:113 星期日

  8. 怎么样运行jar

    一.制作jar文件 在制作.jar 文件之前你必须先编译好你的.java文件.假设我们的文件目录是c:javamyJavahelloHello.java 现在假设Hello.java的文件内容为: / ...

  9. 最全Redis面试题

    1.什么是Redis? 2.Redis相比memcached有哪些优势? 3.Redis支持哪几种数据类型? 4.Redis主要消耗什么物理资源? 5.Redis的全称是什么? 6.Redis有哪几种 ...

  10. 暑假周进度报告(三)-------版本过高后续问题处理,eclipse编译运行MapReduce以及Hadoop学习

    问题一:Hadoop版本太高 卸载Hadoop3.2.0 我改安装了Hadoop 2.7.7 如果没有权限下载.可以采用如下方式: 卸载完成以后返回原目录即可 后面的jdk卸载也可以采用这种方式. 按 ...