減少dom更新以及css計(jì)數(shù)器

一個(gè)前端優(yōu)化的小技巧

我們知道在前端里面涉及到dom部分的操作都比較耗時(shí),因?yàn)楦耫om需要立即對(duì)頁(yè)面對(duì)用戶的顯示進(jìn)行更新。每一個(gè)更改,不管是插入字符還是移除dom節(jié)點(diǎn),瀏覽器都需要重新計(jì)算很多尺寸以進(jìn)行更新。這種更新進(jìn)行的越多,代碼完成所花的時(shí)間就越長(zhǎng);如下面的代碼:

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個(gè)項(xiàng)目。每添加一個(gè)項(xiàng)目都有兩次更新(一個(gè)添加<li>元素,一個(gè)給它添加文本節(jié)點(diǎn))。這樣添加這10個(gè)項(xiàng)目要20次更新。
減少更新次數(shù)可以優(yōu)化這段代碼的性能,首先想到的是將列表從頁(yè)面上移除,再進(jìn)行更新,更新完了再一次性加列表插回原來(lái)的位置,這樣也是一種方法,但還有更好一種方法是使用文檔片段來(lái)構(gòu)建dom結(jié)構(gòu),如下代碼:

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);

這樣就只有一次更新,它發(fā)生在所有項(xiàng)目都創(chuàng)建好之后。

css計(jì)數(shù)器

一般和計(jì)數(shù)相關(guān)的字眼,我們首先想到的是js。css不是只負(fù)責(zé)樣式的嗎?其實(shí)css和偽類像配合也可以擁有簡(jiǎn)單的計(jì)數(shù)功能。但是它的計(jì)數(shù)功能只能跟content屬性在一起的時(shí)候才有作用。而content屬性貌似專門(mén)用在before/after偽元素上的和計(jì)數(shù)器相關(guān)的屬性主要就是1. counter-reset 2. counter-incremen 3. counter()/counters()這三個(gè)屬性

  1. counter-reset
    顧名思意,就是“計(jì)數(shù)器-重置”的意思。
.box{ counter-reset: count; } /* 計(jì)數(shù)器名稱是'count' */
.box{ counter-reset: count 2; } /* 計(jì)數(shù)器名稱是'count', 并且默認(rèn)起始值是2 */
  1. counter-incremen
    顧名思意,就是“計(jì)數(shù)器-遞增”的意思。值為counter-reset的1個(gè)或多個(gè)關(guān)鍵字。后面可以跟隨數(shù)字,表示每次計(jì)數(shù)的變化值。如果缺省,則使用默認(rèn)變化值1
  1. counter()/counters()
    這個(gè)不能說(shuō)是屬性了,嚴(yán)格來(lái)說(shuō)應(yīng)該是一個(gè)方法。類似CSS3中才calc()計(jì)算。這里作用很單純顯示計(jì)數(shù)。下面看一個(gè)實(shí)際運(yùn)用例子。html結(jié)構(gòu)如下:
<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;                /* 為每個(gè)ol元素創(chuàng)建新的計(jì)數(shù)器實(shí)例 */  
  list-style-type: none;  
}  
li:before {  
  counter-increment: addnum;            /* 只增加計(jì)數(shù)器的計(jì)數(shù)器名字叫addnum的實(shí)例  */  
  content: counters(addnum, ".") " ";   /* 為所有計(jì)數(shù)器實(shí)例增加以“.”分隔的值 */  
}  
圖1

效果如上圖所示。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,724評(píng)論 19 139
  • 開(kāi)電腦,例行登錄一下QQ。呂呂的簽名還是那個(gè)“一開(kāi)始,我就不讓它結(jié)束了”。 那是他寫(xiě)給歐陽(yáng)妹妹的。他很早很早就用這...
    star_2572閱讀 241評(píng)論 0 0
  • 女人,若能自己扛下生活所有,還需要男人做什么?若男人不懂呵護(hù)女人,給她安全感,給她疼愛(ài),那這個(gè)男人還能給予什么?愛(ài)...
    簡(jiǎn)L素閱讀 218評(píng)論 0 0
  • 最暖的事莫過(guò)于,你送我回家,分別后,我回頭,你也剛好回頭。
    螢火星星閱讀 209評(píng)論 0 0

友情鏈接更多精彩內(nèi)容