浏览器的渲染过程

news2024/11/27 18:44:36

文章目录

  • 什么是浏览器的渲染?
  • 浏览器渲染过程
  • 面试问点:
      • 为什么操作DOM慢?
      • 回流与重绘
      • 那么,什么情况下会触发回流?
  • 浏览器的优化


请添加图片描述

什么是浏览器的渲染?

简单的说就是浏览器将 HTML 代码解析出来,把解析出来后的结果画到页面上,相当于就是,告诉浏览器,第一个像素点上应该呈现什么颜色,依次类推,占满整个页面静态,为什么说是静态的呢,因为当用户发生交互,页面变化(滚动、刷新、跳转等),使页面改变后,浏览器得重新计算整个页面的像素,可想而知,是一个庞大的工作量。


浏览器渲染过程

浏览的渲染过程简单来说就是:解析、构建渲染树、布局、绘制、复合,的过程。

  • 解析数据包得到HTML文件, CSS文件,构建DOM树: 字节数据 ==> 转换成字符串 ==> 得到(标记)Token ==> 转换成Node节点(通过对象描述代码) ==> 构建Dom树。
    解析CSS: 将CSS文件转化为 CSSOM 树,描述页面中样式规则与它们是如何应用于各个元素。
  • 构建渲染树: DOM + CSSOM == render 树。(渲染树只会包含显示的节点) (例如 display:none 的不需要渲染)
  • 布局: 确定页面上每个元素位置和尺寸的过程,浏览器计算每个元素的位置,大小以及它的几何属性,修改页面样式可能触发重新布局(回流)。
  • 绘制: GPU绘制,将渲染树中元素绘制到屏幕,每个元素被绘制到一个层中,组合在一起形成最终画面,当页面中元素样式的改变并不影响它在文档流中的位置时,浏览器会将新样式赋予给元素并重新绘制它。(重绘)。(以上五步为重点)
  • 层叠与合成: 将不同图层组合在一起,形成最终可见的页面,图层是元素一部分或整个元素,取决于浏览器如何优化渲染过程。
  • 交互: 用户与页面交互时(点击或滚动页面),浏览器需要重新执行一些步骤,例如重新布局和绘制。

面试问点:

为什么操作DOM慢?

在浏览器渲染过程中,DOM操作是相对慢的,为什么?因为 js 引擎线程和渲染线程互斥,所以,当我们通过js来操作DOM的时候,就势必会涉及到两个线程的通信和切换,所以会带来性能上的损耗。

回流与重绘

浏览器的渲染过程中给出了这样两个概念:回流和重绘。回流:浏览器计算每个元素的位置,大小以及它的几何属性,修改页面样式可能触发重新布局。重绘:当页面中元素样式发生改变,且不影响它在文档流中的位置时,浏览器会将新样式赋予给元素并重新绘制它。

那么,什么情况下会触发回流?

  • 页面初次渲染
  • 增加、删除可见的DOM元素
  • 改变元素的几何信息
  • 窗口大小改变

而当非几何信息被修改时,会触发重绘。
并且回流必定触发重绘,重绘不一定回流。

浏览器的优化

浏览器会维护一个渲染队列,当改变元素的几何属性导致回流发生时,回流行为会被加入到渲染队列中,在达到阈值或者达到一定时间之后会一次性将渲染队列中所有的回流生效。

因此,有这样一段JS代码:

div.style.left = '10px';
div.style.top = '10px'; 
div.style.width = '10px';
div.style.height = '10px';

表面上看它们需要执行四次回流,但实际上只有一次。
但是如果在原来的基础上添加这些代码,回流又会重新变成4次,这又是为什么呢:

div.style.left = '10px';
console.log(div.offsetLeft)

div.style.top = '10px'; 
console.log(div.offsetTop)

div.style.width = '10px';
console.log(div.offsetWidth)

div.style.height = '10px';
console.log(div.offsetHeight)

