技术标签: 浏览器解析

firefox是以gekco引擎,chrome和safari是以webkit引擎


结合 chrome的timeline,可以看到网页解析的过程如下:

1:receive response,receive data:接收请求返回资源
2:parse html:html dom节点的解析
3:recalculate style :生成渲染树(渲染树与dom树不同的地方在于,dom树会把所有的dom节点都展示出来,渲染树只会展示display非none的元素)
4:layout :将渲染树上的节点,根据它的高度,宽度,位置,为节点生成盒子(layout)。
5:paint:确定渲染树上的节点的大小和位置后,便可以对节点进行涂鸦(paint)
6:composite layer:合成层;当渲染树上的节点涂鸦完毕后,便生成位图(bitmap),浏览器把此位图从CPU传输到GPU
跟css相关的部分从layout开始,经过paint,最终再composite layer 生成位图。
影响layout布局的css属性如图

1:盒子盒模型,所以跟盒模型相关的属性的修改都会触发layout
2:位置(postition,float)相关
3:跟获取client的属性:clientHeight,clientWidth,clientTop,clientLeft
4:跟获取offset的属性:offsetHeight,offsetWidth,offsetTop,offsetLeft
5:跟获取scroll的属性:scrollHeight,scrollWidth,scrollTop,scrollLeft
paint顾名思义,涂鸦,绘制,所以跟color(fontcolor,background-color)相关
打开chrome的开发者工具,按下“esc”,会弹出如下界面

解析:dom节点增加,删除,位置移动,展示与否等操作,会引起DOM树变化(html parse阶段)或 CSS 树变化(dom + css
render阶段);
解析:如hover导致某些元素页面样式的变化。而若样式中有跟paint阶段相关的,则会触发重绘
解析:窗口大小改变时,可看到绿色的重绘区域在变化,截图如下:
简单脑补(根据 W3C 的 HTML DOM 标准,HTML 文档中的所有内容都是节点,dom节点中的文本成为文本节点)
解析:比如用户在input框中输入文字,修改的是DOM结构,所以触发的layout,paint和composite layer三个阶段
解析:offsetxxx,scrollxxx,clientxxx跟元素的位置相关,所以首先触发的是layout阶段,再触发paint,compostie
layer。
解析:若修改的样式表跟css盒模型相关的,会触发layout阶段,paint,composite layer随即触发。

1):3D 或透视变换(perspective transform) CSS 属性
2):使用加速视频解码的
3):拥有 3D (WebGL) 上下文或加速的 2D 上下文的
4):混合插件(如 Flash)
5):对自己的 opacity 做 CSS 动画或使用一个动画 webkit 变换的元素
6):拥有加速 CSS 过滤器的元素
7):元素有一个包含复合层的后代节点(换句话说,就是一个元素拥有一个子元素,该子元素在自己的层里)
8):元素有一个 z-index 较低且包含一个复合层的兄弟元素(换句话说就是该元素在复合层上面渲染)
9):在webkit内核的浏览器中,如果有上述情况,则会创建一个独立的layer。
当对元素创建layer之后,会节省layout和paint阶段,但是layer不能泛滥。
layer跟psd中图层很像,我们知道在psd中图层越多,psd图片就会越大。
同理,layer越多,占用的内存就越多,当在内存有限的移动设备上(手机),过多的渲染带来的开销超过了它在性能上的改善,得不偿失;
白白的给元素添加layer,一般通过* {-webkit-transform: translateZ(0);}为元素添加layer
但创建layer的原则:当且仅当需要的时候才为元素创建渲染层。
渲染分为三阶段:layout,paint,composite layer,修改不同的css属性会触发不同的阶段,触发的阶段越靠前,渲染的代价越高。
1:尽量避免触发layout(位置相关的可通过transform代替 top left),paint。 除写css属性外,读取css的位置大小相关属性会导致触发layout阶段,要分离读写,减少layout。
2:应该尽量避免重绘,并且尽可能的使绘制区域最小,以提升页面性能。 但是有些必须使用的样式效果还是要用的,比如fixed等重要的是作为前端人员,能够预估这些代码所带来的性能损耗及所造成的影响。
3:避免组合触发 比如滚动和hover效果,hover中若使用border-shadow,border-style修改,则会损耗较大的性能,有可能会触发丢帧的现象。 改进办法:在滚动时,增加计时器,可先把hover效果禁掉,滚动结束后再打开hover效果。
requestAnimationFrame是一个监听帧的API,即每绘制完一帧后就执行一下requestAnimationFrame函数。
//setTimeout/setInterval使用方法
var loop = setInterva(function(){
if(){
clearInterval(loop);
loop = null;
}else{
//to do
}
}, 20);
rAF使用方法
var loop = function(){
if(){
// to do
requestAnimationFrame(loop);//有没有超简单?
}
};
rAF何时执行下一帧即何时执行回调? rAF不是自己指定回调函数运行的时间,而是跟着浏览器内建的刷新频率来执行回调,这当然就能达到浏览器所能实现动画的最佳效果 rAF PK setTimeout/setInterval?

CSS的 animations, transforms 以及 transitions 不会自动开启GPU加速,而是由浏览器的缓慢的软件渲染引擎来执行。
大部分的浏览器提供了触发GPU加速的CSS规则, 浏览器检测到页面中某个DOM元素应用了这些CSS规则时就会开启GPU硬件加速,最显著的css规则是元素的3D变换。 所以,网站上会看到某些节点有下面的似乎没有用的属性出现:
transformZ(0); transform3d(0,0,0)不要小看这些属性,他们可以让拥有这个属性的元素生成单独的composite layer。这样,不管这个元素的大小,位置等变换,都不会触发layout和paint阶段,直接执行composite layers (合成图层)阶段,浏览器会把这个合成图层layer当做位图上传到GPU。 GPU硬件加速后节省的时间:
1:cpu进行layout,paint的时间;
2:CPU向GPU传输位图的时间
打开chrome调试工具,再按esc键,出现以下界面

