You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
减少 CSS 嵌套层级和选择适当的选择器;
CSS选择器对性能的影响源于浏览器匹配选择器和文档元素时所消耗的时间。它是从右到左进行规则匹配的。
如.nav > p {font-size:12px},浏览器必须遍历页面中所有的 a 元素并且确定其父元素的 class 是否为 nav 。我们把最右边选择符(这里是p)称之为关键选择器。
Google 资深web开发工程师 Steve Souders 对 CSS 选择器的执行效率从高到低做了一个排序:
一. 浏览器如何渲染页面
浏览器请求、加载、渲染一个页面,会经历:
1.1 浏览器解析
解析结果:
解析结果:B: 1 的意思是规则节点指向的具体规则。
1.2 浏览器渲染
1.3 简要概括整个过程:
1.4 重绘(repaint)和回流(reflow)
当用户浏览网页时进行交互或JS脚本改变页面结构时,页面会进行重新渲染: 重绘或回流。
重绘
元素的几何尺寸没有变,只是屏幕的一部分要重画。
如改变元素的颜色,背景色等。
回流
元素的几何尺寸改变时会影响到其他元素的位置或结构时页面需要重新验证并计算Render Tree。
以下可能会产生 Reflow:
如图片载入是一个可以避免的reflow—— 构建DOM tree的时候遇到img标签会直接读取后面的内容而不是等待图片加载完再进行,这样会导致图片加载完了会进行回流,之前浏览器所做的都是无用功。解决办法是设置宽度和高度这样浏览器就知道了图片的占位面积,在载入图片前就预留好了位置。
性能比较
HTML 使用的是 flow based layout ,也就是流式布局,所以,如果某元件的几何尺寸发生了变化,需要重新布局,也就叫 Reflow. Reflow 的成本比 Repaint 的成本高得多的多。一个结点的 Reflow 很有可能导致子结点,甚至父点以及同级结点的 Reflow 。
浏览器不会你每改一次样式,它就 Reflow 或 Repaint 一次。一般来说,浏览器会把这样的操作积攒一批,然后做一次 Reflow ,这又叫异步 reflow 或增量异步 Reflow 。但是有些情况浏览器是不会这么做的,比如:Resize 窗口,改变了页面默认的字体,等。对于这些操作,浏览器会马上进行 Reflow 。
但是有些时候,我们的脚本会阻止浏览器这么干,比如:如果我们请求下面的一些DOM值:
因为,如果我们的程序需要这些值,那么浏览器需要返回最新的值,而这样一样会flush出去一些样式的改变,从而造成频繁的reflow/repaint。
二. 优化渲染速度
<meta charset="utf-8">
;CSS选择器对性能的影响源于浏览器匹配选择器和文档元素时所消耗的时间。它是从右到左进行规则匹配的。
如
.nav > p {font-size:12px}
,浏览器必须遍历页面中所有的 a 元素并且确定其父元素的 class 是否为 nav 。我们把最右边选择符(这里是p)称之为关键选择器。Google 资深web开发工程师 Steve Souders 对 CSS 选择器的执行效率从高到低做了一个排序:
*
div#nav
,.nav#nav
div.nav
三. 相关名字详解
3.1 CSSOM
CSS Object Model,css对象模型。它将样式表中的规则映射到页面对应的元素上。CSSOM识别tokens并把这些tokens转换成一个树结构上的对应的结点。所有结点以及它们所关联的页面中的样式就是所谓的CSS Object Model。
有啥作用呢?
所有的css都是组织渲染的,因为css没处理好之前如果显示页面的话元素样式会一直在变化中,所以页面会等待所有css检查完再展示页面。CSSOM被用作创建render tree,如果不能高效的利用CSS会导致页面在加载时白屏。
即使css文件被缓存了,但是只会节省加载css的时间,CSSOM却会重新构建,所以让页面加载速度变快的方法是写出好的css。
javascript的加载很可能会阻塞CSSOM的构建(js可以改变css),在 CSSOM构建好之前页面上什么都不会展示出来(白屏)。
参考文章
The text was updated successfully, but these errors were encountered: