国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

理解DOM性能優化:從重繪回流到虛擬 DOM

開發 前端
想象一下你在畫畫:重繪(Repaint):?就像只改變畫作的某些顏色,但整體布局不變,回流(Reflow):?相當于把整幅畫重新構圖,所有元素的位置大小都要重新計算。

一、什么是重繪與回流?

想象一下你在畫畫:

  • 重繪(Repaint):就像只改變畫作的某些顏色,但整體布局不變。
  • 回流(Reflow):相當于把整幅畫重新構圖,所有元素的位置大小都要重新計算。

在瀏覽器中:

  • 回流:當 DOM 的變化影響了元素的幾何屬性(如寬度、高度、位置等), 瀏覽器需要重新計算元素的幾何屬性,并重新構建渲染樹。
  • 重繪:當元素的外觀屬性(如顏色、背景色等)發生改變,但不影響布局時,瀏覽器只需重繪元素。

回流必定會引起重繪,但重繪不一定會引起回流。

導致回流的常見操作:

//幾何屬性變化
element.style.width = '100px';
element.style.height = '100px';
element.style.padding = '10px';


//添加或刪除可見DOM元素
document.body.appendChild(newElement);
element.parentNode.removeChild(element);


//內容變化(如文本改變導致尺寸變化)
element.innerHTML = '新內容';


//瀏覽器窗口大小改變
window.addEventListener('resize', callback);


//獲取某些屬性(會強制觸發回流以獲取最新值)
const width = element.offsetWidth;
const height = element.offsetHeight;

只導致重繪的操作:

//顏色相關
element.style.color = 'red';
element.style.backgroundColor = '#fff';


//邊框樣式
element.style.border = '1px solid red';


//可見性
element.style.visibility = 'hidden';

瀏覽器渲染流程是這樣的: 

  1. 解析HTML生成DOM樹.
  2. 解析CSS生成CSSOM樹.
  3. 將DOM和CSSOM合并成渲染樹(Render Tree).
  4. 計算渲染樹的布局(回流).
  5. 將布局繪制到屏幕上(重繪).

每次回流都需要重新計算所有受影響元素的幾何屬性, 然后重繪. 這在復雜頁面中會非常消耗性能. 

舉個例子:

const box = document.getElementById('box');
for (let i = 0; i < 100; i++) {
  box.style.width = box.offsetWidth + 1 + 'px'; //每次循環都讀取和設置寬度,強制回流
}

這段代碼會導致 100 次回流, 性能非常差。

二、最小化DOM操作

2.1 批量修改DOM

不要一個一個地修改DOM, 而是先把所有修改準備好, 然后一次性應用。

不好的做法: 

const list = document.getElementById('list');
for (let i = 0; i < 10; i++) {
  const item = document.createElement('li');
  item.textContent = `Item ${i}`;
  list.appendChild(item); //每次循環都操作DOM
}

好的做法: 

const list = document.getElementById('list');
const fragment = document.createDocumentFragment();//使用文檔片段


for (let i = 0; i < 10; i++) {
  const item = document.createElement('li');
  item.textContent = `Item ${i}`;
  fragment.appendChild(item); //先在內存中操作
}


list.appendChild(fragment); //最后一次性插入DOM

2.2 使用className而不是style

直接操作 style 屬性會導致多次重繪/回流, 而修改 className 可以批量應用樣式。

不好的做法:

element.style.color = 'red';
element.style.backgroundColor = 'blue';
element.style.fontSize = '16px';

好的做法:

.highlight {
  color: red;
  background-color: blue;
  font-size: 16px;
}
element.classList.add('highlight');

2.3 脫離文檔流后再進行復雜操作

如果你需要對一個元素進行多次復雜的 DOM 操作, 可以先將它從文檔流中移除, 操作完成后再添加回去。

const list = document.getElementById('list');
const parent = list.parentNode;


//從DOM中移除元素
parent.removeChild(list);


//進行復雜的DOM操作
//...比如添加很多子元素


//操作完成后再添加回DOM
parent.appendChild(list);

2.4 避免頻繁讀取會觸發回流的屬性

像offsetWidth、offsetHeight、getComputedStyle等屬性會強制瀏覽器觸發回流來獲取最新值。

不好的做法:

for (let i = 0; i < boxes.length; i++) {
  const width = boxes[i].offsetWidth; //每次循環都讀取,強制回流
  boxes[i].style.width = width + 10 + 'px';
}

好的做法:

//先讀取所有值
const widths = [];
for (let i = 0; i < boxes.length; i++) {
  widths[i] = boxes[i].offsetWidth;
}


//然后統一設置
for (let i = 0; i < boxes.length; i++) {
  boxes[i].style.width = widths[i] + 10 + 'px';
}

2.5 使用CSS3動畫替代JS動畫

CSS3 動畫可以利用硬件加速, 通常比 JavaScript 實現的動畫性能更好。

不好的做法:

