最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript頁面回流與重繪

 更新時間:2022年01月19日 08:24:32   作者:程序員云錦??  
這篇文章主要介紹了JavaScript頁面回流與重繪,一個html頁面是一個整體,當這個整體中的某一個部分發(fā)生改變,那么這個頁面整體會重新進行渲染,而如果我們采用添加標簽的方式,每次添加一個標簽,就會讓每一次頁面都重新渲染,性能急劇下降,下面來看看具體內容吧

1.DOMAPI

1.1獲取元素相關結點API

<body>
?? ?<div class="item">
?? ??? ?<h3 class="title">123</h3>
?? ??? ?<p class="des">456</p>
?? ??? ?<p class="price">789</p>
?? ?</div>
?? ?<script>
?? ??? ?var oItem = document.querySelector(".item");
?? ??? ?var oTitle = oItem.querySelector("h3");
?? ??? ?var itemChild = oItem.children;//獲取當前對象的所有子元素,并且以集合的形式返回
?? ??? ?console.log(itemChild);
?? ??? ?console.log(oItem.childNodes);//獲取元素內的節(jié)點列表,注意,換行符也會被當做是一個文本節(jié)點
?? ??? ?console.log(oItem.firstChild);//獲取元素第一個子(節(jié)點:標簽和文本)
?? ??? ?console.log(oItem.firstElementChild);//獲取元素第一個子元素(只指代標簽 ?不包括文本節(jié)點)
?? ??? ?console.log(oItem.lastChild);//獲取元素最后一個子(節(jié)點:標簽和文本)
?? ??? ?console.log(oItem.lastElementChild);//獲取元素最后一個子元素(只指代標簽 ?不包括文本節(jié)點)

?? ??? ?//Node節(jié)點 ?Element元素
?? ??? ?console.log(oTitle.parentElement);//獲取元素父元素
?? ??? ?console.log(oTitle.parentNode);//也是獲取父元素
?? ??? ?console.log(oTitle.nextElementSibling);//下一個兄弟元素
?? ??? ?console.log(oTitle.nextSibling);//下一個兄弟節(jié)點(包含文本節(jié)點)
?? ??? ?console.log(oTitle.previousElementSibling);//上一個兄弟元素
?? ??? ?console.log(oTitle.previousSibling);//上一個兄弟節(jié)點(包含文本節(jié)點)

?? ?</script>
</body>

1.2增加節(jié)點API

<script>
?? ?var oWrap = document.createElement("div");
?? ?//參數(shù)是tagName,也就是標簽名稱
?? ?oWrap.className = "wrap";//添加類名
?? ?oWrap.innerText = "文本";//添加一些文本
?? ?oWrap.style.fontSize = "30px";//設置字體大小
?? ?oWrap.style.color = "red";//設置顏色
?? ?//向body里添加標簽
?? ?document.body.appendChild(oWrap);
?? ?//向添加的div標簽里再添加一個p標簽
?? ?var oP = document.createElement("p");
?? ?oP.innerText = "我是p標簽";
?? ?oWrap.appendChild(oP);
?? ?//用innerHTML來添加節(jié)點
?? ?var elementStr = '<div class="erao"><p style="color: red; font-size: 30px;">我是p是wrap的子元素</p></div>';
?? ?document.body.innerHTML = elementStr;
?? ?
</script>

2.回流與重繪

2.1CSS的書寫順序影響

示例:

?span {
? ? ? width: 200px;
? ? ? height: 200px;
? ? ? margin: 10px;
? ? ? border: 2px solid red;
? ? ? background-color: #368;
? ? }

如上的css代碼,在HTML頁面中span標簽不會被渲染出來,這是因為span標簽是行級元素,不能設定widthheight值,如果我們在最下面寫一行position: absolute;,這就會導致瀏覽器切換計算模式。

瀏覽器在讀css代碼時是從上而下一行一行代碼讀的,在沒有讀到這行代碼時瀏覽器先是用的行級元素的計算模式來閱讀這段css代碼,當讀到position: absolute;這行代碼時

瀏覽器隱式的將span的display展示模式更改為block,自然也將計算模式切換成塊級元素的計算模式,然后再從頭讀這段css代碼,渲染。

2.2節(jié)點渲染優(yōu)化

一個html頁面是一個整體,當這個整體中的某一個部分發(fā)生改變,那么這個頁面整體會重新進行渲染,而如果我們采用添加標簽的方式,每次添加一個標簽,就會讓每一次頁面都重新渲染,性能急劇下降

解決方法是:使用Fragment臨時容器

示例:

drawDom(3000, 'div');
? ? function drawDom(num, tagName) {
? ? ? var vDom;
? ? ? for (var i = 0; i < num; i++) {
? ? ? ? vDom = document.createElement(tagName);
? ? ? ? document.body.appendChild(vDom); //重復N次 每次渲染一個標簽
? ? ? }
? ? }

如上述代碼,當我們一個一個渲染3000個標簽的時候,在本地的頁面打開都需要一秒多,如果是線上的,那性能更加差

所以我們要使用Fragement臨時容器,如果說頁面渲染相當于貨架上的商品,那么appendChild方法就相當于每一次從工廠生產商品立刻送到商店擺上貨架,每一次都需要重新編排商品。

