浏览器的渲染原理

news2024/12/25 9:32:58

网页的解析过程

◼ 常见的浏览器内核有
 Trident ( 三叉戟):IE、360安全浏览器、搜狗高速浏览器、百度浏览器、UC浏览器;
 Gecko( 壁虎) :Mozilla Firefox;
 Presto(急板乐曲)-> Blink (眨眼):Opera
 Webkit :Safari、360极速浏览器、搜狗高速浏览器、移动端浏览器(Android、iOS)
 Webkit -> Blink :Google Chrome,Edge
◼ 我们经常说的浏览器内核指的是浏览器的排版引擎:
 排版引擎(layout engine),也称为浏览器引擎(browser engine)、页面渲染引擎(rendering engine)或样版引擎。
◼ 也就是一个网页下载下来后,就是由我们的渲染引擎来帮助我们解析的。

浏览器渲染流程

 

回流和重绘解析

◼ 理解回流reflow:(也可以称之为重排)
 第一次确定节点的大小和位置,称之为布局(layout)。
 之后对节点的大小、位置修改重新计算称之为回流。
◼ 什么情况下引起回流呢?
 比如DOM结构发生改变(添加新的节点或者移除节点);
 比如改变了布局(修改了width、height、padding、font-size等值)
 比如窗口resize(修改了窗口的尺寸等)
 比如调用getComputedStyle方法获取尺寸、位置信息;
◼ 理解重绘repaint:
 第一次渲染内容称之为绘制(paint)。
 之后重新渲染称之为重绘。
◼ 什么情况下会引起重绘呢?
 比如修改背景色、文字颜色、边框颜色、样式等;
◼ 回流一定会引起重绘,所以回流是一件很消耗性能的
事情。
◼ 所以在开发中要尽量避免发生回流:
◼ 1.修改样式时尽量一次性修改
 比如通过cssText修改,比如通过添加class修改
◼ 2.尽量避免频繁的操作DOM
 我们可以在一个DocumentFragment或者父元素中
将要操作的DOM操作完成,再一次性的操作;
◼ 3.尽量避免通过getComputedStyle获取尺寸、位置等信
息;
◼ 4.对某些元素使用position的absolute或者fixed
 并不是不会引起回流,而是开销相对较小,不会对
其他元素造成影响。

合成和性能优化

特殊解析composite合成

绘制的过程,可以将布局后的元素绘制到多个合成图层中。
 这是浏览器的一种优化手段;
◼ 默认情况下,标准流中的内容都是被绘制在同一个图层(Layer)中的;
◼ 而一些特殊的属性,会创建一个新的合成层( CompositingLayer ),并且新的图层可以利用GPU来加速绘制;
 因为每个合成层都是单独渲染的;
◼ 那么哪些属性可以形成新的合成层呢?常见的一些属性:
 3D transforms(即使translateZ为0也会分层)
 video、canvas、iframe
 opacity 动画转换时;
 position: fixed
 will-change:一个实验性的属性,提前告诉浏览器元素可能发生哪些变化;
 animation 或 transition 设置了opacity、transform;
◼ 分层确实可以提高性能,但是它以内存管理为代价,因此不应作为 web 性能优化策略的一部分过度使用。

defer和async属性

defer

◼ defer 属性告诉浏览器不要等待脚本下载,而继续解析HTML,构建DOM Tree。
 脚本会由浏览器来进行下载,但是不会阻塞DOM Tree的构建过程;
 如果脚本提前下载好了,它会等待DOM Tree构建完成,在DOMContentLoaded事件之前先执行defer中的代码;
◼ 所以DOMContentLoaded总是会等待defer中的代码先执行完成。
◼ 另外多个带defer的脚本是可以保持正确的顺序执行的。
◼ 从某种角度来说,defer可以提高页面的性能,并且推荐放到head元素中;
◼ 注意:defer仅适用于外部脚本,对于script默认内容会被忽略。

  <script src="./js/test.js" defer></script>
  <script src="./js/demo.js" defer></script>

async

async 特性与 defer 有些类似,它也能够让脚本不阻塞页面。
◼ async是让一个脚本完全独立的:
 浏览器不会因 async 脚本而阻塞(与 defer 类似);
 async脚本不能保证顺序,它是独立下载、独立运行,不会等待其他脚本;
 async不会能保证在DOMContentLoaded之前或者之后执行;