//使用JavaScript實現動畫
function animate(element) {
  let pos = 0;
  const id = setInterval(() => {
    if (pos >= 100) clearInterval(id);
    else {
      pos++;
      element.style.left = pos + 'px';
    }
  }, 10);
}

好的做法:

.box {
  transition: left 1s ease-out;
}

三、虛擬DOM概念介紹

3.1 什么是虛擬DOM?

虛擬DOM(Virtual DOM)是一個用JavaScript對象表示的DOM樹的副本. React、Vue等現代前端框架都使用了虛擬DOM的概念。

//虛擬DOM對象的簡化表示
const virtualNode = {
  tag: 'div',
  props: { id: 'app', class: 'container' },
  children: [
    {
      tag: 'h1',
      props: {},
      children: ['Hello, Virtual DOM!']
    }
  ]
};

3.2 虛擬DOM如何工作?

  1. 初始渲染: 根據組件創建虛擬DOM樹
  2. 狀態變化: 當數據變化時,創建新的虛擬DOM樹
  3. 差異比較(Diffing): 比較新舊虛擬DOM樹的差異
  4. 批量更新: 只將差異部分應用到真實DOM

3.3 為什么虛擬DOM能提高性能?

  1. 減少直接 DOM 操作: 批量更新, 減少回流和重繪。
  2. 高效的差異算法: 只更新必要的部分。
  3. 跨平臺能力: 虛擬DOM可以渲染到不同平臺(Web、Native等)。

3.4 讓我們實現一個超簡版的虛擬DOM來理解其原理

//創建虛擬DOM節點的函數
function h(tag, props, children) {
  return { tag, props, children };
}


//將虛擬DOM渲染為真實DOM
function render(vnode) {
  if (typeof vnode === 'string') {
    return document.createTextNode(vnode);
  }


  const el = document.createElement(vnode.tag);


  //設置屬性
  for (const [key, value] of Object.entries(vnode.props || {})) {
    el.setAttribute(key, value);
  }


  //渲染子節點
  (vnode.children || []).forEach(child => {
    el.appendChild(render(child));
  });


  return el;
}


//使用示例
const vdom = h('div', { id: 'app' }, [
  h('h1', {}, ['Hello Virtual DOM']),
  h('p', {}, ['This is a simple example'])
]);


const realDOM = render(vdom);
document.body.appendChild(realDOM);

圖片圖片

責任編輯:武曉燕 來源: 全棧程序員老馬
相關推薦

2015-08-11 09:46:26

JavaScriptDOM編程重排

2022-12-08 15:42:36

瀏覽器重繪回流

2024-09-11 16:49:55

2021-01-18 07:15:22

虛擬DOM真實DOMJavaScript

2025-07-03 02:15:00

DOM對象模型JavaScript

2025-07-21 09:30:35

2011-04-25 10:11:57

高性能web開發

2010-09-28 11:11:23

XML DOMHTML DOM

2021-05-26 05:22:09

Virtual DOMSnabbdom虛擬DOM

2025-02-24 09:10:00

前端VueDOM

2023-02-14 09:37:00

Vue無虛擬模式

2021-01-11 07:51:16

DOM對象節點樹

2025-05-08 02:10:00

Vue虛擬DOM

2010-09-09 17:19:07

HTML DOMXML DOM

2010-09-28 10:24:50

HTML DOMXML DOM

2023-12-26 10:12:19

虛擬DOM數據

2015-07-10 09:24:16

用友

2018-11-14 19:30:57

前端Javascript性能優化

2010-09-28 09:33:25

DOM模型

2014-05-26 16:16:59

Shadow DomWeb Compone
點贊
收藏

51CTO技術棧公眾號