而使用Fragement時,就相當于在工廠和貨架之間放置了一個大箱子,工廠生產出賴商品后先將商品放置在Fragment里,當需要的商品數(shù)量生產完后,再將Fragement這個大箱子直接提到商店,將里面的商品一次性擺上貨架,這時就只需要編排一次商品,大大的提升了渲染性能。

修改后的代碼:

drawDom(3000, 'div');
? ? function drawDom(num, tagName) {
? ? ? var vDom;
? ? ? var fragment = document.createDocumentFragment();//文檔片段
? ? ? for (var i = 0; i < num; i++) {
? ? ? ? vDom = document.createElement(tagName); //
? ? ? ? fragment.appendChild(vDom); //放到臨時容器fragment里
? ? ? }
? ? ? document.body.appendChild(fragment); ?//一次渲染渲染N個
? ? }

這里要注意innerHTML也會有同樣的問題,解決的方式就是不要用innerHTML來每一次改變,而是以一個字符串來進行改變,等所有的改變結束后再直接賦值給innerHTML,也是能大大提升性能的

示例:

?drawHtml(3000, 'div');
?function drawHtml(num, tagName) {
? ? ? var eleStr = '';
? ? ? for (var i = 0; i < num; i++) {
? ? ? ? eleStr += '<' + tagName + '></' + tagName + '>';
? ? ? }
? ? ? document.body.innerHTML = eleStr;
}

到此這篇關于JavaScript頁面回流與重繪的文章就介紹到這了,更多相關JavaScript頁面回流與重繪內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Typescript定義多個接口類型聲明的方式小結

    Typescript定義多個接口類型聲明的方式小結

    這篇文章主要介紹了Typescript定義多個接口類型聲明的方式小結,在 TypeScript 中,您可以使用交叉類型(&)或聯(lián)合類型(|)來組合多個接口,從而實現(xiàn)多個接口類型的混合,文中通過代碼講解的非常詳細,需要的朋友可以參考下
    2025-01-01
  • 淺談JS對html標簽的屬性的干預以及對CSS樣式表屬性的干預

    淺談JS對html標簽的屬性的干預以及對CSS樣式表屬性的干預

    下面小編就為大家?guī)硪黄獪\談JS對html標簽的屬性的干預以及對CSS樣式表屬性的干預。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • 解決瀏覽器會自動填充密碼的問題

    解決瀏覽器會自動填充密碼的問題

    本篇文章主要介紹了解決瀏覽器會自動填充密碼問題的方法。具有很好的參考價值。下面跟著小編一起來看下吧
    2017-04-04
  • 微信小程序如何實現(xiàn)點擊圖片放大功能

    微信小程序如何實現(xiàn)點擊圖片放大功能

    這篇文章主要介紹了微信小程序如何實現(xiàn)點擊圖片放大功能,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-01-01
  • JS獲取文本框,下拉框,單選框的值的簡單實例

    JS獲取文本框,下拉框,單選框的值的簡單實例

    本篇文章主要是對JS獲取文本框,下拉框,單選框值的簡單實例進行了介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2014-02-02
  • 微信小程序開發(fā)實現(xiàn)輪播圖

    微信小程序開發(fā)實現(xiàn)輪播圖

    這篇文章主要為大家詳細介紹了微信小程序開發(fā)實現(xiàn)輪播圖,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • JavaScript實現(xiàn)短信倒計時60s

    JavaScript實現(xiàn)短信倒計時60s

    本文給大家分享一段實例代碼給大家詳細介紹了JavaScript實現(xiàn)短信倒計時60s功能,非常不錯,具有參考借鑒價值,需要的朋友參考下吧
    2017-10-10
  • javascript中的Base64、UTF8編碼與解碼詳解

    javascript中的Base64、UTF8編碼與解碼詳解

    本文給大家介紹的是javascript中的Base64、UTF8編碼與解碼的函數(shù)源碼分享以及使用范例,十分實用,推薦給小伙伴們,希望大家能夠喜歡。
    2015-03-03
  • Three.js中矩陣和向量的使用教程

    Three.js中矩陣和向量的使用教程

    這篇文章主要給大家介紹了關于Three.js中矩陣和向量使用的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Three.js具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-03-03
  • JavaScript對象與數(shù)組的幾種常見復制方法

    JavaScript對象與數(shù)組的幾種常見復制方法

    在 JavaScript 開發(fā)中,對象和數(shù)組的復制是一個非常常見的操作,無論是函數(shù)參數(shù)傳遞、狀態(tài)管理,還是避免不必要的副作用,了解和掌握各種復制方式至關重要,我們將系統(tǒng)梳理 JavaScript 中的幾種常見復制方法,并對其應用場景進行詳細說明,需要的朋友可以參考下
    2024-10-10

最新評論

洞口县| 贵溪市| 平和县| 天台县| 柞水县| 宁陵县| 沂南县| 济源市| 瑞安市| 云梦县| 安徽省| 万安县| 庆云县| 盐城市| 兴化市| 石狮市| 且末县| 蓝田县| 万山特区| 读书| 张掖市| 丽江市| 双牌县| 高邑县| 隆回县| 东城区| 平顺县| 远安县| 温宿县| 吴忠市| 江永县| 牡丹江市| 云龙县| 肇州县| 哈密市| 稻城县| 贵溪市| 夹江县| 潜江市| 洛阳市| 乌苏市|