◼ defer通常用于需要在文档解析后操作DOM的JavaScript代码,并且对多个script文件有顺序要求的;
◼ async通常用于独立的脚本,对其他脚本,甚至DOM没有依赖的;
 

  <script src="./js/test.js" async></script>
  <script src="./js/demo.js" async></script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/614157.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能python:Python散点图连接成光滑曲线的技巧

Python散点图连接成光滑曲线的技巧 Python是一种功能强大的编程语言&#xff0c;广泛用于数据科学、机器学习、Web开发和自动化等领域。在数据可视化中&#xff0c;散点图是一种非常重要的图表类型&#xff0c;用于显示两个变量之间的关系。然而&#xff0c;有时散点图可能过于…

Linux 可视化管理-webmin 和 bt 运维工具

Linux 可视化管理-webmin 和bt 运维工具 webmin 基本介绍 Webmin 是功能强大的基于Web 的Unix/linux 系统管理工具。管理员通过浏览器访问Webmin 的各种管理功能并完成相应的管理操作。除了各版本的linux 以外还可用于&#xff1a;AIX、HPUX、Solaris、Unixware、Irix 和Fre…

freeRTOS学习(四)

队列管理 队列提供了任务到任务、任务到中断和中断到任务的通信机制。 队列的特征 数据存储 队列可以保存有限数量的固定大小的数据项。一个队列所能容纳的最大条目数称为它的长度。每个数据项的长度和大小都在创建队列时设置。 队列通常用作先进先出&#xff08;FIFO&…

【利用AI让知识体系化】常见的移动端适配知识

I. 引言 A. 移动设备的普及度 移动设备的普及度近年来持续攀升&#xff0c;据统计&#xff0c;截至2021年&#xff0c;全球手机用户数量已达51.98亿&#xff0c;而智能手机的普及率则已经超过了70%&#xff0c;成为人们生活中最为重要和常用的工具之一。 同时&#xff0c;平…

chatgpt赋能python:Python如何更改?

Python如何更改&#xff1f; 如果您想成为一名成功的Python程序员&#xff0c;那么您需要知道如何更改Python代码。在这篇文章中&#xff0c;我们将介绍Python如何更改&#xff0c;并提供一些实用的技巧和建议来使您的编码更加高效和有用。 什么是Python&#xff1f; Python…

chatgpt赋能python:Python如何填充颜色

Python如何填充颜色 Python是一种简单易学但功能丰富的编程语言&#xff0c;被广泛用于各种开发领域。其中填充颜色是Python中的一个非常重要的功能&#xff0c;在很多项目中都会经常用到。本文将介绍Python如何填充颜色&#xff0c;让你快速上手。 什么是填充颜色 填充颜色…

Python matplotlib库的使用

目录 画图的两种基本方式&#xff1a; 隐藏边框&#xff1a; 隐藏坐标系 设置网格线 共享坐标轴 双坐标轴 设置坐标轴标签及刻度字体大小 设置坐标轴标签据离坐标轴距离 画点与线 标注文字 画不同大小的多个坐标系 调节子图间距 导入库&#xff1a; import matplotl…

【JavaSE】Java(五十):核心要点

文章目录 1. JDK 和 JRE 有什么区别2. \和 equals 的区别3. final 在java中有什么作用4. Java中的Math() 类有哪些常用方法5. String 属于基础数据类型吗? 1. JDK 和 JRE 有什么区别 JDK&#xff08;Java Development Kit&#xff09;和 JRE&#xff08;Java Runtime Environ…

FusionCharts Suite XT 3.20.X Crack

3.20版# 2023年3月24日 新功能 FusionCharts 3.20版本引入了一种新方法_changeXAxisCordinates&#xff0c;它允许用户自动更改x轴&#xff0c;使其在图例或数据交互时居中对齐。 FusionCharts 3.20版本更新了Angular集成&#xff0c;支持Angular版本14和15。 FusionChart…

HTML (Hyper Text Markup Language)

目录 网页(html文件) 什么是HTML? web标准 为啥需要web标准 web标准的构成 VScode的使用 HTML标签 基本语法 标签关系 结构标签 课间拓展: 了解骨架代码 HTML中常见的标签 标题标签 注释标签 段落标签 换行标签 文本格式化标签 div 和span 标签 图像标签 …