这就不得不提到我们接下来要讲的,[offsetWidth]属性会强制渲染队列刷新。

强制渲染队列刷新

这12个属性都会强制渲染队列刷新

offsetTop, offsetLeft,offsetWidth, offsetHeight,
clientTop, clientLeft, clientWidth, clientHeight,
socrollTop, scrollLeft,scrollWidth, scrollHeight

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

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

相关文章

轻松学会!回收站数据恢复的几种妙招

回收站数据恢复方法是一个涉及计算机操作和数据安全的重要话题。在日常使用电脑的过程中,我们经常会遇到误删文件或清空回收站的情况,导致重要数据丢失。幸运的是,有多种方法可以尝试恢复这些丢失的数据。以下将详细介绍几种常见的回收站数据…

C++: C/C++内存管理

前言 本篇博客将详细介绍C的内存管理 💖 个人主页:熬夜写代码的小蔡 🖥 文章专栏:C 若有问题 评论区见 🎉欢迎大家点赞👍收藏⭐文章 ​ 一.C/C内存分布 让我们先来看看下面的代码吧 int globalVar 1; st…

【植物识别系统】Python+人工智能+深度学习+卷积神经网络算法+TensorFlow+算法模型+Django网页界面平台

一、介绍 植物识别系统,使用Python作为主要编程语言开发,通过收集常见的6中植物树叶(‘广玉兰’, ‘杜鹃’, ‘梧桐’, ‘樟叶’, ‘芭蕉’, ‘银杏’)图片作为数据集,然后使用TensorFlow搭建ResNet50算法网络模型&am…

C++:模板的特化与分离编译

之前我们在介绍模板的时候仅仅是简单的介绍了模板的用法,本篇文章我们来详细的介绍下模板中比较重要的几个点。 一,非类型模板参数 我们之前的c中,会将经常使用的而又确保在我们程序的运行过程中值不会改变的值进行#define: #d…

Unity Apple Vision Pro 保姆级开发教程-环境配置、导入 PolySpatial 案例、程序发布到设备

视频教程 Unity 环境配置、导入 PolySpatial 案例、程序发布到设备 Unity Vision Pro 中文课堂教程地址: Unity3D Vision Pro 开发教程【保姆级】 | Unity 中文课堂 教程说明 这期教程我将介绍使用 Unity 开发 Apple Vision Pro 应用所需要的 Unity 环境配置&…

055_基于python摄影平台交流系统

目录 系统展示 开发背景 代码实现 项目案例 获取源码 博主介绍:CodeMentor毕业设计领航者、全网关注者30W群落,InfoQ特邀专栏作家、技术博客领航者、InfoQ新星培育计划导师、Web开发领域杰出贡献者,博客领航之星、开发者头条/腾讯云/AW…

Android compose 重建流程1

前言 本文是笔者学习Compose是如何自动触发UI刷新的笔记,可能缺乏一定可读性和教导性.(建议阅读参考文献更具启发性) 使用以下BOM作为研究环境. composeBom "2024.04.01" androidx-compose-bom { group "androidx.compose", name "compose-bom…

实习冲刺Day2

算法题 反转链表 206. 反转链表 - 力扣(LeetCode) /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}*…

AI大模型应用(3)开源框架Vanna: 利用RAG方法做Text2SQL任务

AI大模型应用(3)开源框架Vanna: 利用RAG方法做Text2SQL任务 RAG(Retrieval-Augmented Generation,如下图所示)检索增强生成,即大模型LLM在回答问题时,会先从大量的文档中检索出相关信息,然后基于这些检索出…

【LLaMA-Facrory】【模型评估】:代码能力评估——Qwen-Coder-7B 和 deepseek-coder-7b-base-v1.5

目录 序言 1 拉取 Qwen2.5-Coder-7B 模型 2 编写python测试模型 3 启动webui导入模型测试 4 模型评估 4.1 前期准备工作 4.2 Qwen2.5-Coder-7B 模型评估 数据说明 综合分析 4.3 deepseek-coder-7b-base-v1.5 模型评估 数据说明 综合分析 4.4 模型比较 1. 文本生成…

