dc平台部技术分享

减少dom更新以及css计数器

2017-12-11  本文已影响35人  yangkai_
一个前端优化的小技巧

我们知道在前端里面涉及到dom部分的操作都比较耗时,因为更新dom需要立即对页面对用户的显示进行更新。每一个更改,不管是插入字符还是移除dom节点,浏览器都需要重新计算很多尺寸以进行更新。这种更新进行的越多,代码完成所花的时间就越长;如下面的代码:

var list = document.getElementById("list"),
           item,
           i;
for (i=0; i< 10; i++) {
    item = document.createElement("li");
    list.appendChild(item);
    item.appendChild(document.createTextNode("item"+i));
}

上述代码为列表添加了10个项目。每添加一个项目都有两次更新(一个添加<li>元素,一个给它添加文本节点)。这样添加这10个项目要20次更新。
减少更新次数可以优化这段代码的性能,首先想到的是将列表从页面上移除,再进行更新,更新完了再一次性加列表插回原来的位置,这样也是一种方法,但还有更好一种方法是使用文档片段来构建dom结构,如下代码:

var list = document.getElementById("list"),
       item,
       fragment = document.createDocumentFragment(),
       i;
for (i=0; i< 10; i++) {
    item = document.createElement("li");
    item.appendChild(document.createTextNode("item"+i));
    fragment .appendChild(item);
}
list.appendChild(fragment);

这样就只有一次更新,它发生在所有项目都创建好之后。

css计数器

一般和计数相关的字眼,我们首先想到的是js。css不是只负责样式的吗?其实css和伪类像配合也可以拥有简单的计数功能。但是它的计数功能只能跟content属性在一起的时候才有作用。而content属性貌似专门用在before/after伪元素上的和计数器相关的属性主要就是1. counter-reset 2. counter-incremen 3. counter()/counters()这三个属性

  1. counter-reset
    顾名思意,就是“计数器-重置”的意思。
.box{ counter-reset: count; } /* 计数器名称是'count' */
.box{ counter-reset: count 2; } /* 计数器名称是'count', 并且默认起始值是2 */
  1. counter-incremen
    顾名思意,就是“计数器-递增”的意思。值为counter-reset的1个或多个关键字。后面可以跟随数字,表示每次计数的变化值。如果缺省,则使用默认变化值1
  1. counter()/counters()
    这个不能说是属性了,严格来说应该是一个方法。类似CSS3中才calc()计算。这里作用很单纯显示计数。下面看一个实际运用例子。html结构如下:
<ol>  
  <li>item</li>        
  <li>item              
    <ol>  
      <li>item</li>     
      <li>item</li>       
      <li>item          
        <ol>  
          <li>item</li>  
          <li>item</li>  
        </ol>  
     </li>  
      <li>item</li>  
    </ol>  
  </li>  
</ol>

css代码如下

ol {  
  counter-reset: addnum;                /* 为每个ol元素创建新的计数器实例 */  
  list-style-type: none;  
}  
li:before {  
  counter-increment: addnum;            /* 只增加计数器的计数器名字叫addnum的实例  */  
  content: counters(addnum, ".") " ";   /* 为所有计数器实例增加以“.”分隔的值 */  
}  
图1

效果如上图所示。

上一篇下一篇

猜你喜欢

热点阅读