浏览器加载、解析、渲染初探

一:加载

  引起浏览器阻塞的两种情况:

  1:外部js的引入会引起浏览器的加载阻塞,因为js有可能会操作dom树,例如document.write;

  2: css表的引入也有可能会引起浏览器的阻塞。不影响js的加载,却影响js的执行,因为js的执行有可能会获取到dom节点的样式;从而也可能引起阻塞;

  优化:

  1:引用的js文件放在body的最后。注意:这只能提高dom树的加载速度,dom树的渲染其实还是要等到js执行完成才能渲染;

  2:js函数长时间执行,建议使用settimeout;因为js执行完成指的是主线程的代码,settimeout的代码并不会引起资源阻塞;loop event之一;

  3:将多个js资源打包合成为一个;

  4:引用的js资源加上defer="defer" async="async";告诉浏览器将推迟对脚本的解释。defer="defer"For IE;async="async"For HTML5;

二:解析

  1:解析三个东西,分别是HTML/SVG/XHTML,CSS和Javascript; HTML会生成DOM树,CSS会生成样式规则树,而js则间接操作这两树;

  2:根据Dom Tree和CSS rule Tree 生成 Rendering Tree;

  3: 调用操作系统Native GUI的API绘制。

三:渲染

  1:计算CSS样式

  2:构建Render Tree

  3:Layout-定位坐标和大小

  4:正式开画

  5:提高渲染性能的几个关键点

    1:不要js直接修改样式,使用className;使多次操作dom变成一次性操作;

    2:不要把DOM结点的属性值放在一个循环里当成循环里的变量;否则会造成多次Reflow;

    3:尽可能的修改层级比较低的DOM;

    4:为动画的HTML元件使用fixed或absoult的position;因为这两个属性只是在自身元素Reflow;

    5:千万不要使用table布局,牵一发动全身

  另外,需要区分Repaint和Reflow。

  Repaint:元素的大小没有变化,例如背景颜色;

  Reflow:元素的大小发生改变,可能会导致兄弟节点、父节点都要重画;

参考:http://coolshell.cn/articles/9666.html

   http://www.ruanyifeng.com/blog/2013/10/event_loop.html

   http://www.jianshu.com/p/e141d1543143

原文地址:https://www.cnblogs.com/oufeng/p/6536852.html