はじめに
CSS
やHTML
の勉強をしていると、よくNode
、Element
という言葉が出てくるのですがいまいち理解できなかったので、整理してみました。
結論
適当なhtmlを作成して、それのDOMツリー(もどき)を見て理解するのが一番分かりやすかったです。
sample.js
//ページ読み込み時にDOMツリー(もどき)を表示
window.addEventListener("DOMContentLoaded", () => {
//すべてのNodeを表示
let domTreeView = (i, node) => {
//Nodeタイプ番号
let types = [
"",//0
"ELEMENT_NODE",//1
"ATTRIBUTE_NODE",//2
"TEXT_NODE",//3
"CDATA_SECTION_NODE",//4
"ENTITY_REFERENCE_NODE",//5非推奨
"ENTITY_NODE",//6非推奨
"PROCESSING_INSTRUCTION_NODE",//7
"COMMENT_NODE",//8
"DOCUMENT_NODE",//9
"DOCUMENT_TYPE_NODE",//10
"DOCUMENT_FRAGMENT_NODE",//11
"NOTATION_NODE",//12非推奨
];
//自分自身
console.log(
String(i).padStart(i + 1, " "),//階層
node,//Node
node.nodeType,//Nodeタイプ番号
types[node.nodeType]//Nodeタイプ文字列
);
//NodeがElementの場合はAttributeNodeも表示
if (node.nodeType == Node.ELEMENT_NODE) {
node.getAttributeNames().forEach(name => {
let attr = node.getAttributeNode(name);
console.log(
"-> attr".padStart(i + 2 + "-> attr".length, " "),//階層
attr,//Node
attr.nodeType,//Nodeタイプ番号
types[attr.nodeType]//Nodeタイプ文字列
);
});
}
//すべての子Nodeについて処理
node.childNodes.forEach(child => {
//Nodeを再帰的に表示
domTreeView(i + 1, child);
});
};
//documentのNodeを表示
domTreeView(0, document);
});
適当なhtmlを作成して、
sample.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script src="sample.js"></script>
</head>
<body>
<div id="box">Hello</div>
<!-- コメント -->
</body>
</html>
document
自身はDocumentノード
であり、直下(先頭に1と表示されているもの)に2つのNode
があります。
- 1つの
DocumentTypeノード
(<!DOCTYPE html>
のこと) - 1つの
Elementノード
(<html>...</html>
のこと)
つまり直下のElementノード
としては<html>...</html>
の1つのみです。また<html>...</html>
の中には、更に複数のNode
が階層的に存在します。
-
Elementノード
<head>要素、<body>要素、<div>要素など -
Textノード
Helloだけでなく改行やスペースも含む -
Commentノード
<!-- コメント -->
以下に示すようにElement
はあくまでNode
を継承しているものの1つにすぎないということです。
継承関係
ノードの種類 | 例 | nodeTypeの名前 | 数値 |
---|---|---|---|
Element | <div>など | ELEMENT_NODE | 1 |
Attribute | ATTRIBUTE_NODE | 2 | |
Text | <div>Hello</div>のHelloやhtml内の1行ごとの改行など | TEXT_NODE | 3 |
CDATASection | <!CDATA[[ … ]]> | CDATA_SECTION_NODE | 4 |
ProcessingInstruction | <?xml-stylesheet … ?> | PROCESSING_INSTRUCTION_NODE | 7 |
Comment | <!-- --> | COMMENT_NODE | 8 |
Document | DOCUMENT_NODE | 9 | |
DocumentType | <!DOCTYPE html> | DOCUMENT_TYPE_NODE | 10 |
DocumentFragment | DOCUMENT_FRAGMENT_NODE | 11 |
参考URL
- Node - Web API | MDN
- Element - Web API | MDN
- Document - Web API | MDN
- HTMLElement - Web API | MDN
- DOM の紹介 - Web API | MDN
- W3C DOM Level 1 Core の使用 - Web API | MDN
- ホワイトスペースは HTML、 CSS、そして DOM 内でどう扱われるか - Web API | MDN
- Element (要素) - MDN Web Docs 用語集: ウェブ関連用語の定義 | MDN
- 【Mermaidの紹介】Qiitaでダイアグラム・チャートが簡単に書けるようになりました! - Qiita