jq动态渲染后获取不到元素高度_浏览器的渲染机制

面试肯定会问到这个吧~

So:再一次的屡屡浏览器的渲染机制~

在渲染一开始会先从网络层获取请求文档(HTML、XML)的内容,然后再进行以下基本流程

17dfde7b6ef07d56dbc33337c5f5379d.png

3.1 解析HTML =》 DOM树

从HTML文本解析到HTML语法树,再解析到文档对象树(DOM Tree) HTML语法树生成的两个过程 1. 词法解析: 按照词法规则将HTML文本分割成大量的标记(Token), 并去除其中无关的字符(空格), 2. 语法解析: 匹配Token序列生成语法树, 有两种匹配方式:自上而下,自下而上 2.1 自上而下解析器和自下而上解析器。直观地来说,自上而下的解析器从语法的高层结构出发,尝试从中找到匹配的结构。而自下而上的解析器从低层规则出发,将输入内容逐步转化为语法规则,直至满足高层规则 2.2 但是HTML无法用常规的自上而下或自下而上的解析器进行解析 原因: 2.2.1 语言的宽容本质, 2.2.2. 浏览器对常见无效HTML用法的包容态度, 2.2.3. 解析过程需要不断重复,源内容在解析过程中通常不会改变,但是HTML中,脚本标记如果包含document.write,就会添加额外的标记,这样的解析过程实际上就更改了输入内容 3. 容错机制: 解析器在对标记化输入内容进行解析,以构建文档树,如果文档的格式正确就直接进行解析,遗憾的是,HTML文档不可能不会有格式错误的时候,因此解析器必须具备一定的容错性 3.1 明显不能再某些外部标记中添加的元素,在此情况下,我们应该关闭所有标记,知道出现禁止添加的元素,然后再加入该元素 3.2 浏览器不能直接添加的元素,但开发者忘记添加了,浏览器会自动添加 3.3 向inline元素内添加block元素。闭合所有inline元素,直到出现下一个较高级的block元素 3.4 如果这样仍然无效。可关闭所有元素、直到可以添加元素可止,或者忽略该标记

浏览器内核中对HTML页面真正的内部表示并不是语法树,而是文档对象模型,DOM也是树形结构,以Document对象为根元素,

DOM节点基本和HTML语法树节点一一对应

b00d8d2f29ce677454bba457e5672e35.png

2.3 JS解析的影响

DOM树创建过程中遇到script标签会创建HTMLScriptElement实例,HTMLScript-Element的父类ScriptElement中包含了对JS脚本的所有处理,包括下载、缓存、执行。 2.3.1 对于外部引用的脚本文件,从脚本下载到脚本执行完,文档解析过程会一直被阻塞 2.3.2 script属性: async: 异步加载js文件,采用并行下载,不会阻塞DOM解析, 下载完成后立即解析执行js 2.3.3 script属性: defer: 异步加载js文件,采用并行下载,不会阻塞DOM解析,并且在解析DOM之后执行脚本 所以: 1. 优化 JavaScript 的首要规则:将脚本放在底部! 2. 使用无阻塞脚本 3. 动态的script

3.2 解析CSS =》 CSSOM

页面中所有的CSS由样式表CSSStyleSheet集合构成,而CSSStyle是一系列CSSRule的集合,每一条CSSRule则由选择器CSSStyleSelector部分和声明CSSStyleDeclaration部分构成, 而CSSStyleDeclaration是css树形和值的key-Value集合

CSS解析完毕后进行CSSRule的匹配过程,寻找满足每条css规则Selector部分的HTML元素,然后将其Declaration部分应用于该元素,实际上还会考虑样式的继承和样式默认(遵循CSS规则)

e3e0f18ed74982fcb1e49a80e4364318.png

3.3 布局: 渲染树(Render Tree) <= attchment(DOM Tree + Style Rules)

渲染树用于表示文档的可视信息,记录文档中每个可视元素的布局和渲染方式 HTML页面通过CSS控制页面布局,所以渲染树的每个节点对象都需要知道自己身上的CSS属性,那么CSSSelector此时就是在找到对应的渲染节点
所以渲染树的每个Node都存储了绘制页面所需的样式及布局信息,每个节点都知道如何去绘制自己,这也就是渲染树与DOM树的区别,渲染树用于显示,那些不可见的元素不会出现在渲染树中 不可见元素 display: none 不会出现在渲染树中 visiblity: hidden 会显示在渲染树中 opacity: 0 会显示在渲染树中 filter:alpha(opacity=0)会显示在渲染树中

【回流(reflow)】 回流是指窗口尺寸被修改,发生滚动操作,或者元素位置相关的属性被更新时候,触发布局过程,在布局过程中要重新计算所有元素的位置信息 回流发生在Render树上,脱离文档流指的就是在此时布局是不按照正常布局排列布局 触发回流的操作: 1. 改变盒模型属性 2. DOM树的结构变化 3. 调整浏览器窗口大小 4. 获取某些属性: offset scroll client getComputerStyle currentStyle 触发回流一定会触发后续的重绘操作,相对于一个元素的回流,可能会影响到父元素,例如 浮动导致父元素的高度塌陷/定位属性等