软件安全测试报告如何编写?CMA、CNAS软件安全测试机构推荐

随着软件产品的增多,产品安全成为软件企业留住用户的方法之一。安全测试是验证和检查软件安全的重要手段,而软件安全测试报告则是测试人员工作成果的最好体现,那么软件安全测试报告该如何编写呢?权威的CMA、CNAS软件安全测试机构又有哪些? …

WeMapEngine开发实战,创建你的第一个GIS项目

我们在《WeMapEngine可快速构建的GIS应用功能》一文中为你分享了WeMapEngine可快速建的GIS应用功能。 今天再为你分享基于WeMapEngine的开发实战,演示如何快速创建第一个GIS项目。 创建你的第一个GIS项目 现在,我们开始构建第一个项目。 在这个项目中…

emulator -version报错解决方案

使用android studio安装安卓环境之后,会发现emulator -version报如下错 [14960]:ERROR:android/android-emu/android/qt/qt_setup.cpp:28:Qt library not found at ..\emulator\lib64\qt\lib Could not launch C:\Users\litbai\..\emulator\qemu\windows-x86_64\qe…

【Java小白图文教程】-04-循环结构

精品专题: 01.《C语言从不挂科到高绩点》课程详细笔记 https://blog.csdn.net/yueyehuguang/category_12753294.html?spm1001.2014.3001.5482 02. 《SpringBoot详细教程》课程详细笔记 https://blog.csdn.net/yueyehuguang/category_12789841.html?spm1001.20…

深入理解计算机系统--计算机系统漫游

对于一段最基础代码的文件hello.c&#xff0c;解释程序的运行 #include <stdio.h>int main() {printf ( "Hello, world\n") ;return 0; }1.1、信息就是位上下文 源程序是由值 0 和 1 组成的位&#xff08;比特&#xff09;序列&#xff0c;8 个位被组织成一组…

springboot048校园资料分享平台(论文+源码)_kaic

校园资料分享平台 摘要 随着信息互联网购物的飞速发展&#xff0c;国内放开了自媒体的政策&#xff0c;一般企业都开始开发属于自己内容分发平台的网站。本文介绍了校园资料分享平台的开发全过程。通过分析企业对于校园资料分享平台的需求&#xff0c;创建了一个计算机管理校园…

无人机的电池放电详解!

一、定义与表示方法 无人机的电池放电率是指电池在一定时间内放出其储存电能的能力&#xff0c;这一参数通常用C数来表示。C数越大&#xff0c;表示放电速率越快。 例如&#xff0c;一个2C的电池可以在1/2小时内放完其全部电量&#xff0c;而一个10C的电池则可以在1/10小时内…

喜讯!望繁信科技荣膺2022年中国超自动化先锋企业TOP20

36氪重磅发布「2022中国超自动化先锋企业」调研结果。凭借多年在流程挖掘领域过硬的技术实力和突出的产品创新力&#xff0c;望繁信科技在众多调研样本企业中脱颖而出&#xff0c;赢得了专家评委的充分认可&#xff0c;成功入选2022年中国超自动化先锋企业TOP20。 什么是超自动…

【书生大模型实战营】闯关任务1-入关岛

这里写自定义目录标题 第一关 L0G1000 Linux 基础知识 第一关 L0G1000 Linux 基础知识 SSH连接与端口映射并运行hello_world.py 关键截图&#xff1a;

502 错误码通常出现在什么场景?

服务器过载场景 高流量访问&#xff1a;当网站遇到突发的高流量情况&#xff0c;如热门产品促销活动、新闻热点事件导致网站访问量激增时&#xff0c;服务器可能会因承受过多请求而无法及时响应。例如&#xff0c;电商平台在 “双十一” 等购物节期间&#xff0c;大量用户同时…