1:show paint rectangle :显示可绘制区域
2:show composited layer borders:显示layer
3:show FPS borders:显示一帧耗费的时间(60帧/秒是最优效果,即一帧16.6ms)
4:enable continuous page repainting:使页面持续重绘
5:show potential scoll bottlenecks:(shows areas of the page that slow down scrolling)展示可能会减慢页面滚动的区块
勾选4:enable continuous page repainting
1):打开Elements面板,使用上下左右来切换选择DOM,然后按下快捷键H来hide或者显示元素,同时观察每帧渲染时间。
2):如何某个元素按下H键后,帧时间会突然下降,则说明这个元素中有比较耗时的css属性,找到节点中css属性。
3):依次取消面板中的CSS样式再观察每帧渲染时间,找出影响元素渲染帧时间的css属性。
实践:用上面的方法,找出这个页面http://css3exp.com/moon/ 中最消耗性能的节点及样式
答案:body:background wrap:box-shadow
浏览器引擎工作机制:http://www.cnblogs.com/luluping/archive/2013/04/05/3000461.html render树与css:http://www.cnblogs.com/luluping/archive/2013/04/05/3000460.html 浏览器工作原理:http://www.html5rocks.com/zh/tutorials/internals/howbrowserswork/
来源:网络
概念 域名解析是把域名指向网站空间IP,让人们通过注册的域名可以方便地访问到网站的一种服务。 简单的说,域名解析就是将域名转换为IP地址的过程。因为想要访问一台服务器,最终是靠IP地址访问的,而不是靠域名访问的,他们的之间的映射关系保存在本地缓存和网络上的各种域名解析服务器中,如浏览器缓存,系统缓存,域名商的域名解析服务器,…,那么他们的查询顺序和查询方式就是本文的内容。 域名结构 ...
前言: 渲染过程网上不少教程,但是感觉自己从头到尾梳理一遍也是有必要的。文章尽量用简洁易懂的形式来展现,方便自己日后复习和读者朋友的理解。 资源: 这是广为流传的浏览器渲染内容的过程图。 正文: 首先说明一下,浏览器渲染是要从服务器下载资源的,获取的资源包括HTML,CSS以及JavaScript。然后浏览器把下载的内容解析出来展示给用户。 HTML解析器解析,将.html文件中的节点构建出来一棵...
可能每一个前端工程师都想要理解浏览器的工作原理。 我们希望知道从在浏览器地址栏中输入 url 到页面展现的短短几秒内浏览器究竟做了什么; 我们希望了解平时常常听说的各种代码优化方案是究竟为什么能起到优化的作用; 我们希望更细化的了解浏览器的渲染流程。 浏览器的多进程架构 一个好的程序常常被划分为几个相互独立又彼此配合的模块,浏览器也是如此,以 Chrome...
浏览器的渲染过程: 第一步:html经过HTML Parser['pɑ:sə]解析为DOM tree; 第二步:css根据css规则经过css解析器解析为style Rules(CSSOM tree); 第三步:两棵树经过attachment结合为 Render Tree(形成一棵大树,此时它还是一棵迷茫的树,不知道节点的内容和位置); 第四步:render...
拿到对应的字节内容,将这些内容转换成字符。 浏览器将会根据HTML 的标准把上一步的结果转换成 “标记(Token)”。比如 <html> 或者 <body> 这种被尖括号包住的 "标记(Token)" 均有特殊的意义 解析HTML生成DOM树。 解析CSS生成CSSOM规则树。 将DOM树...
浏览器渲染过程 DOM 树:解析 HTML 构建 DOM(DOM 树) CSS 树:解析 CSS 构建 CSSOM(CSS 树) 渲染树:CSSOM 和 DOM 一起生成 Render Tree(渲染树) 布局(layout):根据Render Tree浏览器就知道网页中有哪些节点,以及各个节点与 CSS 的关系,从而知道每个节点的位置和几何属性 绘制(Paint):根据计算好的信息绘制整个页面 ...
题目: 为何把css放在head中: 把CSS放在head中的目的: html生成DOM tree时,根据浏览器默认及现有CSS生成render tree来渲染页面,当遇到新的CSS的时候需要下载并结合现有CSS重新生成render tree。但是如果把所有CSS都放到页面顶部,这样就没有重新渲染的过程了。简而言之,就是为了避免重新渲染页面 window.onload 和domContentLoa...
前言 在浏览器输入一个网址之后,经过和后端的连接获取到相关的资源数据后,浏览器需要对获取的网页数据进行解析、渲染、绘制,最终展示出来的就是我们所看到的界面内容。在进行前端开发时,了解浏览器的渲染过程有利于我们在实际过程中进行渲染调优、性能调优的处理,因此是非常有必要的。 浏览器介绍 一、浏览器结构 浏览器的组成结构大致如上,下面是具体的介绍: 1.用户界面 用户界面即浏览器的外壳,是我们平时所看到...
前段时间一直想学学微信中的小程序是如何制作的,昨天终于有时间就尝试了一下。话不多说,以免跑偏。。。。 1.微信小程序开发需要先在微信公众平台(https://mp.weixin.qq.com)上注册一个自己的公众号。 2.在公众平台上注册成功后,在公众号左侧有一个小程序栏目。点击小程序管理,在左侧就会出现两个选项,在第一次使用小程序当然是没有小程序账号的,点击右侧注册小...
参考链接: 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...
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...
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. 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...
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...
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 ...