浏览器相关

浏览器内核

浏览器内核分为两部分:一是渲染引擎,其主要负责结构与样式,即网页的内容(HTML,XML,图像等),以及计算网页显示方式,而后输出到打印机;而JS引擎主要是负责解析JavaScript,实现页面交互效果;一个负责搭建静态结构,一个用来展示动态效果;后来js引擎愈来愈独立,浏览器内核便更加倾向于指渲染引擎。css

目前常见浏览器及其内核

IE浏览器:ie11以前用Trident内核,后来的Edge采用了新内核(EdgeHTML)
火狐浏览器:使用Gecko内核(开源)
Safari:使用Webkit内核;并且Webkit最早是由苹果开发的
Chrome浏览器:Chrome内核➡Webkit内核➡Blink内核;另外谷歌后来还研发了本身的JavaScript引擎:V8,极大地提升了JavaScript运行速度
Opera:最初是本身研发的Presto,后来同谷歌同样用了Webkit,如今也是Blink内核
国内浏览器大多数是双核模式:标准模式下为chrome内核,兼容模式下为IE内核html

浏览器渲染引擎的工做原理

先了解一下浏览器的主要组成部分:用户界面,浏览器引擎,渲染引擎,网络请求模块,JS引擎,用户界面后端,数据层。
在这里插入图片描述
各部分的做用为:chrome

  • 用户界面:包括如地址栏,书签栏等内容构成了浏览器的用户界面,用来实现与用户之间的交互
  • 浏览器引擎:用于在渲染引擎和用户界面之间传递命令
  • 渲染引擎:当获取到请求的页面资源后,浏览器先解析HTML文档构建“结构树”,而后解析CSS文件,为“结构树”添加样式造成”渲染树“,接下来就是布局过程,为“渲染树”分配屏幕的位置坐标,最后进入绘制阶段,利用UI后端绘制出“渲染树”的每个节点;另外,为了更好用户体验,浏览器引擎不会等到全部html解析完成后再去构建和布局render树。它是完成解析完一部份内容就显示一部份内容,于此同时还可能经过网络下载相关内容

在这里插入图片描述

  • 网络请求模块:实现网络请求以及数据接收
  • JS引擎:负责解析JS代码
  • UI后端:负责绘制基本的部件,在底层与操做系统进行交互
  • 数据存储:负责存储数据

浏览器页面渲染过程(及尽可能避免重绘回流的操做)

1 用户输入网址(假设是HTML页面,第一次访问,无缓存) 浏览器想服务器发出HTTP请求,服务器返回HTML文件(善用缓存,减小HTTP请求,减轻服务器压力)express

  1. 浏览器载入HTML代码,获取CSS文件(CSS文件合并,减小HTTP请求)
  2. 载入<body>,开始渲染页面(CSS文件放在最上面,避免重复渲染 )
  3. 浏览器发现一个<img>,向服务器发出请求,此时浏览器不会等到图片下载完,而是继续渲染后面的代码(图片文件合并,减小HTTP请求)
  4. 服务器返回图片文件,因为图片面积,影响界面中其余元素的排版,此时,浏览器须要从新渲染这部分代码(最好图片都设置尺寸,避免从新渲染)
  5. 浏览器发现一个包含js代码的<script>标签,会当即运行该js代码(script最好放在页面最下面)
  6. js执行命令:隐藏掉代码中某个div元素,此时浏览器不得不从新渲染这部分代码(页面初始化样式不要使用js控制)
  7. 若是某时刻,用户经过点击某个按钮修个这个页面样式(如换肤),请求新的CSS文件,此时发生回流,从新渲染页面

关于reflow和repaint

reflow:某个样式发生改变影响页面的布局,发生回流;reflow几乎没法避免,如树目录的折叠展开效果都会引发reflow
repaint:改变某个元素的背景色,文字或边框颜色等不影响布局的属性,成为repaint;
reflow的成本比repaint高;后端

引发reflow的状况(标准流内的元素发生形态上的改变)

  1. 改变窗囗大小
  2. 改变文字大小
  3. 添加/删除样式表
  4. 内容的改变,如用户在输入框中敲字
  5. 激活伪类,如:hover (IE里是一个兄弟结点的伪类被激活)
  6. 操做class属性
  7. 脚本操做DOM
  8. 计算offsetWidth和offsetHeight
  9. 设置style属性

reflow是不可避免的,只能将reflow对性能的影响减到最小。

  • 尽量限制reflow的影响范围。须要改变元素的样式,不要经过父级元素影响子元素。最好直接加在子元素上。
  • 经过设置style属性改变结点样式的话,每设置一次都会致使一次reflow。因此最好经过设置class的方式。
  • 实现元素的动画,它的position属性应当设为fixed或absolute,这样不会影响其它元素的布局。
  • 权衡速度的平滑。好比实现一个动画,以1个像素为单位移动这样最平滑,但reflow就会过于频繁,CPU很快就会被彻底占用。若是以3个像素为单位移动就会好不少。
  • 不要用tables布局的另外一个缘由就是tables中某个元素一旦触发reflow就会致使table里全部的其它元素reflow。在适合用table的场合,能够设置table-layout为auto或fixed,这样可让table一行一行的渲染,这种作法也是为了限制reflow的影响范围。
  • 不少状况下都会触发reflow,若是css里有expression,每次都会从新计算一遍。
  • 减小没必要要的 DOM 层级(DOM depth)。改变 DOM 树中的一级会致使全部层级的改变,上至根部,下至被改变节点的子节点。这致使大量时间耗费在执行 reflow 上面。
  • 避免没必要要的复杂的 CSS 选择器,尤为是后代选择器(descendant selectors),由于为了匹配选择器将耗费更多的 CPU

从输入url到加载完成过程浏览器

相关文章
相关标签/搜索