浏览器的渲染机制,白屏和FOUC

关于浏览器的渲染机制,先要了解一些基本概念:

  • DOM:浏览器解析html构建DOM树
  • CSSOM:浏览器解析CSS构建CSSOM规则树
  • Render Tree:DOM和CSSOM合并后生成Render Tree
  • layout:layout:有了Render Tree,浏览器已经能知道网页中有哪些节点、各个节点的CSS定义以及他们的从属关系,从而去计算出每个节点在屏幕中的位置
  • painting:按照算出来的规则,通过显卡,把内容画到屏幕上
  • reflow(回流):当浏览器发现某个部分发生了点变化影响了布局,需要倒回去重新渲染,内行称这个回退的过程叫 reflow。reflow 会从 <html> 这个 root frame 开始递归往下,依次计算所有的结点几何尺寸和位置。reflow 几乎是无法避免的。现在界面上流行的一些效果,比如树状目录的折叠、展开(实质上是元素的显 示与隐藏)等,都将引起浏览器的 reflow。鼠标滑过、点击……只要这些行为引起了页面上某些元素的占位面积、定位方式、边距等属性的变化,都会引起它内部、周围甚至整个页面的重新渲 染。通常我们都无法预估浏览器到底会 reflow 哪一部分的代码,它们都彼此相互影响着。
  • repaint(重绘):改变某个元素的背景色、文字颜色、边框颜色等等不影响它周围或内部布局的属性时,屏幕的一部分要重画,但是元素的几何尺寸没有变。

流程图如下:

接下来再说说浏览器如何渲染的

加载过程:

当浏览器获取到一个html文件后,会“自上而下”的加载,并在加载的过程中解析和渲染。

加载过程中遇到外部css文件,浏览器另外发出一个请求,来获取css文件。

遇到图片资源,浏览器也会另外发出一个请求,来获取图片资源。这是异步请求,并不会影响html文档进行加载。

但是当文档加载过程中遇到js文件,html文档会挂起渲染(加载解析渲染同步)的线程,不仅要等待文档中js文件加载完毕,还要等待解析执行完毕,才可以恢复html文档的渲染线程。

为什么遇到JS要等待呢?因为JS可能会修改到DOM,导致后面的资源白加载了。(所以这也就是为什么建议将JS文件放在html文档</body>前)

如果在加载的过程中遇到了CSS时,CSS不阻塞DOM的加载和解析,不会阻塞其它资源(如图片)的加载,但是会阻塞 后续JS 文件的执行(原因之一是,js执行代码可能会依赖到css样式。css只阻塞执行而不阻塞js的加载)。

解析过程:

  • 1、浏览器通过请求的 URL 进行域名解析,向服务器发起请求,接收文件(HTML、CSS、JS、Images等等)。
  • 2、HTML 文件加载后,开始构建 DOM Tree(DOM树)
  • 3、CSS 样式文件加载后,开始解析和构建 CSS Rule Tree
  • 4、Javascript 脚本文件加载后, 通过 DOM API 和 CSSOM API 来操作 DOM Tree 和 CSS Rule Tree

渲染过程:

  • 1、浏览器引擎通过 DOM Tree 和 CSS Rule Tree 构建 Rendering Tree(渲染树)
  • 2、布局阶段——在屏幕上绘制渲染树中的所有节点的几何属性,比如: 位置,宽高,大小等等,这个过程称为 Flow 或 Layout 。
  • 3、绘制元素——绘制所有节点的可视属性。
  • 4、合并渲染层——把以上绘制的所有图层(类似于PhotoShop中的“图层”)合并,最终输出一张图片

其中的阶段3、4可称之为Paint


关于浏览器显示白屏和FOUC:

不同的浏览器对于CSS和HTML的处理方式不同,有的是等待CSS加载完成之后,对HTML元素进行渲染和展示(白屏问题)。有的是先对HTML元素进行展示,然后等待CSS加载完成之后重新对样式进行修改(FOUC无样式内容闪烁)


自己也是小白,没法写出什么技术高深的博客,很多知识点也是参照大神写的内容,自己理解后再做个读后感

参考:

浏览器是怎样加载js代码的? - 第七星尘的回答 - 知乎 https://www.zhihu.com/question/263866883/answer/276139578

李某龙:https://www.cnblogs.com/slly/p/6640761.html

原文地址:https://www.cnblogs.com/ianyanyzx/p/9151826.html

时间: 2024-11-08 08:54:33

浏览器的渲染机制,白屏和FOUC的相关文章

转---JS 一定要放在 Body 的最底部么?聊聊浏览器的渲染机制

作者:德来 segmentfault.com/a/1190000004292479 如有好文章投稿,请点击 → 这里了解详情 一.从一个面试题说起 面试前端的时候我喜欢问一些看上去是常识的问题.比如:为什么大家普遍把<script src=""></script>这样的代码放在body最底部?(为了沟通效率,我会提前和对方约定所有的讨论都以chrome为例) 应聘者一般会回答:因为浏览器生成Dom树的时候是一行一行读HTML代码的,script标签放在最后面就不