布局优化方案: 尽量触发小规模的重绘,不会触发回流 1. 不要一条一条修改DOM属性,修改className或者修改CSSText 2. 对于一个元素进行复杂的操作时,可以先隐藏它,操作完成后再显示 3. 在需要经常获取那些引起浏览器回流的属性值时,要缓存到变量中 4. 不要使用table布局,因为一个小改动可能会造成整个table重新布局 5. 对于一些进行动画的元素,可以进行硬件渲染,从而避免重绘和回流


【重绘(repaint)】 重绘是指当与视觉相关的样式属性值被更新时会触发绘制过程,在绘制过程中要重新计算元素的视觉信息,使元素呈现新的外观; 元素的重绘只发生在渲染层 render layer上。所以,如果要改变元素的视觉属性,最好让该元素成为一个独立的渲染层

8af7193f34862db70931447e43af2690.png

3.4 绘制 painting

在绘制阶段,系统会遍历渲染树,并调用渲染器的"paint"方法,将渲染器的内容显示在屏幕上

以下是两大内核的渲染流程

424e3263c298799a78a1e9e05dec543f.png

325b44c9f4beada842458b1ec4b39d80.png

参考: https://www.cnblogs.com/xiaohuochai/p/9174471.html https://www.html5rocks.com/zh/tutorials/internals/howbrowserswork/#Painting

转载自【简书--贝程教育_前端】

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

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

相关文章

数字时代的抉择,金蝶 EBC 的破局

今年 10 月&#xff0c;Gartner 发布了企业在 2021 年需要关注的重要战略科技趋势&#xff0c;其中“可组装的企业”一词引起热议。Gartner 认为原本为了提高效率而建立的静态业务流程很脆弱&#xff0c;在疫情的冲击下容易变得支离破碎&#xff0c;因此企业应具有不断重组与改…

自己动手从0开始实现一个分布式RPC框架

简介&#xff1a; 如果一个程序员能清楚的了解RPC框架所具备的要素&#xff0c;掌握RPC框架中涉及的服务注册发现、负载均衡、序列化协议、RPC通信协议、Socket通信、异步调用、熔断降级等技术&#xff0c;可以全方位的提升基本素质。虽然也有相关源码&#xff0c;但是只看源码…

deb 中标麒麟_「图」百度网盘Linux版放出deb包客户端:新增支持Ubuntu 18.04 LTS

6月中旬发布的百度网盘Linux版本中&#xff0c;首先适配了中标麒麟桌面操作系统软件(兆芯版)V7.0。而今天Ubuntu官方推特最新微博表示&#xff0c;继发布Linux rpm包客户端之后&#xff0c;官方今天又推出了deb包客户端&#xff0c;新增支持Ubuntu 18.04 LTS。目前百度网盘已经…

KubeVela 成为 CNCF 沙箱项目,让云端应用交付更加简单

简介&#xff1a; KubeVela 就是这样一个面向用户的上层平台项目。对于业务开发者来说&#xff0c;KubeVela 简单、易用&#xff0c;它可以让开发者以极低的心智负担和上手成本在 Kubernetes 上定义与部署应用... 但更重要的是&#xff0c;对于平台团队来说&#xff0c;KubeVel…

携程梁建章:要让元宇宙技术成为真宇宙探索、旅游的灵感来源

“我们要把旅游做的更有交互性&#xff0c;更有沉浸感&#xff0c;更有趣&#xff0c;远远抛开元宇宙。” 携程集团联合创始人&#xff0c;董事局主席梁建章在12月9日于澳门伦敦人举办的全球合作伙伴峰会上&#xff0c;发表了对热门话题“元宇宙”的看法并表示&#xff0c;激发…

shell两个时间字符串插值_Shell 脚本速成

0x00 前言这段时间快速把 Micropoor 的内网课程看完了一遍&#xff0c;里面出现了很多 Shell 脚本。Shell 脚本有什么好处&#xff1f;无需安装其他软件适合任务自动化&#xff0c;擅长系统管理任务通过 Shell 编程&#xff0c;大大提高渗透效率。0x01 第一个 shell 脚本功能&a…

Quick Audience组织和工作空间功能解读

近期&#xff0c;Quick Audience完成了权限系统全面升级&#xff0c;可以解决集团企业不同品牌、不同运营组织&#xff0c;不同消费者运营的诉求&#xff0c;精细化保障企业数据访问安全&#xff0c;提升管控的灵活度。 Quick Audience整个系统分为组织管理和工作空间两层。一个…

mac安装python环境教程_python mac下安装虚拟环境的图文教程

Mac 下 Flask 框架 workon命令找不到 ---- 最终解决方案&#xff08;详解具体实现操作过程中遇到的坑&#xff09;2018年08月17日 00:02:05Jasonmes阅读数&#xff1a;622 Mac 下 Flask 的 全网最详细搭建1.安装virtualenv和virtualenvwrapper sudo pip install virtualenv# 以…

数据智能构建管理平台Dataphin V2.9.4.3版本发布

