1、浏览器渲染原理

浏览器到底是怎么将一个html文件渲染成生动的页面的?话不多说,直接看图

以图中的过程,浏览器的渲染过程大致就是:

通过HTML解析将HTML文件解析为 DOM 树;

通过CSS解析将CSS文件解析出样式规则(CSSOM树);

通过合并DOM树和CSSOM树将生成渲染树;

依赖渲染树开始布局(文档流、盒模型、确定位置和尺寸计算);

知道了哪些节点可见、它们的计算样式以及几何信息,将渲染树中的每个节点转换成屏幕上的实际像素即开始绘制。把边框、文字颜色、阴影等绘制出来。

最后将合成好的页面展示出来。

延伸:

层叠样式的由来

还是先看图:

为页面上的任何对象计算最后一组样式时,浏览器都会先从适用于该节点的最通用规则开始(例如,如果该节点是 body 元素的子项,则应用所有 body 样式)这种行为被称作为“样式继承”,那么为了不想要继承过来的样式,那么就需要自己单独写样式来覆盖原来的样式,即层叠。而不同的浏览器提供了不同的默认样式(“User Agent 样式”),这让我们一套代码却产生了五花八门的样式,这不符合设计需求。所以又通常要编写一个全局样式(reset.css / normalize.css)来清除默认样式,让代码在不同浏览器上产生一致的效果。

"display:none"的元素是否会被渲染?

答案是否。 同为显示和隐藏的一个属性是"visibility",visibility: hidden 与 display: none 是不一样的。前者隐藏元素,但元素仍占据着布局空间(即将其渲染成一个空框),而后者 (display: none) 将元素从渲染树中完全移除,元素既不可见,也不是布局的组成部分。

回流和重绘

回流(reflow):

回流或称为layout重排。当浏览器发现某个部分发生了点变化影响了布局,需要倒回去重新渲染。reflow 会从这个 html的根节点开始往下递归,依次计算所有的结点几何尺寸和位置。reflow 几乎是无法避免的。现在界面上流行的一些效果,比如树状目录的折叠、展开(实质上是元素的显示与隐藏)等,都将引起浏览器的 reflow。鼠标滑过、点击等只要这些行为引起了页面上某些元素的占位面积、定位方式、边距等属性的变化,都会引起它内部、周围甚至整个页面的重新渲染。通常我们都无法预估浏览器到底会 reflow 哪一部分的代码,它们都彼此相互影响着。

重绘(repaint):

改变某个元素的背景色、文字颜色、边框颜色等等不影响它周围或内部布局的属性时,屏幕的一部分要重画,但是元素的几何尺寸没有变。

每次Reflow,Repaint后浏览器还需要合并渲染层并输出到屏幕上。所有的这些都会是动画卡顿的原因。

Reflow 的成本比 Repaint 的成本高得多的多。一个结点的 Reflow 很有可能导致子结点,甚至父点以及同级结点的 Reflow 。在一些高性能的电脑上也许还没什么,但是如果 Reflow 发生在手机上,那么这个过程是延慢加载和耗电的。可以在csstrigger上查找某个css属性会触发什么事件。

reflow与repaint的时机:

display:none 会触发 reflow,而 visibility:hidden 只会触发 repaint,因为没有发生位置变化。

有些情况下,比如修改了元素的样式,浏览器并不会立刻 reflow 或 repaint 一次,而是会把这样的操作积攒一批,然后做一次 reflow,这又叫异步 reflow 或增量异步 reflow。

有些情况下,比如 resize 窗口,改变了页面默认的字体等。对于这些操作,浏览器会马上进行 reflow。

下面看谷歌开发者网站上的一张图

如果更改一个既不要布局也不要绘制的属性,则浏览器将跳到只执行合成。

这个最后的版本开销最小,最适合于应用生命周期中的高压力点,例如动画或滚动。

继续深入将涉及到浏览器渲染优化,这里不再做展开。想知道哪些CSS属性会触发上面3中中的哪一个,可以查看这个网站CSS触发器。

使用不同的方式改变元素状态的最终显示过程是什么样的呢?

使用js调整元素位置 => 触发上图中的Layout+Paing+Composite

使用CSS调整元素背景色 => 触发上图Paint和Composite

使用transform调整元素位置 => 触发上图Composite

是否发现使用transform调整元素竟然只触发了Composite,比js少了两个步骤。很明显,使用transform可以提高页面渲染性能,而且用它还可以制作动画,下面来看看动画该怎么做吧。

2、CSS 动画的两种做法(transition 和 animation)

说动画前先深入了解一下"transform"属性。一般常用来给元素改变位置(translate),旋转(rotate),缩放(scale)。如果还需要对元素设置3d样式的话,就要给被设置元素的父级元素或者直接给body设置perspective属性。

要给元素进行变换前,还要清楚一个知识点-坐标系。我们浏览器以及盒模型的坐标原点都为左上角

当元素发生旋转时这个坐标轴的朝向也将发生改变。注意这一点,有时候就是没考虑好坐标轴的问题造成了布局错乱。

了解了坐标系,使用"transform:translate"的时候就更得心应手了。

transition:

使用transform是将元素从上一个状态转变为transform后的状态,直接设置这个属性后我们在浏览器中看到的就是transform后的元素了,为了让元素在发生变化时有一个过渡的效果,此时就可以用上"transition"啦,配合上":hover"等伪类选择器就可以实现简单的一次性动画效果啦。了解更多关于transition的内容可以看MDN transition

animation:

transition只能制作一次性的动画,想要制作类似这样效果的动画怎么办呢?