亚洲成人在线免费| 国产精品伦一区二区三级视频| 日韩二区在线观看| 久久美女艺术照精彩视频福利播放| 亚洲精品大片www| 91麻豆精品91久久久久同性| 精品久久久久久久一区二区蜜臀| 有码中文亚洲精品| 国产欧美一区二区| 亚洲美免无码中文字幕在线 | 一区二区三区短视频| 免费一级欧美在线观看视频| 日韩免费看片| www.成人在线| 欧美一区二区三区色| 欧美又大又粗又长| 波多野结衣激情| 91社区在线| 欧美国产小视频| 国产片一区二区| 亚洲欧美资源在线| 人偷久久久久久久偷女厕| 性欧美孕妇孕交| 亚洲免费福利一区| 成人一区二区三区中文字幕| 欧美剧情片在线观看| 国产一区深夜福利| 久久精品无码一区二区日韩av| 国产日韩另类视频一区| 国产亚洲综合精品| 欧美三级在线看| 亚洲综合中文字幕在线观看| 韩国日本美国免费毛片| 亚洲承认视频| 香蕉久久一区| 97精品久久久午夜一区二区三区| 性日韩欧美在线视频| 久久久久久久影院| 青青草综合视频| 国产精品中文| 欧美午夜视频一区二区| 日韩av大全| 国产精品一线天粉嫩av| 亚洲精品av在线播放| 交换国产精品视频一区| 久久久久免费| 91精品91久久久久久| 精品日韩av| 亚洲综合清纯丝袜自拍| 不卡中文字幕在线| 亚洲国产一区二区在线观看| 日韩一区二区在线播放| 日本美女高潮视频| 日韩天天综合| 久久久久久亚洲| 七七成人影院| 亚洲国产成人91porn| 亚洲欧洲精品在线| 欧美综合久久| xvideos成人免费中文版| 日本福利片高清在线观看| 国产米奇在线777精品观看| 国产欧美精品va在线观看| 91九色综合| 一本到一区二区三区| 欧美午夜无遮挡| 欧美一二三四五区| 欧美国产亚洲精品| 亚洲女同同性videoxma| 在线一区二区三区四区| 91视频99| 亚洲ww精品| 日本高清免费不卡视频| 日本www在线视频| 久久视频国产| 欧美在线观看禁18| 二级片在线观看| av人人综合网| 精品一区二区三区在线观看| 欧美亚洲日本一区| 国产日韩精品电影| 性欧美精品孕妇| 国产99久久| 99久精品国产| 国产成人亚洲精品| 乱人伦中文视频在线| 免费一级片91| 欧美人与物videos| 另类专区亚洲| 亚洲国产色一区| 国产精品区一区二区三在线播放| av文字幕在线观看| 在线播放亚洲| xxxx欧美18另类的高清| 天天插天天狠天天透| 中文字幕午夜精品一区二区三区| 欧美午夜电影网| 日本婷婷久久久久久久久一区二区| 国产一区二区三区免费观看在线 | 91美女精品| 欧美.www| 亚洲无av在线中文字幕| 日韩hmxxxx| 综合久久伊人| 亚洲夂夂婷婷色拍ww47| 久久9精品区-无套内射无码| 极品尤物av久久免费看| 亚洲巨乳在线观看| 玖玖视频精品| 国产日韩精品推荐| 亚洲18在线| 中文字幕免费精品一区| a天堂中文在线官网在线| 一区二区三区精品久久久| 国产精品人人妻人人爽人人牛| 国产精品乱子久久久久| 国产精品国产亚洲伊人久久| 青梅竹马是消防员在线| 日韩免费av| 亚洲天堂色网站| 污版网站在线观看| 在线日本成人| 久久青草福利网站| 免费av网站在线看| 国产精品一区二区x88av| 91精品久久久久久久久青青| 国产九九在线| av日韩久久| 国产一区二区三区视频| 国产福利在线免费观看| 精品噜噜噜噜久久久久久久久试看| 一二三区在线视频| 亚洲一二三四区| a视频在线看| 欧美中文字幕亚洲一区二区va在线| 日本免费一区二区三区最新| 在线观看亚洲精品| 成人免费看片视频在线观看| 亚洲aa中文字幕| 亚洲福利影视| 欧美午夜片在线免费观看| 久久久无码中文字幕久...| 天天色天天射综合网| 日韩在线视频网| 毛片免费在线| 高跟丝袜一区二区三区| 日韩久久久久久久久久久久| 亚洲激情影院| 亚洲欧洲精品一区二区三区波多野1战4 | 亚洲国产日韩a在线播放性色| 日本不卡在线播放| 亚洲素人在线| 精品国产依人香蕉在线精品| 国产三区四区在线观看| 国产日韩亚洲欧美综合| 狠狠色综合色区| 日韩电影免费一区| 成人www视频在线观看| 国产精品亚洲成在人线| 亚洲第一在线视频| 日韩新的三级电影| 国产91av在线| 久热精品在线| 4hu永久免费入口| 伊人夜夜躁av伊人久久| 免费在线你懂的| 色777狠狠综合秋免鲁丝| 日本在线视频一区二区三区| 欧洲午夜精品久久久| 久久久久蜜桃| 国产精品久久久久久久久电影网| 1区2区3区国产精品| 亚洲精品一线| 国产精品第一页在线| 日韩国产欧美在线观看| 亚洲精品午夜在线观看| 亚洲精品在线一区二区| 九九精品在线| 国产精品视频免费一区二区三区| 不卡电影免费在线播放一区| 黄色毛片在线看| 高清欧美电影在线| 精品综合久久久久久8888| 成人性免费视频| 一本大道久久a久久综合婷婷| gogo在线高清视频| 欧美激情影音先锋| 国产aⅴ综合色| 日本福利午夜视频在线| 久久成人这里只有精品| 久久电影网站中文字幕| 最新91在线| 久久久免费在线观看| 狠狠色狠狠色综合系列| 伪装者免费全集在线观看 | 91社区国产高清| 亚洲综合久久av| 欧美自拍一区| 91香蕉视频污版| 色av中文字幕一区|