浏览器的渲染机制

Google Web Fundamentals 是一个非常优秀的文档,里面讲到了跟web.浏览器.前端的方方面面.我总结一下其中的 Ilya Grigorik 写的 Critical rendering path 浏览器渲染机制部分的内容如下: 几个概念 1.DOM:Document Object Model,浏览器将HTML解析成树形的数据结构,简称DOM. 2.CSSOM:CSS Object Model,浏览器将CSS代码解析成树形的数据结构. 3.DOM 和 CSSOM 都是以 Byte

浏览器页面渲染机制及简单优化

浏览器的内核是指支持浏览器运行的最核心的程序,分为两个部分: 1:渲染引擎 2:JS引擎 目前市面上常见的浏览器内核可以分为这四种:Trident(IE).Gecko(火狐).Blink(Chrome.Opera).Webkit(Safari) 页面加载过程要点如下: 1:浏览器根据DNS服务器得到域名的IP地址 2:向这个IP的机器发送HTTP请求 3:服务器收到.处理并返回HTTP请求 4:浏览器得到返回内容 浏览器渲染过程: 1:浏览器会解析三个东西: ①.HTML/SVG/XHTML,H

浏览器的渲染机制— (js基础复习第3期)

一:几个问题 什么是DOCTYPE 及作用 浏览器渲染过程 重排refolw.重绘repaint.布局Layout 输入url经历了什么? 二:整理 1. 什么是DOCTYPE 及作用 浏览器使用DTD(文档类型定义)来判断文档类型,决定使用何种协议来解析, 以及切换浏览器模式 DOCTYPE是用来声明文档类型和DTD规范的,一个主要用途是文件的合法性验证.如果文件代码不合法,那么浏览器解析时便会出一些差错. html5 <!DOCTYPE html> 2.浏览器渲染过程 html->

JS一定要放在Body的最底部么? 聊聊浏览器的渲染机制

请参看文章 https://segmentfault.com/a/1190000004292479 网上的回答: 1.js加载会阻塞其它内容加载,使页面加载时间更长,尤其是js文件太大,有的页面js文件数兆/客户端网速太慢/服务器网速太慢,甚至不能访问等情况. 2.dom操作,页面没提前加载,dom操作会失败,报错. 3.搜索引擎优化.

[转]浏览器渲染机制——一定要放在body底部的js引用

转自:http://blog.csdn.net/u012251421/article/details/50536265 说明: 本文提到的浏览器均是指Chrome. “script标签“指的都是普通的不带其他属性的外联javascript. web性能优化的手段并不是非黑即白的,有些手段过头了反而降低性能,所以在讨论条件和结论的时候,虽然很多条件本身会带来其他细微的负面或正面影响,为了不使论述失去重点,不会扩展太开. 一.从一个面试题说起 面试前端的时候我喜欢问一些看上去是常识的问题.比如:为什

webkit 渲染机制

最近看了< webkit技术内幕 >,虽然并不能完全看懂,但是对浏览器的渲染机制也算是有了一个比较完整的认识. 我们从浏览器地址栏输入网址开始到web页面被完整的呈现在眼前,大概的经过了这样一个过程:网址被DNS解析为IP地址 -> 通过IP地址建立TCP连接 -> 发送HTTP请求 -> 服务器处理请求并返回响应 ->  浏览器解析渲染页面 -> 断开TCP连接 可是浏览器是怎么去解析渲染页面的呢?这里就要涉及到浏览器的内核,也就是浏览器的渲染引擎(严格来说应该

浏览器页面加载解析渲染机制(一)

mark一下zhq[2]. 前言:首先这个标题对我来说有不甚了解,这里引用了一些好的技文内容,分享一下我的一些理解,如果有说错的望评论里狠狠打脸,以共勉之. 一:为什么要了解浏览器渲染页面和加载页面机制,主要还是性能的优化. 了解浏览器如何进行加载,我们可以在引用外部样式文件,外部js时,将他们放到合适的位置,使浏览器以最快的速度将文件加载完毕. 了解浏览器如何进行解析,我们可以在构建DOM结构,组织css选择器时,选择最优的写法,提高浏览器的解析速率. 了解浏览器如何进行渲染,明白渲染的过程,

vue2.0 在华为手机等手机自带浏览器打开白屏的问题

使用vue2.0 开发的单页面网站,  在华为部分型号(p20也是....),部分安卓手机打开页面是空白; 网上的方法是把把es6 转 为 es5, 当时我使用的 vue-cli , webpack 内置babel,会自动转码, 排查这种可能性; 根据理解可能是这些浏览器的内核版本比较低,所以在ie8,ie9进行调试, 发现报错; 错误指向的是自定义的过滤器的方法, 该js文件放在static 目下,并未放入 src/assets目录下,导致未打包入app.js文件. 在 webpack.bas