简介&#xff1a; Dataphin发布V2.9.4.3版本升级多项产品能力&#xff0c;该版本在产品功能和用户体验上都进行了优化和提升&#xff0c;旨在为用户提供更完善的产品能力和体验&#xff0c;以加速企业数据中台建设进程。 1 产品简介 Dataphin是阿里巴巴集团OneData数据治理方…

host文件注释 ubuntu_Redis and MongoDB 设置密码验证(scrapy)(win)(ubuntu)

1 . Rediswin101.找到 redis.windows.conf ,对其进行编辑。将 # requirepass foobared 更改为 requirepass yourpassword 2.重新启动 redis-server 服务,如: redis-server redis.windows.conf (以redis.windows.conf为配置启动redis-server)ubuntu1.ubuntu下Redis的配置文件为…

阿里云罗小飞:阿里云边缘云,从资源到场景的产品演进

2021年7月1日&#xff0c;以“云集影从&#xff0c;融网聚生”为主题的GIDC全球互联网数据大会在上海成功举行。本次大会由中国信通院指导&#xff0c;艾迪网主办&#xff0c;邀请来自政府、产业等多领域的专家&#xff0c;围绕“新基建”、“绿色数据中心”、“云网协同”、“…

乾通嗖嗖抢先布局多元化用工 实现全流程数智化人力管理

12月9日&#xff0c;乾通互连战略升级暨乾通嗖嗖媒体发布会在北京举行。在发布会上&#xff0c;乾通互连对外宣布组织架构再升级&#xff0c;未来将围绕薪酬社保福利及多元化用工两大业务板块进行战略布局&#xff0c;推出多元化用工解决方案——乾通嗖嗖。 乾通嗖嗖通过线上多…

那些年,我们一起做过的性能优化

简介&#xff1a; 性能优化是一个体系化、整体性的事情&#xff0c;印刻在项目开发环节的各个细节中&#xff0c;也是体现技术深度的大的战场。文章以Quick BI的复杂系统为背景&#xff0c;详细介绍性能优化的思路和手段&#xff0c;以及体系化的思考。 一直以来&#xff0c;性…

中继承父类实现父类方法的快捷键_关于封装、继承

在初期&#xff0c;很多人对于java中一些定义的认识比较模糊&#xff0c;今天我就来详细讲一讲我所认识的封装和继承。1、封装1.1&#xff09;概念&#xff1a;将类的某些信息隐藏在内部&#xff0c;不允许外部程序直接访问&#xff0c;而是通过该类提供的方法来实现对隐藏信息…

KubeVela 上手(1)|让云端应用交付更加丝滑

简介&#xff1a; KubeVela 是阿里云和微软共同发起的 OAM&#xff08;Open Application Model&#xff09;标准的技术实现&#xff0c;旨在打造统一、标准、跨环境的云端应用交付&#xff0c;省时省力&#xff0c;轻松简单 作者&#xff5c;KubeVela 社区 本文适合所有软件工…

华为云云原生首次在太空验证,提升“天算星座“卫星计算精度

12月10日&#xff0c;搭载“天算星座”计算平台的试验卫星在轨稳定运行&#xff0c;华为云“云边一体”方案首次在太空验证。 图&#xff1a;天算星座计划 “天算星座”计划&#xff0c;由北京邮电大学深圳研究生院与天仪研究院共同发起&#xff0c;以服务国家重大战略需求和…

火柴人_火柴人战争遗产修改无限金币钻石

火柴人战争遗产修改无限金币钻石V1.11.160/中文/80M商店内使用钻石购买商品不减反增【一、游戏简介】《火柴人战争遗产修改版 Stick War: Legacy》一直最受玩家欢迎、评分最高的一款网游现在推出移动版.玩 Stick War&#xff0c;体验这款最受欢迎、最有趣、最具挑战性且容易入迷…

一种通用整形数组压缩方法

简介&#xff1a; 我们在开发中后台应用或者中间件的时候&#xff0c;会存储一些数据在内存中以加快访问速度。随着数据量的增加&#xff0c;除了可以放置于堆外&#xff0c;还可以通过实时压缩来缓解。今天就给大家介绍一种压缩整形数组的方式。 作者 | 玄胤 来源 | 阿里技术公…

gitlab git clone 卡住_gitlab从入门到绝望

啥年月了还用svn&#xff0c;日了狗一样难受。开搞&#xff01;docker是最好的容器&#xff0c;直接docker装gitlab。学新玩意不去官网不是人&#xff1a;https://docs.gitlab.com/omnibus/docker/#expose-gitlab-on-different-portsdocker pull gitlab/gitlab-cesudo docker r…

FBEC2021暨第六届金陀螺奖颁奖典礼盛大开幕

2021年12月10日&#xff0c;由广东省游戏产业协会、广东省虚拟现实产业技术创新联盟、深圳市科学技术协会、深圳市互联网文化市场协会指导&#xff0c;陀螺科技主办&#xff0c;深圳市科技开发交流中心、恒悦创客魔方协办&#xff0c;行业头部媒体游戏陀螺、VR陀螺、陀螺电竞、…