css渲染原理

css渲染原理

  • 浏览器渲染原理
    • 浏览器接收到服务器返回的html页面。
    • 浏览器开始构建DOM树(DOM TREE),遇到css样式会构建CSS规则树(css RULE TREE)。
    • 遇到javascript会通过DOM API和CSSDOM API来操作DOM Tree和CSS Rule Tree。
    • 解析完成后,浏览器会通过DOM Tree和CSS Rule Tree来构造Rendering Tree(渲染树)。
    • 最后,渲染树构建完成后就是“布局”处理,也就是确定每个节点在屏幕上的确切显示位置。
    • 渲染之后,开始“绘制”,遍历渲染树,并用UI后断层,将每一个节点绘制出来。
  • css渲染规则
    • css的渲染规则,是从上到下,从右到左渲染的。
.main h4 a {font-size: 14px}
  • 渲染过程是这样的:首先先找到所有的a,沿着a的父元素查找h4,然后再沿着h4,查找.main。中途找到了符合匹配规则的节点就加入结果集。如果找到根元素的html都没有匹配,则这条路径不再遍历。下一个a开始重复这个查找匹配,直到没有a继续查找。
    -浏览器的这种查找规则就是为了尽早过滤掉一些无关的样式规则和元素。
  • 页面渲染与执行过程
    • 通过一个例子,我们来详细看看页面渲染和执行过程到底是怎么工作的:
<html>
  <body>
    <link href="example.css" rel="stylesheet">
    <div>Hi here</div>
    <script>
      document.write('<script src="other.js"><scr' + 'ipt>')
    </script>
    <div>Hi again</div>
    <script src="last.js"></script>
  </body>
</html>
  1. 解析器遇到了example.css,并将它从网络中下载下来。下载样式表的过程是耗时的,但是解析器并没有被阻塞,继续往下解析
  2. 解析器遇到<script>标签,但是由于样式文件下载未完成,阻塞了该脚本的执行(上面已指出)。解析器(构建DOM树和 CSS规则树)被阻塞住,不能继续往下解析
  3. 因为渲染树是DOM树 和 CSS规则树 来构造,所以此时,渲染树的构建也被阻塞
  4. 渲染树是绘制触发条件之一,因此Hi there!也就 不能被绘制(painting->display)到页面中。
  • 绘制的触发条是: 渲染树构建完成,并遇到了阻塞
  1. 接下来,一旦example.css下载完成,内联的脚本执行完了之后,解析器开始执行遇到的<script>标签,并查到src属性中的other.js文件,立即被阻塞,开始下载other.js;
  2. 因为解析器被阻塞,触发了绘制条件,浏览器就会收到绘制的请求,“Hi,here”就会显示在页面上
  3. other.js加载完成了之后,解析器继续向下解析,遇到 last.js 之后又被阻塞,
  4. 因为解析器再次被阻塞,又形成了 “绘制” 条件,因此绘制DOM树的内容,即,“Hi,again”就会显示在页面上。
  5. last.js加载完成,并且被执行。
  • css优化
    • 把 Stylesheets 放在 HTML 页面头部

      • 浏览器在所有的 stylesheets 加载完成之后,才会开始渲染整个页面,在此之前,浏览器不会渲染页面里的任何内容,页面会一直呈现空白。这也是为什么要把 stylesheet 放在头部的原因。如果放在 HTML 页面底部,页面渲染就不仅仅是在等待 stylesheet 的加载,还要等待 html 内容加载完成,这样一来,用户看到页面的时间会更晚。
      • 对于 @import 和 <link> 两种加载外部 CSS 文件的方式:@import 就相当于是把 <link> 标签放在页面的底部,所以从优化性能的角度看,应该尽量避免使用 @import 命令
    • 嵌套层级不要超过三级

      • 一般情况下,嵌套层级不要超过三级,过渡的嵌套会导致代码变得臃肿,导致css文件体积变大,造成性能上的浪费,影响渲染的速度;css层级太多,也过于依赖html DOM结构,不易于维护。如果层级比较深,就直接定义一个class代替多余的层级。
    • css 命名规范,书写规范。

    • 多用继承属性

      • 尽量的继承父类样式 ,重复的定义会造成很多不必要的性能浪费。
    • 少用滤镜,好用hack,少用position: absolute;

    • 使用简写样式。见下例

        .mg {
          margin-top: 20px;
          margin-right: 0px;
          margin-bottom: 20px;
          margin-left: 100px;
        }
    

可以简写为

    .mg {
      margin: 20px 0px 20px 100px;
    }
    7. 不要再id选择器和class选择器前使用标签名 例如:
    div #box {
      color: white;
    }
    • id选择器本身就能唯一确定一个元素,没必要再在前面加上标签名。同样,类选择器也是,如果需要给某个标签的类增添额外的样式,建议使用另一个类名。这种情况下,也可以使用 div .box{} 形式,差别不大。

    • 平铺的背景图片不要过小,1px的图片平铺长宽25px的区域块,需要2500次,太影响渲染速度。

    • 谨慎使用float,具体细节请参考我的另一片文章 《深入理解f浮动与清除浮动》

    • 合理化布局(模块化布局)

      • 可以把样式划分为”基类“ 和 “扩展类”; 把模块基本相同的样式写在基类里,不同的再重新用class定义,写在扩展类中。
    • 尽量少用通配符,只用通配符设定一切基础的样式,如:

    * {margin:0; padding:0;}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,100评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,862评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,993评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,309评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,303评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,421评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,830评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,501评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,689评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,506评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,564评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,286评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,826评论 3 305
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,875评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,114评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,705评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,269评论 2 341

推荐阅读更多精彩内容

  • 对于绝大部分的开发者来说,css的功能就是完成页面布局,制定页面的展示效果。其实css也有许多能实现Web性能优化...
    果汁凉茶丶阅读 6,337评论 0 8
  • 前端必读:浏览器内部工作原理[https://kb.cnblogs.com/page/129756/] 作者: T...
    我是强强阅读 1,130评论 0 2
  • 目录一、介绍二、渲染引擎三、解析与DOM树构建四、渲染树构建五、布局六、绘制七、动态变化八、渲染引擎的线程九、CS...
    饥人谷_米弥轮阅读 2,452评论 0 10
  • 1. 介绍 浏览器可能是最广泛使用的软件。本书将介绍浏览器的工作原理。我们将看到,当你在地址栏中输入google....
    康斌阅读 2,006评论 7 18
  • 昨晚回到家中已是凌晨四点,在出差的旅程中度过了自己31岁的生日。早上起来匆匆忙忙整理完行李,又开始一次新的出...
    竹聆风阅读 347评论 2 1