DOM操作を学ぶ

ウェブ開発において、DOM(Document Object Model)の操作は非常に重要です。

DOMを理解し、操作することで、静的なウェブページをダイナミックかつインタラクティブに変更することができます。

この記事では、初心者向けにDOMの基本から実際の操作までを解説します。



フロントエンドエンジニアロードマップ一覧はこちら



DOMとは?

DOMは、HTMLやXML文書のプログラムによる表現で、これを操作することでウェブページの構造やコンテンツを変更できます。

ウェブブラウザがHTML文書を読み込むと、それを解釈してメモリ上にDOMが構築されます。

このDOMをJavaScriptを使って操作することで、動的なウェブページを作成できるのです。


DOMの基本構造

DOMはツリー構造を持っており、各要素はノード(Node)と呼ばれます。


基本的なノードの種類には以下のようなものがあります。

  • Document Node: ドキュメント全体を表すノード。
  • Element Node: HTML要素を表すノード。
  • Attribute Node: HTML要素の属性を表すノード。
  • Text Node: テキストコンテンツを表すノード。


以下は、簡単なHTML文書とそのDOMツリーの例です。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>DOM Basics</title>
</head>
<body>

    <h1 id="main-heading">Hello, World!</h1>
    <p class="content">This is a simple paragraph.</p>
    <a href="https://www.example.com" target="_blank">Visit Example.com</a>

</body>
</html>

上記のHTML文書に対応するDOMツリーは、以下のようになります。

- Document Node
    - html
        - head
            - meta
            - meta
            - title
                - Text Node: "DOM Basics"
        - body
            - h1#main-heading
                - Text Node: "Hello, World!"
            - p.content
                - Text Node: "This is a simple paragraph."
            - a
                - Text Node: "Visit Example.com"


DOMへのアクセス

JavaScriptを使ってDOMにアクセスするには、documentオブジェクトを使用します。

以下は、いくつかの基本的なDOMへのアクセス方法です。

IDを使って要素にアクセス

// idがmain-headingの要素にアクセス
let headingElement = document.getElementById('main-heading');


クラスを使って要素にアクセス

// classがcontentの最初の要素にアクセス
let contentElement = document.querySelector('.content');


タグ名を使って要素にアクセス

// 最初のp要素にアクセス
let firstParagraph = document.querySelector('p');


複数の要素にアクセス

// classがcontentのすべての要素にアクセス
let allContentElements = document.querySelectorAll('.content');


要素のプロパティやメソッドを変更

DOMにアクセスしたら、要素のプロパティやメソッドを変更してページをダイナミックに操作できます。

以下は、いくつかの例です。

テキストコンテンツの変更

// idがmain-headingのテキストを変更
headingElement.textContent = "New Heading";


クラスの追加と削除

// classがcontentの要素に新しいクラスを追加
contentElement.classList.add('new-class');

// classがcontentの要素からクラスを削除
contentElement.classList.remove('content');


新しい要素の追加

// 新しいp要素を作成
let newParagraph = document.createElement('p');

// テキストを設定
newParagraph.textContent = "This is a new paragraph.";

// bodyに新しいp要素を追加
document.body.appendChild(newParagraph);


イベントの検知と処理

ユーザーのアクションに応じて動作するように、DOM要素にイベントリスナーを追加できます。以下は、クリックイベントを検知してアラートを表示する例です。

// idがmain-headingの要素にクリックイベントリスナーを追加
headingElement.addEventListener('click', function() {
    alert('Heading clicked!');
});


DOM操作の注意点

DOM操作は非常に強力ですが、適切な使用が必要です。

大量のDOM操作はパフォーマンスに悪影響を与える可能性があります。

以下は、いくつかの注意点です。


一括操作を利用する: 複数の要素を一度に操作する場合は、できるだけ一括で処理すると効率的です。

// これよりも…
element1.style.color = 'red';
element2.style.color = 'red';
element3.style.color = 'red';

// こちらの方が効率的
element1.style.cssText = element2.style.cssText = element3.style.cssText = 'color: red;';


リフローとリペイントの最小化: 要素の追加や削除、スタイルの変更はブラウザに再描画を促します。

これを最小限に抑えることが重要です。

// これは避けるべき
for (let i = 0; i < 1000; i++) {
    document.body.innerHTML += '<div>' + i + '</div>';
}

// こちらの方が良い
let container = document.createElement('div');
for (let i = 0; i < 1000; i++) {
    let div = document.createElement('div');
    div.textContent = i;
    container.appendChild(div);
}
document.body.appendChild(container);


イベントの効率的な管理: 多くのイベントが発生する場合、イベントの冒泡や委譲を活用して管理すると良いです。

// これは効率的ではない
document.querySelectorAll('.item').forEach(item => {
    item.addEventListener('click', function() {
        alert('Item clicked!');
    });
});

// こちらの方が効率的
document.getElementById('container').addEventListener('click', function(event) {
    if (event.target.classList.contains('item')) {
        alert('Item clicked!');
    }
});


まとめ

DOMの操作はウェブ開発において非常に重要なスキルです。適切なDOM操作を行うことで、ユーザーとの対話性やページのダイナミックな変更を実現できます。基本的なDOMへのアクセスから要素の変更、イベントの検知まで、これらの基本をしっかり理解し、実際のプロジェクトで活用できるようになることが重要です。初心者の方も少しずつ試してみながら、DOM操作に慣れていきましょう。



フロントエンドエンジニアロードマップ一覧はこちら