CSSOM树和DOM树连接在一起形成一个render tree,渲染树用来计算可见元素的布局并且作为将像素渲染到屏幕上的过程的输入。

  • DOM树和CSSOM树连接在一起形成render tree .
  • render tree只包含了用于渲染页面的节点
  • 布局计算了每一个对象的准确的位置以及大小
  • 绘画是最后一步,绘画要求利用render tree来将像素显示到屏幕上

第一步是结合DOM树和CSSOM树形成“render tree”,渲染树用来描述所有可见的DOM内容,并且将CSSOM样式信息附加到节点上。

为了形成渲染树,浏览器大致做的事情有:

  1. 从DOM树根节点开始,遍历每一个可见的节点

    • 一些节点是完全不可见的(比如 script标签,meta标签等),这些节点会被忽略,因为他们不会影响渲染的输出
    • 一些节点是通过CSS样式隐藏了,这些节点同样被忽略——例如上例中的span节点在render tree中被忽略,因为span样式是display:none;
  2. 对每一个可见的节点,找到合适的匹配的CSSOM规则,并且应用样式
  3. 显示可见节点(节点包括内容和被计算的样式)

记住

  • 记住“visibility:hidden”和“display:none”之间的不同,“visibility:hidden”将元素设置为不可见,但是同样在布局上占领一定空间(例如,它会被渲染成为空盒子),但是“display:none”的元素是将节点从整个render tree中移除,所以不是布局中的一部分 。

最后输出的是一个render包括了屏幕上可见内容的样式信息和内容信息。

我们知道了哪些元素应该被显示以及元素的样式,但是我们还没有计算元素在设备中的确切的位置和大小——这是“布局”阶段,同样也被叫做“reflow”。

<html>
<head>
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Critial Path: Hello world!</title>
</head>
<body>
<div style="width: 50%">
<div style="width: 50%">Hello world!</div>
</div>
</body>
</html>

上面的页面展示了两个div:第一个div是整个视图的一半,第二个div是父亲宽度的一半——也就是说是整个视图的25%。

布局的输出是“盒子模型”,并且将相对定位转化成屏幕上的绝对像素。

最后,我们只差将render tree上的所有节点转化成屏幕上的确切像素——这个步骤通常被称为“painting”或者“rasterizing”。

每个步骤都要花费一些时间,谷歌浏览器开封工具为我们描述了一些步骤所花费的时间:

  • 构造render tree和计算位置以及大小信息被捕捉在时间轴上的“Layout”时间中
  • 一旦布局完成,浏览器计算"Paint Setup"和“Paint”事件用来描述render tree转化成屏幕上世纪像素的时间。

显示构造render tree以及布局和paint的时间受到页面的大小,被应用的样式和正在运行的设备影响。

页面越大,浏览器将要做更多工作;样式越复杂,painting阶段所花费的时间也越多。

但是,我们的页面完成了!WOOOO!

让我们快速的浏览下浏览器所做的事情:

  1. 处理HTML标签建立DOM树
  2. 处理CSS标签建立CSSOM树
  3. 连接CSSOM树和DOM树形成一个render树
  4. 在render树上运行布局来计算每个节点的形状
  5. 在屏幕上画每一个节点

虽然我们的页面很简单,但是它进行了大量的工作!下一章我们讨论怎样对渲染进行优化。

原文:https://developers.google.com/web/fundamentals/performance/critical-rendering-path/render-tree-construction?hl=en

