浏览器如何解析代码渲染页面

最近看到有的朋友在纠结我们代码和浏览器到底具体发生了什么。

  我们从打开浏览器一步一步开始。

  1. 打开浏览器
  2. 输入网址并搜索
  3. 浏览器解析网址并发送到DNS服务器
  4. 服务器收到信息后将相应的HTML,CSS,JS文件等外部资源发送给浏览器
  5. 浏览器解析将HTML代码称为DOM树结构
  6. 将CSS代码解析成CSSOM结构(CSS Object Model)
  7. 结合DOM和CSSOM构建渲染树
  8. 生成布局,即将所有渲染树的页面进行合成
  9. 将布局绘到屏幕

从第5-9步是真正的渲染过程,从5-7这三步非常快。

"生成布局"(flow)和"绘制"(paint)这两步,合称为"渲染"(render)

 

 

现在简单讲一下浏览器的渲染过程

首先,创建DOM树: 

D: document(文档),没有文档,DOM也就无从谈起,当创建网页就把编写的页面文档转换辰为一个文档对象。

O:对象。对象分为用户自定义对象、内置对象、宿主对象。

M:model(模型),DOM把文档表现成一颗树。其本身就是这个M模型。

例如有这么一段代码:

<html>
<head>
  <title>Beautiful page</title>
</head>
<body>
    
  <p>
    Once upon a time there was 
    a looong paragraph...
  </p>
  
  <div style="display: none">
    Secret message
  </div>
  
  <div><img src="..." /></div>
  ...
 
</body>
</html>

那么DOM树是完全和HTML标签一一对应的,如下所示:
documentElement (html)
    head
        title
    body
        p
            [text node]
                
        div 
            [text node]
                
        div
            img
                

  由此可知我们知道DOM树由一个个节点组成。其中有:元素节点、文本节点、属性节点。当构建完DOM树后,就会开始构建渲染树。

而渲染树就不同了,她只有哪些需要绘制出来的元素,所以head 以及被隐藏的div都不会出现在渲染树中。
root (RenderView)
    body
        p
            line 1
            line 2
            line 3
            ...
            
        div
            img
            
        ...

 

重绘和重排

当页面刚初始化的时候页面就会开始一次重排操作。任何一次对渲染树的修改都会可能导致下面两个操作。

1,重排
就是渲染树的一部分必须要更新 并且节点的尺寸发生了变化。这就会触发重排操作。重排必定会导致重绘。

  • 修改DOM
  • 修改样式表
  • 用户事件(比如鼠标悬停、页面滚动、输入框键入文字、改变窗口大小等等)


2,重绘
部分节点需要更新,但是没有改变他的集合形状,比如改变了背景颜色,这就会触发重绘。

 

 更多请见:阮一峰大神的http://www.ruanyifeng.com/blog/2015/09/web-page-performance-in-depth.html

来源:http://www.cnblogs.com/chase-star/p/10049620.html


智能推荐

浏览器如何解析并显示数据?

PHP案例场景: AJAX调用下面方法: 用 echo 返回 通过 json编码的数据时, ajax为什么能接受到请求那?     因为 :Content-type:text/html  来决定的;  当是 text/html的时候 则以文本的形式展现; 当是 application/json的时候 则解析成json格式 返回给 ajax的回调方法。 &nb...

浏览器工作原理/浏览器是如何渲染页面?

特别提醒:本文出自B站的卢克。 为什么我们要去了解浏览器的工作原理呢?很简单,让你写出更好的代码和提供更好的用户体验。浏览器对于前端工程师,就像赛车对于一个赛车手一样,你需要对自己的战车足够的了解,才能跑的更快,弯道拐的更优雅。伟大的作家鲁迅曾说过,不懂浏览器的前端工程师不是好码农。 1.浏览器发展史 1991年:Berners-Lee建立了第一代网络浏览器:WorldWideWeb。对了,上一期...

浏览器页面渲染原理深入!!

浏览器页面渲染原理深入!! 文章目录 浏览器页面渲染原理深入!! 从用户输入URL到页面渲染显示经历两大部分:网络通信 和 页面渲染 1、网络通信: 总流程: 1.1**输入URL回车** 1.2**开始进行DNS域名解析**:优先从缓存中查找,再从子级域名至顶级域名依次请求相应的DNS服务器,直到拿到相应的IP地址--==使用UDP运输协议== 1.3**开始建立TCP三次报文握手连接** 1....

