DOM(Document Object Model), 是一種將 HTML / XML 裡面有很多的標籤和內容,把他轉換成一個樹狀的資料結構
大概像這樣👇
圖片上也標示出DOM上的Node結構
(這個是我們常用的HTML DOM)
document
:整個文件的根節點element node
:HTML 元素(如 <body>
、<ul>
)text node
:元素內的純文字內容attribute node
:元素的屬性(如 class
、href
等)上面的圖其實就是這樣的程式碼👇
<!DOCTYPE html>
<html>
<head>
<title>My title</title>
</head>
<body>
<h1>A heading</h1>
<a href="">Link Text</p>
</body>
</html>
DOM提供DOM API給 JavaScript 能夠動態讀取、修改、刪除、插入文件中的內容與結構
如下面的方法:
// 取得元素
const title = document.getElementById('title');
// 修改文字
title.textContent = 'Hello DOM';
// 加上 class
title.classList.add('highlight');
這些 API 都是瀏覽器提供的,為 DOM 原生方法 / DOM API
先附上流程圖
操作 DOM API 常常會引起瀏覽器的重排(reflow)或重繪(repaint),而影響頁面效能
重排(reflow)與重繪(repaint)是什麼?
width
, height
)top
, left
、新增或刪除元素)margin
, padding
, border
)appendChild()
, removeChild()
)font-size
)offsetTop
, clientHeight
等會強制同步計算 layout 的屬性color
background-color
visibility
box-shadow
要如何提升效能?
class
一次性改樣式,而非逐一設屬性offsetTop
、getComputedStyle()
會導致瀏覽器馬上做 ReflowDOM其實只是一個總稱,還有很多的DOM,例如CSSOM、SVGDOM、Virtual DOM等,它們是針對不同文件類型的專用 DOM
我稍微介紹一下幾個常見的DOM
CSSOM (CSS Object Model)
Virtual DOM
既然都提到HTML DOM和CSSOM,就簡單的提一下Render Tree好了
Render Tree 是瀏覽器 DOM + CSSOM 後建立的一棵樹狀資料結構,它描述了哪些元素要被顯示出來、要用什麼樣子呈現
簡單總結來說就是:
DOM 是「結構」的樹,CSSOM 是「樣式」的樹。Render Tree 則是兩者融合、篩選後只留下可見元素
display: none
的元素、<meta>
、<script>
,這些看不到的元素都不會顯示https://ithelp.ithome.com.tw/m/articles/10202689
https://ithelp.ithome.com.tw/articles/10156858
https://developer.mozilla.org/zh-TW/docs/Web/API/Document_Object_Model