渲染树render tree的更多相关文章

  1. render tree与css解析

    浏览器在构造DOM树的同时也在构造着另一棵树-Render Tree,与DOM树相对应暂且叫它Render树吧,我们知道DOM树为javascript提供了一些列的访问接口(DOM API),但这棵树 ...

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

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

  3. vue入门:(底层渲染实现render函数、实例生命周期)

    vue实例渲染的底层实现 vue实例生命周期 一.vue实例渲染的底层实现 1.1实例挂载 在vue中实例挂载有两种方法:第一种在实例化vue时以el属性实现,第二种是通过vue.$mount()方法 ...

  4. 使用行为树(Behavior Tree)实现游戏AI

    ——————————————————————— 谈到游戏AI,很明显智能体拥有的知识条目越多,便显得更智能,但维护庞大数量的知识条目是个噩梦:使用有限状态机(FSM),分层有限状态机(HFSM),决策 ...

  5. 后缀树(suffix tree)

    参考: 从前缀树谈到后缀树 后缀树 Suffix Tree-后缀树 字典树(trie树).后缀树 一.前缀树 简述:又名单词查找树,tries树,一种多路树形结构,常用来操作字符串(但不限于字符串), ...

  6. 线段树 Interval Tree

    一.线段树 线段树既是线段也是树,并且是一棵二叉树,每个结点是一条线段,每条线段的左右儿子线段分别是该线段的左半和右半区间,递归定义之后就是一棵线段树. 例题:给定N条线段,{[2, 5], [4, ...

  7. 使用行为树(Behavior Tree)实现网游奖励掉落系统

    原地址:http://blog.csdn.net/akara/article/details/6165421 [原创]使用行为树(Behavior Tree)实现网游奖励掉落系统by AKara 20 ...

  8. 树-伸展树(Splay Tree)

    伸展树概念 伸展树(Splay Tree)是一种二叉排序树,它能在O(log n)内完成插入.查找和删除操作.它由Daniel Sleator和Robert Tarjan创造. (01) 伸展树属于二 ...

  9. 数据结构之树(Tree)(一) :树

    ps:好久没用动手写blog了,要在这条路上不断发展,就需要不停的学习,不停的思考与总结,当把写blog作为一种习惯,就是自我成长的证明,Fighting!. 一.简介 树是一种重要的非线性数据结构, ...

随机推荐

  1. IDEA查看源码时提示:Library source does not match the bytecode for class的问题分析

    通过Maven查看依赖的源码时,通常是Maven自动下载JAR包附属的source包,但是会出现一个问题,由于使用lombok插件会造成编写的Java文件和编译后的class上有差别,所以IDEA打开 ...

  2. 跟开涛学SpringMVC(4.1):Controller接口控制器详解(1)

    http://www.importnew.com/19397.html http://blog.csdn.net/u014607184/article/details/52074530 https:/ ...

  3. win7 更改同步时间的网址

    Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\D ...

  4. 转: 基于netty+ protobuf +spring + hibernate + jgroups开发的游戏服务端

    from: http://ybak.iteye.com/blog/1853335 基于netty+ protobuf +spring + hibernate + jgroups开发的游戏服务端 游戏服 ...

  5. ajax加载时的进度条

    运行效果如下图,pc和移动都可以展示,调用方法很简单,开始调用:loading.baosight.showPageLoadingMsg(false),false代表不现实加载说明,true展示加载说明 ...

  6. vue2.0 vue-router

    一.SPA中路由的简单实现 main.js import Vue from 'vue' import App from './App' import VueRouter from 'vue-route ...

  7. poj 1703 Find them, Catch them(种类并查集和一种巧妙的方法)

    Find them, Catch them Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 36176   Accepted: ...

  8. Kubernetes之网络策略(Network Policy)

    系列目录 概述 Kubernetes要求集群中所有pod,无论是节点内还是跨节点,都可以直接通信,或者说所有pod工作在同一跨节点网络,此网络一般是二层虚拟网络,称为pod网络.在安装引导kubern ...

  9. 转载---- 使用opencv源码自己编制android so库的过程

    http://blog.csdn.net/lantishua/article/details/21182965 工作需要,在Android上使用OpenCV.opencv当前的版本(2.4.8)已经有 ...

  10. 宜信开源微服务任务调度平台(SIA-TASK)

    背景 无论是互联网应用或者企业级应用,都充斥着大量的批处理任务.常常需要一些任务调度系统帮助开发者解决问题.随着微服务化架构的逐步演进,单体架构逐渐演变为分布式.微服务架构.在此的背景下,很多原先的任 ...