zoukankan      html  css  js  c++  java
  • 如何优化你的JS脚本来减少reflow/repaint?

    如何优化你的脚本来减少reflow/repaint?
    1. 避免在document上直接进行频繁的DOM操作,如果确实需要可以采用off-document的方式进行,具体的方法包括但不完全包括以下几种:

    (1). 先将元素从document中删除,完成修改后再把元素放回原来的位置

    (2). 将元素的display设置为”none”,完成修改后再把display修改为原来的值

    (3). 如果需要创建多个DOM节点,可以使用DocumentFragment创建完后一次性的加入document

    function appendEveryTime(){
    for( var i = 5000;i>0; i--; ){
    var n = document.createElement('div');
    n.innerHTML = 'node ' + i;
    document.body.appendChild(n);/*每次创建的新节点都append到文档*/
    }
    }

    function appendLast(){
    var frag = document.createDocumentFragment();
    for( var i = 5000; i>0; i--; ){
    var n = document.createElement('div');
    n.innerHTML = 'node ' + i;
    frag.appendChild(n);/*每次创建的节点先放入DocumentFragment中*/
    }
    document.body.appendChild(frag);
    }
    用dynaTrace观察的结果如下,appendLast的性能无论是在Javascript的执行时间以及浏览器渲染时间方面都优于appendEveryTime。


    2. 集中修改样式

    (1). 尽可能少的修改元素style上的属性

    (2). 尽量通过修改className来修改样式

    (3). 通过cssText属性来设置样式值

    如下的代码中,每一次赋值都会造成浏览器重新渲染,可以采用cssText或者className的方式

    el.style.color = 'red;
    el.style.height = '100px';
    el.style.fontSize = '12px';
    el.style.backgroundColor = 'white';
    3. 缓存Layout属性值

    对于Layout属性中非引用类型的值(数字型),如果需要多次访问则可以在一次访问时先存储到局部变量中,之后都使用局部变量,这样可以避免每次读取属性时造成浏览器的渲染。

    var width = el.offsetWidth;
    var scrollLeft = el.scrollLeft;

    4. 设置元素的position为absolute或fixed

    在元素的position为static和relative时,元素处于DOM树结构当中,当对元素的某个操作需要重新渲染时,浏览器会渲染整个页面。将元素的position设置为absolute和fixed可以使元素从DOM树结构中脱离出来独立的存在,而浏览器在需要渲染时只需要渲染该元素以及位于该元素下方的元素,从而在某种程度上缩短浏览器渲染时间,这在当今越来越多的Javascript动画方面尤其值得考虑。

  • 相关阅读:
    几个容易混淆的集合类
    ajax操作时用于提高用户体验的两段备用代码
    word-wrap和word-break的区别
    清除MAC OS X上的流氓软件
    Windows Azure IP地址详解
    实现跨云应用——基于DNS的负载均衡
    Windows Azure虚拟机和云服务实例计费方式更新
    证明你是你——快速开启Windows Azure多重身份验证
    Windows 10 L2TP 809错误
    新版Microsoft Azure Web管理控制台
  • 原文地址:https://www.cnblogs.com/stephenykk/p/3323215.html
Copyright © 2011-2022 走看看