刚开始学习前端的时候,每次写css样式都是用到什么就在样式表后添加什么,完全没有考虑到样式属性的书写顺序对网页加载代码的影响。后来逐渐才知道正确的样式顺序不仅易于查看,并且也属于css样式优化的一种方式。那么是怎么个顺序呢?

(1)定位属性:position 
display  float  left  top  right  bottom 
 overflow  clear   z-index

(2)自身属性:width 
height  padding  border  margin

(3)文字属性:font-family 
 font-size   font-style   font-weight 
 font-varient   color   text-align   vertical-align    word-spacing    white-space   text-overflow

(4)背景:background border

(5)css3中新增属性:content   box-shadow   border-radius 
transform……

按照上述1 2 3 4 5的顺序进行书写。

目的:减少浏览器reflow(回流),提升浏览器渲染dom的性能

原理:浏览器的渲染流程为——

①解析html构建dom树,解析css构建css树:将html解析成树形的数据结构,将css解析成树形的数据结构

②构建render树:DOM树和CSS树合并之后形成的render树。

③布局render树:有了render树,浏览器已经知道那些网页中有哪些节点,各个节点的css定义和以及它们的从属关系,从而计算出每个节点在屏幕中的位置。

④绘制render树:按照计算出来的规则,通过显卡把内容画在屏幕上。

css样式解析到显示至浏览器屏幕上就发生在②③④步骤,可见浏览器并不是一获取到css样式就立马开始解析而是根据css样式的书写顺序将之按照dom树的结构分布render样式,完成第②步,然后开始遍历每个树结点的css样式进行解析,此时的css样式的遍历顺序完全是按照之前的书写顺序。在解析过程中,一旦浏览器发现某个元素的定位变化影响布局,则需要倒回去重新渲染正如按照这样的书写书序:

width: 100px;

height: 100px;

background-color: red ;

position: absolute;

当浏览器解析到position的时候突然发现该元素是绝对定位元素需要脱离文档流,而之前却是按照普通元素进行解析的,所以不得不重新渲染,解除该元素在文档中所占位置,然而由于该元素的占位发生变化,其他元素也可能会受到它回流的影响而重新排位。最终导致③步骤花费的时间太久而影响到④步骤的显示,影响了用户体验。

所以规范的的css书写顺序对于文档渲染来说一定是事半功倍的!

扩展:还有一个会影响浏览器渲染性能的词汇“repaint(重绘)”

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

注意:

a.render树的结构不等同于DOM树的结构,一些设置display:none的节点不会被放在render树中,但会在dom树中。

b.有些情况,比如修改了元素的样式,浏览器并不会立刻reflow或repaint,而是把这些操作积攒一批,然后做一次reflow,这也叫做异步reflow.但在有些情况下,比如改变窗口,改变页面默认的字体等,对于这些情况,浏览器会马上进行reflow.

c.为了更好的用户体验,渲染引擎将会尽可能早的将内容呈现到屏幕上,并不会等到所有的html都解析完成之后再去构建和布局render树。它是解析完一部分内容就显示一部分内容,同时,可能还在通过网络下载其余内容。

最新文章

  1. jQuery学习总结(二)
  2. C#中Const和Readonly的区别
  3. c++ 类与函数中static变量初始化问题(转)
  4. RMQ(dp)
  5. [WinForm]为TextBox设置水印文字
  6. jQuery 之$.proxy() 方法
  7. 使用ExpandableListView时间轴效果达到
  8. Spring IoC介绍与Bean的使用
  9. Eclipse常用快捷键大全
  10. 单元测试框架 unittest 的运行方法if __name__ == '__main__': unittest.main()
  11. css样式加载顺序
  12. 常见web攻击总结
  13. HTML5+CSS3入门学习(一)——HTML5
  14. Lua语法基础(一)
  15. Elasticsearch Query DSL 整理总结(四)—— Multi Match Query
  16. Test Scenarios for result grid
  17. centos下快速安装JDK
  18. hdu-4283 You Are the One 区间dp,
  19. github|webstorm
  20. Java中split的对象被特殊字符(.或|)分隔

热门文章

  1. python面向对象学习(四)继承
  2. Maven(六)Eclipse使用Maven插件创建项目
  3. vmware启动黑屏(本来是好的)
  4. CPU 实用工具
  5. Sublime Text 2 2.0.2 序列号
  6. 图说Oracle基础知识(一)
  7. (其他)sublime text3的emmt插件的简便用法
  8. python3接收、解析邮件
  9. mssql sqlserver 使用sql脚本检测数据表中一列数据是否连续的方法分享
  10. SQL Server 锁实验(INSERT加锁探究)