浏览器渲染及动画

智数追光
• 阅读 1138

浏览器渲染原理:

  1. 浏览器在渲染页面之前会先构建DOM树和CSSDOM树。
  2. HTML会转换成文档对象模型DOMCSS会转换成CSS对象模型CSSDOM。它们两个是互相独立的数据结构。
  3. DOMCSSDOM组合在一起形成渲染树。

    1. 遍历DOM树节点
    2. 对每个DOM节点用合适的CSSDOM规则去匹配
    3. 计算出最终布局,样式
  4. 最后将它们合并到一起,渲染在页面中

浏览器渲染及动画

样式更新

浏览器将页面渲染好之后,后面是如何动态更新样式的:

  • 通过javascript动态更新
  • 根据选择器匹配对应的DOM,计算出style是布局还是样式,如下图所示:

    1. 如果是更改布局,是会依次触发
    2. 如果布局没有改动,只是更改了颜色之类的,layout将不会触发
    3. 如何既不改布局,也不改样式啥的,layoutpaint都不会触发,只会触发最后的composite部分,比如动画

浏览器渲染及动画

动画

CSS中使用动画,有两种属性可以实现,一种是transitionanimation,它俩的区别从名字中也可以看出来:

  • transition是过渡的意思,它只有开始帧和结束帧,中间的过程浏览器用你指定的属性自动完成,你无法自己控制
  • animation是动画的意思,它包含多个关键帧,通过控制帧,可以做出复杂的动画

参考文章:
Render-tree Construction, Layout, and Paint
Stick to Compositor-Only Properties and Manage Layer Count

点赞
收藏
评论区
推荐文章
凯特林 凯特林
4年前
React - Fiber原理
浏览器渲染屏幕刷新率(FPS)浏览器的正常绘制频率是60次/秒,小于这个值时,用户会感觉到卡顿绘制一次的称为一帧,平均每帧16.6ms帧每个帧的开头包括样式计算、布局和绘制js的执行是单线程,js引擎和页面渲染引擎都占用主线程,GUI渲染和Javascript执行两者是互斥的如果某个js任务执行时间过长,浏览器会推迟渲染,每
Wesley13 Wesley13
3年前
SSR再好,也要有优雅降级策略哟~
1、相关概念CSR:客户端渲染(ClientSideRender)。渲染过程全部交给浏览器进行处理,服务器不参与任何渲染。页面初始加载的HTML文档中无内容,需要下载执行JS文件,由浏览器动态生成页面,并通过JS进行页面交互事件与状态管理。SSR:服务端渲染(ServerSideRende
秃头王路飞 秃头王路飞
3年前
浏览器工作原理
浏览器渲染过程浏览器渲染1.解析HTML文件,构建DOM树,同时浏览器主进程负责下载CSS文件2.CSS文件下载完成,解析CSS文件成树形的数据结构,然后结合DOM树合并成RenderObject树3.布局RenderObject树(Layout/reflow),负责RenderObject树中的元素的尺寸,位置等计算4.绘制RenderObject树(paint),绘制页面的像素信息5.浏览器主进程将默认的图层和复合图层交给GPU进程,GPU进
虾米大王 虾米大王
2年前
java代码099
code099.jspInserttitlehere$pageScope.user.name
虾米大王 虾米大王
2年前
java代码073
code073.javapackagepack02;importjava.io.IOException;importjava.io.PrintWriter;importjava.util.UUID;importjavax.servlet.ServletException;importjavax.servlet.annotation.Multip
Wesley13 Wesley13
3年前
JAVA_将二进制流转换成图片文件
_1. __\代码\_将二进制流转换成图片文件晚风工作室www.soservers.com    _跳至\1\(http://www.oschina.net/code/snippet_931591_1760429253)\全屏预览\(http://www.oschina.net/code/piece_full?code17
Wesley13 Wesley13
3年前
VSCode配置FiraCode和更纱黑体字体
!(https://oscimg.oschina.net/oscnet/c7bb62d935ceb01d3b7fe176322e84ae00d.png)Fira Code下载到FiraCode字体的GitHub(https://www.oschina.net/action/GoToLink?urlhttps%
Wesley13 Wesley13
3年前
oracle的start with connect by prior如何使用
oracle的startwithconnectbyprior是根据条件递归查询"树",分为四种使用情况: 第一种:startwith子节点ID'...'connectbyprior子节点ID父节点IDselectfrommdm_organizationostartwitho.org_code'
Stella981 Stella981
3年前
PowerDesigner列名、注释内容互换
在用PowerDesigner时,常常在NAME或Comment中写中文在Code中写英文,Name只会显示给我们看,Code会使用在代码中,但Comment中的文字会保存到数据库TABLE的Description中,有时候我们写好了Name再写一次Comment很麻烦,以下两段代码就可以解决这个问题。在PowerDesigner中PowerDesig
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
5个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(