使用animation配合上"@keyframes name{}"就可以实现了。属性使用没什么技巧,就是多练。详情看MDN @keyframes

。知道了keyframes怎么写了,那animation又该写到哪里呢?和transition一样,将这个属性写到要被实现动画元素的本身上!

说不如做,动手做一个跳动的心吧,源码跳动的心

transform总结:

inline元素不支持transform,需要先转变为block;

translate(-50%,-50%)可做绝对定位元素的居中;

scale会造成模糊或边界变粗,酌情使用;

属性组合用:transform:scale(1.5) translate(-100%,-100%)

善用搜索引擎,不明白就看MDN;

上述内容参考MDN以及谷歌web相关文档。

html图片视频渲染原理,初识浏览器渲染原理和CSS动画相关推荐

  1. 前端性能优化之浏览器渲染原理和关键渲染路径、复合线程、图层及优化、JS 开销及优化和 HTML 和 CSS 优化

    一.浏览器渲染原理和关键渲染路径 浏览器构建渲染树,DOM 树和 CSSDOM 树合成为 Render Tree 渲染树. 浏览器的渲染流程,如下所示: JavaScript -> Style ...

  2. 浏览器渲染机制面试_前端面试大全:浏览器渲染原理-文件无法渲染

    在这一篇文章中,我们将一起学习浏览器渲染原理这部分的知识.你可能会有疑问,我又不是做浏览器研发的,为什么要来学习这个?其实我们学习浏览器渲染原理更多的是为了解决性能的问题,如果你不了解这部分的知识,你 ...

  3. 解析html网页原理,深入浅出浏览器渲染原理

    一.前言 浏览器的内核是指支持浏览器运行的最核心的程序,分为两个部分,一是"渲染引擎",二是"JS引擎". 渲染引擎在不同的浏览器也不是都相同的,比如: Fir ...

  4. java浏览器渲染_优化浏览器渲染

    优化浏览器渲染 资源被下载到客户端后,浏览器仍需加载,解释,并渲染HTML.CSS和Javascript代码.只需利用现有浏览器的特性简单地编排你的代码和页面,就可以提升客户端的性能. 使用高效率的C ...

  5. 如何用php直接渲染页面,总结浏览器渲染页面的方法

    转载自web fundamental 构建对象模型 浏览器渲染页面前需要先构建 DOM 和 CSSOM 树.因此,我们需要确保尽快将 HTML 和 CSS 都提供给浏览器.字节 → 字符 → 标记 → ...

  6. 浏览器工作原理和V8引擎

    一.浏览器的工作原理 比如在浏览器中输入网址,然后dns进行解析,解析出的就是服务器的一个ip地址.服务器返回一个html文件,浏览器内核在解析html文件的过程中,遇到link标签和script标签 ...

  7. file_get_contents js没有渲染数据_浏览器渲染页面那些事

    浏览器 浏览器是一种软件,它可以从远程服务器(或本地磁盘)中加载文件并显示文件,它可以允许用户和它交互. 浏览器的核心是浏览器引擎.在不同的浏览器中,根据浏览器引擎的不同,它们显示页面的内容或者顺序会 ...

  8. 浏览器渲染点滴yan

    打印: 在浏览器地址栏输入URL,按下回车后究竟发生了什么? DOMContentLoaded与load的区别.触发时机 浏览器连接限制 defer async 针对script标签 preload, ...

  9. 前端浏览器渲染原理及优化

    文章目录 一.浏览器组成 1. 对浏览器内核的理解 2. 浏览器的主要组成部分 二.浏览器渲染原理 1.浏览器的渲染过程 步骤一: 步骤二: 步骤三: 步骤四: 步骤五: 2.相关概念 ①重排(更新元 ...

最新文章

  1. 读书笔记 | 墨菲定律(一)
  2. 计算机信息管理技术 互联网,计算机信息管理技术在网络安全中的运用思路
  3. ios开发学习--cocos2d(cocos2d)效果源码分享--系列教程
  4. 最常用git命令汇总(参考列表)
  5. vue打包后放在 nginx部署时候的配置文件
  6. python center函数对齐方式_Python如何对齐字符串
  7. java光标_java怎么设置光标位置 java设置光标位置方法
  8. Java 多线程详解(一)------概念的引入
  9. 阿里云CentOs 6.4 yum报错Couldn't resolve host'xx
  10. Spring源码下载编译全过程!超详细的步骤!!!
  11. C++ 实现matlab高斯滤波函数imgaussfilt
  12. 关于H5调用摄像头麦克风的权限问题
  13. 飞思卡尔磁力计MAG3110 快速上手指南
  14. 小米抢购神器-开放源码
  15. autojs图片加水印
  16. 【基础】struct的函数操作
  17. php自写api文档生成工具
  18. MBA-day32 绝对值的几何意义
  19. 今日金融词汇---为什么股票前面会有个DR
  20. rust休闲玩家_《Rust》坚持强制限定角色性别 玩家怒喷开发商傻蛋

热门文章

  1. 利用Slf4j的MDC跟踪方法调用链
  2. css flex布局下
  3. 安卓应用测试指南 pdf_YPlay月刊2020年10月软件应用合集
  4. Unity一键将Text替换成TextMeshPro
  5. vue 回车查询 按钮_vue之在页面中监听键盘的Enter键来触发某个按钮事件
  6. window.location的使用,能查看当前网址的端口等等
  7. 一本通 1216:红与黑
  8. 隐藏应用计算机器的密码,手机“计算器”隐藏功能,一键把隐私照片加密
  9. 档案馆库房环境温湿度空气质量等相关要求
  10. TCP握手机制、TCP长连接和短连接、TCP 保活机制 、心跳机制