zoukankan      html  css  js  c++  java
  • 浏览器渲染过程

    1.输入url

    2.浏览器对url进行解析,就是根据域名查找对应的ip地址和端口

      1)浏览器的DNS缓存。浏览器会缓存DNS记录一段时间,所以先从浏览器的缓存找起

      2)系统缓存。浏览器DNS缓存没找到,就会去找系统的缓存,此时浏览器做一个系统调用(gethostbyname)

      3)路由器缓存。路由器也有缓存

      4)ISP DNS缓存。服务提供商的DNS缓存

      5)递归搜索。以上全部都没找到,就会在DNS服务器上进行递归搜索。从顶级域名.com开始递归搜索,直到找到。

    3.建立TCP连接。进行三次握手建立起TCP连接,就可以发送http请求了。

    4.http请求的发送和响应

    5.浏览器渲染页面

      0)bytes -> charaters -> tokens -> nodes -> DOM/CSSOM 

       浏览器接收并读取原始字节,并根据文件的指定编码转换成字符串;根据字符串转换为token,例如<html>,<body>等;根据token生成node节点对象,再根据node生成DOM或CSSOM。

      1)html解析,并生成DOM

       注意:

    1. DOM树在构建的过程中可能会被CSS和JS的加载而执行阻塞
    2. display:none的元素也会在DOM树中
    3. 注释也会在DOM树中
    4. script标签会在DOM树中

      2)css的解析,并生成CSSOM

       注意:

    1. CSS解析可以与DOM解析同时进行。
    2. CSS解析与script的执行互斥 。
    3. 在Webkit内核中进行了script执行优化,只有在JS访问CSS时才会发生互斥

      3)js的解析,<script>会中断DOM的生成;若js操作了css,但是CSSOM还未生成完毕,浏览器会先中断js的解析,先把CSSOM构建完成。

      4)将DOM和CSSOM合成Rendering tree,并进行布局(Layout)和绘制(Paint),将位置信息转化为物理像素,并调用浏览器的ui后端层构建页面。

      (css被视为阻塞渲染的资源,也就是在css构建过程中,浏览器的解析是被阻塞的,直到CSSOM构建好之后,浏览器才会重新构建DOM和执行js

      也就是DOM和CSSOM其实是并行的,互不影响。
      js是可以操作dom和cssom。
      dom在构建过程中,遇到<script>会停止,直到脚本执行完成,才继续构建。

      如果没有js的话,那dom和cssom相安无事,各自解析并构建完成。

      如果有js,js没有操作cssom,那html遇到<script>就先停止,等js下载并执行完,再继续dom的构建。
      如果有js,js操作了cssom,那cssom必须要在js之前下载并构建完成才能使用

      js想要操作CSSOM,但是此时CSSOM尚未构建完成,也就是此时会被css阻塞,直到CSSOM构建完成后才能运行js,而DOM也要等到js解析运行完,才能继续构建DOM)

      5)Layout:布局阶段会从渲染树的根节点开始遍历。渲染树每个节点都是一个render object对象,包含宽高、位置、背景色等样式信息,浏览器通过这些信息确定页面上的确切大小和位置,输出盒子模型。

      6)Paint:布局完成后,浏览器会立即发出Paint Setup和Paint事件,将渲染树转换成屏幕上的像素。

      reflow(回流):实际上其实是重排。html是默认流式布局的,就是常说的flow,所以reflow,就是css和js引起的html布局的重新渲染。reflow会从html这个root frame开始往下递归,依次计算所有的节点几何尺寸和位置,以确认是渲染树的一部分发生变化还是整个渲染树。reflow是无法避免的。现代浏览器会对回流做优化,它会等到足够数量的变化发生,再做一次批处理回流。

    1. 页面第一次渲染(初始化)
    2. DOM树变化(如:增删节点)
    3. Render树变化(如:padding改变)
    4. 浏览器窗口resize 获取元素的某些属性

      repaint(重绘):就是元素的背景色、文字颜色等不改变位置和大小属性变化时,屏幕的一部分要重画。reflow必定引起repaint,repaint可以单独触发。

  • 相关阅读:
    shell:echo -e "33字体颜色"
    Linux配置swap
    软工2017第三周作业——词频效能分析
    ffmpeg——关于视频压缩
    软件工程2017第一次作业——随笔汇总
    软件工程2017第一次作业——随笔二
    软件工程2017第一次作业——随笔一
    02-分支结构
    iOS中如何知道app版本已更新
    socket编程中客户端常用函数 以及简单实现
  • 原文地址:https://www.cnblogs.com/yupire/p/13098479.html
Copyright © 2011-2022 走看看