让前端飞技术干货

浏览器运行机制详解

2018-11-14  本文已影响3人  漓漾li

1. 浏览器是多进程的

GPU进程
Browser进程
第三方插件进程
浏览器渲染进程(浏览器内核)

2. 浏览器渲染进程是多线程的

GUI渲染线程
js引擎线程
事件触发线程
定时触发器线程
异步http请求线程
event loop整体流程

3. repaint、reflow

repaint
reflow
导致reflow的操作
  1. 调整窗口大小
  2. 改变字体
  3. 增加或者移除样式表
  4. 内容变化,比如用户在input框中输入文字
  5. 激活 CSS 伪类,比如 :hover (IE 中为兄弟结点伪类的激活)
  6. 操作 class 属性
  7. 脚本操作 DOM
  8. 计算 offsetWidth 和 offsetHeight 属性
  9. 设置 style 属性的值
它们会大大影响web性能,如何减少reflow、repaint
  1. 不要通过父级来改变子元素样式,最好直接改变子元素样式,改变子元素样式尽可能不要影响父元素和兄弟元素的大小和尺寸
  2. 尽量通过class来设计元素样式,切忌用style
    多次操作单个属性
  3. 实现元素的动画,对于经常要进行回流的组件,要抽离出来,它的position属性应当设为fixed或absolute
  4. 权衡速度的平滑。比如实现一个动画,以1个像素为单位移动这样最平滑,但reflow就会过于频繁,CPU很快就会被完全占用。如果以3个像素为单位移动就会好很多。
  5. 不要用tables布局的另一个原因就是tables中某个元素一旦触发reflow就会导致table里所有的其它元素reflow。在适合用table的场合,可以设置table-layout为auto或fixed,
  6. 这样可以让table一行一行的渲染,这种做法也是为了限制reflow的影响范围。
  7. css里不要有表达式expression
  8. 减少不必要的 DOM 层级(DOM depth)。改变 DOM 树中的一级会导致所有层级的改变,上至根部,下至被改变节点的子节点。这导致大量时间耗费在执行 reflow 上面。
  9. 避免不必要的复杂的 CSS 选择器,尤其是后代选择器(descendant selectors),因为为了匹配选择器将耗费更多的 CPU。
  10. 尽量不要过多的频繁的去增加,修改,删除元素,因为这可能会频繁的导致页面reflow,可以先把该dom节点抽离到内存中进行复杂的操作然后再display到页面上。
  11. 请求如下值offsetTop, offsetLeft, offsetWidth, offsetHeight,scrollTop/Left/Width/Height,clientTop/Left/Width/Height,浏览器会发生reflow,建议将他们合并到一起操作,可以减少回流的次数。
上一篇 下一篇

猜你喜欢

热点阅读