浏览器页面渲染流程

浏览器渲染流程如下图所示: 大概可以划分成以下几个步骤: (1)解析HTML文件,构建 DOM Tree (2)解析CSS,构建 CSSOM Tree(CSS规则树) (3)将 DOM Tree 和 CSSOM Tree合并,构建Render tree(渲染树) (4)reflow(重排):根据Render tree进行节点信息计算(Layout) (5)repaint(重绘):根据计算好的信息绘...

浏览器渲染页面过程

浏览器渲染页面 从耗时的角度,浏览器请求、加载、渲染一个页面,时间花在下面五件事情上 DNS 查询 TCP 连接 HTTP 请求 服务器响应 客户端渲染 DNS 查询 我们在浏览器输入网址,其实就是要向服务器请求我们想要的页面内容,所有浏览器首先要确认的是域名所对应的服务器在哪里。将域名解析成对应的服务器IP地址这项工作,是由DNS服务器来完成的。 客户端收到你输入的域名地址后,它首先去找本地的h...

猜你喜欢

微信开发者工具从注册到运行

    前段时间一直想学学微信中的小程序是如何制作的,昨天终于有时间就尝试了一下。话不多说,以免跑偏。。。。 1.微信小程序开发需要先在微信公众平台(https://mp.weixin.qq.com)上注册一个自己的公众号。 2.在公众平台上注册成功后,在公众号左侧有一个小程序栏目。点击小程序管理,在左侧就会出现两个选项,在第一次使用小程序当然是没有小程序账号的,点击右侧注册小...

qt(+vs2017)显示点云

参考链接: Win10+VS2015环境下安装编译PCL1.8.1和VTK8.0.0(踩坑大全)https://blog.csdn.net/weixin_39871164/article/details/102879962 1.vs2017编译安装VTK (PCL点云显示是基于VTK做的) - PCL191匹配的VTK版本是VTK8.1(PCL191\3rdParty\VTK\include\vt...

第四周作业

一、union注入 基于union的信息获取: union联合查询:可以通过联合查询来查询指定的数据 用法举例: select username,password from user where id =1 union select 字段1,字段2 from 表名 先登入PHPmyadmin 进入pikachu的数据库中 得到此结果 上述为一般查询 union查询: 除了通过遍历查询数据库内容外,...

String常用的几个方法

String常用的几个方法介绍 首先在讲之前我想说几句题外话,关于string的常用方法我查了很久csdn,我发现要不就是一大坨,还有一些乱七八糟的拓展,看的你一脸懵逼,要不就是简洁的很,该写的你不写出来,所以搞得你很难受。但是在你看了我这篇文章以后我觉得你可能会缓解很多,那就开始吧。 String的方法是有很多的,这里我只列举一些我常用的,喷子不要喷。 直接上代码先。 方法一:charAt: 很...

计算机组成原理 第五章测试(下) 答案

本次得分为:15.00/15.00, 本次测试的提交时间为:2020-04-24, 如果你认为本次测试成绩不理想,你可以选择再做一次。 【第5章 测试(下)】 1单选(1分) 下图可以表示哪种控制方式的CPU工作效率?选A 得分/总分 A. DMA方式 1.00/1.00 B.无正确答案 C.程序中断方式 D.程序查询方式 2单选(1分) 在程序中断方式下,中断响应发生在__B_ 得分/总分 A....

问答精选

How to add operation to Token in SAPUI5?

I am using a MultiInput control to which I am adding Tokens based on input from the user. For this I have used addValidator function to add Token with 'key' and 'text'. I am looking to add operator (l...

MongoDB query to retrieve a specific value from the document located in a array

I am trying to make a request in a document with mongodb. In this document I'm looking to get just the id in friend, not all of the document just 1 id in friend with where i try this : It's not workin...

how can i use Rspec Expectations in page object classes

How can i use Rspec Expectations in Page-object classes. I need to assert elements. Currently i am using xpath, other locators to check element existence. I know using it is step definitions. But i ne...

c++ dynamic library segfault

I'm writing network application in c++ and I want to enable making plugins, but I don't know what to do, to protect my application from errors like segfault. For example: I have interface: And someone...

Onclick event in anchor tag not working in IE10

I've an anchor in an Asp.Net user control. I've wired some code to the onclick event. For some reason in Internet Explorer 10, the event is not firing. The markup is structured as where myFunction is ...

相关问题

相关文章

热门文章

推荐文章

相关标签

推荐问答