浏览器渲染优化4(styles and layout)
你已经学会了查找和解决问题。希望你的js能正常运行了,但这只是制作帧的一小部分。在这节课里,你将处理样式,也就是像开发工具里标记的那样,重新计算样式。学完这节课后,你将学会从样式计算过程中找到性能问题并学会解决这些问题。请记住,对于我们将要介绍的问题,经常可能是由js触发的,但并不一定是js的问题,在前面我们学习过,样式计算过程将根据DOM确定每个元素的外观属性应该是什么,浏览器获得和DOM很像的渲染树,但只包括需要绘制的元素。

除了考虑元素数量之外,还需要考虑选择器匹配,选择器匹配是只确定某些样式是否应该应用到任何指定DOM元素的过程。

可能会选择这个div包含这样的类或者是这样的更复杂选择器,.b-s:nth-child(3),复杂是因为为了知道样式是否适用它需要弄清楚这个是否是第三个子项。数量少的时候没有问题,但是一旦数量大了,就会有影响。一种非常好的方法是BEM即块(block),元素(element),修饰符(modifier),这是一种编写css的方式,它会对样式元素使用单个类名称,不仅会提供更加模块化,课重复使用,课阅读的样式,并且对性能更优优势。因为对现代浏览器来说,通常类批判是最快的匹配选择器。对于我们刚刚提到的示例,你可以使用这样的类,是一个box即block没有任何元素,而修饰符是three(
.box--three)表示是第三个方框

刚刚解释了复杂的css选择器会如何给浏览器增加工作量,选择器越复杂浏览器就更需要多次在DOM树上上下下移动,次数越多,找到正确元素花费时间就越长,

看http://jsbin.com/gozula/1/quiet这个来找
https://dl.dropboxusercontent.com/u/2272348/codez/udacity/box-recalc-style-slow.html打开这个网址,打开时间轴,按下红色的录制按钮,然后点击“clilke me”按钮,在时间轴重找到Recalculate Style部分,发现self time时间太长,根本达不到60帧/秒,这种情况下,可以采取三种措施,可以减少受影响元素的数量,可以降低选择器的复杂性活或者同时实现二者。
减少受影响元素的数量,意味着减少在渲染树中修改更少的节点,降低选择器复杂度意味着使用更少的标记和类名称来选择选择,但为何不二者都采用呢?这样就双赢了,

https://dl.dropboxusercontent.com/u/2272348/codez/udacity/box-recalc-style-slow.html


性能的提升很明显。
http://output.jsbin.com/aqavin/2/quiet这个网址拖动一下滑条,这一过程需要很长时间,要找出原因,我们需要重新查看下管道,尤其是各个任务的顺序,

顺序很清晰,先执行js,然后执行样式计算,然后执行布局流程,保持这一顺序非常重要,

这段代码问题是使用offsetwidth获取每个元素的宽度,浏览器必须先计算该宽度,这就需要布局,我们来看看这对管道造成的影响,代码将管道布局移到了这里,使布局跑到了样式计算的前方,这并不是问题,除非你更改了样式,而当我们设置段落的宽度时,就更改了样式。


现在陆篮球就要重新完成一遍,这一错误的代价很高。如果你触发了强制同步布局,开发者工具会在这里用感叹号标出来,在帧图表视图中,你会在布局记录的右上角看到红色的三角形。
就会出现强制同步布局,当我们访问某些属性时,就会导致布局流程问题。
(我们称之为布局抖动,也就是快速多次进行强制同步布局)在重新计算样式和布局之间切换,所以这段代码时强制同步布局。第二段代码同样访问offsetHeight导致浏览器运行布局,然后,这里出现了样式更改。这个选项肯定对性能有负面影响。

,然后读取布局属性,这个答案似乎是合理的,因为你先更改了样式,然后读取布局属性,问题在与这个loops,更改样式后,需要运行布局,如果就发生一次,没什么关系。如果在帧结束前,你需要重新计算样式,并再次运行布局则导致浏览器重新执行大量工作,最终导致同步布局。