【vulnhub靶场】MATRIX-BREAKOUT: 2 MORPHEUS

文章目录 描述&#xff1a;一、开启靶机信息收集二层发现三层探测信息整理&#xff1a;初步攻击basic爆破&#xff1a;已知漏洞利用文件上传 后渗透测试后渗透测试 描述&#xff1a; 这是《黑客帝国》系列的第二部&#xff0c;副标题是《沉睡魔咒:1》。它的主题是回到第一部《…

chatgpt赋能python:Python如何在图片上添加文字

Python如何在图片上添加文字 对于网站的SEO优化而言&#xff0c;图片上的文字也是非常重要的一环。而Python是一种常用的编程语言&#xff0c;可以通过一些Python库来在图片上添加文字。 PIL库介绍 PIL&#xff08;Python Imaging Library&#xff09;是Python中常用的图像处…

面对日益增加的网络安全风险,需要全面的API安全

全球商业界在过去几年中面临的挑战是前所未有的。流行病、通货膨胀、能源危机、战争、经济衰退以及供应链的碎片化和延误都给组织带来了问题&#xff0c;没有一个行业、市场或地区未受影响。 然而&#xff0c;尽管存在这些问题&#xff0c;我们的数字生态系统和足迹变得越来…

chatgpt赋能python:Python如何更改主题

Python 如何更改主题 Python 是一种非常强大的编程语言&#xff0c;能够适用于多种领域&#xff0c;包括数据分析、机器学习、Web 开发等。Python 社区为开发者提供了各种主题&#xff0c;这篇文章将介绍 Python 如何更改主题。 什么是主题&#xff1f; 主题是指编程环境的外…

Web服务器开发、文件上传

1 Stream的读写操作 2 http模块web服务 3 request请求对象 4 response响应对象 5 axios node中使用 6 文件上传的细节分析 前面一篇提到的内容是node对底层的文本操作&#xff0c;还没有涉及到从文本文件获取信息然后传递给客户端和如何响应客户端请求。这里开始了解如何实…

chatgpt赋能python:Python实现人脸识别的可能性和局限性

Python实现人脸识别的可能性和局限性 随着计算机视觉技术的不断发展&#xff0c;人脸识别技术也得到了广泛应用&#xff0c;其中Python作为一种高效、简洁和易于学习的编程语言&#xff0c;被广泛用于人脸识别算法的开发和实现。 什么是人脸识别&#xff1f; 人脸识别是一种…

chatgpt赋能python:Python如何导入CSV的完全指南

Python如何导入CSV的完全指南 CSV是一种常见的数据格式&#xff0c;在数据分析和处理中使用广泛。使用Python&#xff0c;我们可以轻松地读取、处理和分析CSV文件。在本指南中&#xff0c;我们将介绍如何使用Python导入CSV文件。 什么是CSV文件&#xff1f; CSV文件是按照逗…

chatgpt赋能python:Python如何将内容写进文件:从初学者到高级编程工程师的终极指南

Python如何将内容写进文件&#xff1a;从初学者到高级编程工程师的终极指南 Python是一种流行的编程语言&#xff0c;具有简洁而易于阅读的语法&#xff0c;开发人员可以非常方便地使用它来读取和写入文件。 本文将从基础到高级介绍使用Python将内容写入文件。 基础知识 在P…

论文笔记--Evaluating Large Language Models Trained on Code

论文笔记--Evaluating Large Language Models Trained on Code 1. 文章简介2. 文章概括3 文章重点技术3.1 评估3.2 模型训练--Codex3.3 微调模型--Codex-S3.4 微调模型--Codex-D 4. 文章亮点5. 原文传送门6. References 1. 文章简介 标题&#xff1a;Evaluating Large Languag…

chatgpt赋能python:Python构造函数详解

Python构造函数详解 在Python中&#xff0c;构造函数是一种特殊的函数&#xff0c;用于创建类的实例并初始化其属性。Python构造函数的名称为__init__&#xff0c;它在创建类的实例时自动调用。本篇文章将全面介绍Python构造函数的重要性及其使用方法。 为什么需要构造函数&a…