在js阶段先读取布局属性,意味着你将使用上一帧的布局,然后进行所有样式更改的话,在这个管道中,剩余部分看起来正常,这里关键是批量,所有样式更改将在js之后批量发生,这意味着重新计算样式将在帧结束时发上,并处在管道的正确位置。
然后批量处理所有的样式更改,这个一个非常简单的修正方法,但是可以大大提高性能。
浏览器渲染优化4(styles and layout)的更多相关文章
- web性能优化-浏览器渲染原理
在web性能优化-浏览器工作原理中讲到,浏览器渲染是在renderer process中完成的. 那我们来看下renderer process究竟干了什么? Renderer Process包含的线程 ...
- 从浏览器渲染层面解析css3动效优化原理
引言 在h5开发中,我们经常会需要实现一些动效来让页面视觉效果更好,谈及动效便不可避免地会想到动效性能优化这个话题: 减少页面DOM操作,可以使用CSS实现的动效不多出一行js代码 使用绝对定位脱离让 ...
- 浏览器加载和渲染HTML的过程(标准定义的过程以及现代浏览器的优化)
先看一下标准定义的浏览器渲染过程(网上找的): 浏览器打开网页的过程 用户第一次访问网址,浏览器向服务器发出请求,服务器返回html文件: 浏览器开始载入html代码,发现 head 标签内有一个 l ...
- 网页性能优化:防止JavaScript、CSS阻塞浏览器渲染页面
网页中引用的外部文件: JavaScritp.CSS 等常常会阻塞浏览器渲染页面.假设在 <head> 中引用的某个 JavaScript 文件由于各种不给力需要2秒来加载,那么浏览器渲染 ...
- [转]浏览器渲染机制——一定要放在body底部的js引用
转自:http://blog.csdn.net/u012251421/article/details/50536265 说明: 本文提到的浏览器均是指Chrome. “script标签“指的都是普通的 ...
- 浏览器渲染详细过程:重绘、重排和 composite 只是冰山一角
https://juejin.im/entry/590801780ce46300617c89b8 渲染 这张很经典的图许多人都看过,其中的概念大家应该都很熟悉,也就是这么几个步骤:js修改dom结构或 ...
- 【前端性能】高性能滚动 scroll 及页面渲染优化
最近在研究页面渲染及web动画的性能问题,以及拜读<CSS SECRET>(CSS揭秘)这本大作. 本文主要想谈谈页面优化之滚动优化. 主要内容包括了为何需要优化滚动事件,滚动与页面渲染的 ...
- 【Web动画】CSS3 3D 行星运转 && 浏览器渲染原理
承接上一篇:[CSS3进阶]酷炫的3D旋转透视 . 最近入坑 Web 动画,所以把自己的学习过程记录一下分享给大家. CSS3 3D 行星运转 demo 页面请戳:Demo.(建议使用Chrome打开 ...
- 【前端优化之渲染优化】大屏android手机动画丢帧的背后
前言 上周我与阿里的宇果有一次技术的交流,然后对天猫H5站点做了一些浅层次的分析,后面点时间基本天天都会有联系,中途聊了一些技术细节.聊了双方团队在干什么,最后聊到了前端优化.因为我本身参与了几次携程 ...
随机推荐
- vue cli3 + cube-ui 配置rem踩坑记录
在install cube-ui时,选择了后编译,选中使用rem的时候会发现,怎么刷新页面的html字体被设置成了37.5px 感觉太大了,于是去寻找修改的办法,第一反应是webpack的配置,于是去 ...
- BZOJ 4004: [JLOI2015]装备购买 高斯消元解线性基
BZOJ严重卡精,要加 $long$ $double$ 才能过. 题意:求权和最小的极大线性无关组. 之前那个方法解的线性基都是基于二进制拆位的,这次不行,现在要求一个适用范围更广的方法. 考虑贪心 ...
- Python 运算符优先级
这个表给出Python的运算符优先级(从低到高). 从最低的优先级(最松散地结合)到最高的优先级(最紧密地结合). 这意味着在一个表达式中,Python会首先计算表中较下面的运算符,然后在计算列在表上 ...
- Binary Stirling Numbers
http://poj.org/problem?id=1430 题目: 求 第二类 斯特林数 的 奇偶性 即 求 s2 ( n , m ) % 2 : 题解: https://blog.csdn.ne ...
- Java进阶知识03 Hibernate的基础配置详解
1.Hibernate的原理/流程步骤 1.通过Configuration().configure(); 读取并解析hibernate.cfg.xml配置文件,并创建一个configuration对象 ...
- 洛谷 P1341 无序字母对(欧拉路)
P1341 无序字母对 题目提供者yeszy 标签 福建省历届夏令营 难度 提高+/省选- 最新讨论 题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造 ...
- Python 简易Cmd控制
Cmd控制 昨天看到了别的组的部署方案,使用python来控制的,我们是用shell 今天尝试了一下 code import os import sys from cmd import Cmd cla ...
- Linux 打印可变参数日志
实现了传输进去的字符串所在的文档,函数和行数显示功能. 实现了将传入的可变参数打印到日志功能. #include<stdio.h> #include<stdarg.h> #in ...
- JavaWeb_(Hibernate框架)使用Hibernate开发用户注册功能
使用Hibernate开发用户注册功能: 用户在register.jsp表单成功后,页面跳转到login.html,数据库中会存放用户注册的信息 <%@ page language=" ...
- cocos2dx热更新之后,闪退问题记录。
如果使用cocos2dx的3.17.2版本的官方热更新. 然后有玩家反馈说热更新之后游戏闪退,游戏内有部分资源没更到. 考虑如下几个方面调整. 1,在文件下载失败的时候,直接调用重新下载. 2,把下载 ...