DOMとは?JavaScriptでWebページを操作する仕組みを完全理解

「ボタンをクリックしたら文字が変わる仕組みって?」 「JavaScriptでHTMLを操作するって、実際どういうこと?」 「DOMって聞くけど、結局何なの?」

そんな疑問、この記事で全部スッキリ解決します!

Webサイトで文字が動いたり、ボタンを押したら画面が変わったり…これらの動きを作っているのが**DOM(ドム)**という仕組みなんです。でも「Document Object Model」なんて言われても、ピンときませんよね。

実はDOMって、WebページをJavaScriptから操作するための「取扱説明書」のようなもの。この仕組みを理解すれば、あなたも動きのあるWebサイトが作れるようになります!

この記事では、DOMの基本から実践的な使い方まで、プログラミング初心者でも15分で理解できるように解説します。一緒に学んでいきましょう!


スポンサーリンク

DOMって結局何?たとえ話で理解しよう

DOM(Document Object Model)とは

DOMを一言で説明すると: 「HTMLで書いたWebページを、JavaScriptから操作できるようにした仕組み」

でも、これだけだとまだ分かりにくいですよね。もっと身近な例で説明しましょう。

家の模型で理解するDOM

想像してみてください。あなたの家をレゴブロックで作った模型があるとします。

HTMLは設計図:

  • どこに部屋があるか
  • 窓はいくつあるか
  • ドアの位置はどこか

DOMは完成した模型:

  • 実際に触れる
  • 部品を動かせる
  • 色を塗り替えられる

JavaScriptは あなたの手:

  • 模型を操作する
  • 部品を追加・削除する
  • 配置を変更する

つまり、DOMは「HTMLという設計図を、実際に操作できる立体的な模型にしたもの」なんです!

もっと具体的に:Webページの例

<!-- これがHTML(設計図) -->
<div id="message">こんにちは</div>
<button id="btn">クリック</button>
// JavaScriptでDOMを操作
document.getElementById('btn').addEventListener('click', function() {
    document.getElementById('message').textContent = 'さようなら';
});

ボタンをクリックすると「こんにちは」が「さようなら」に変わる。これがDOMの力です!


DOMの構造:ツリー(木)のような階層

DOMツリーを理解しよう

DOMは「ツリー構造」という階層的な形をしています。家系図みたいなイメージですね。

簡単なHTMLの例:

<!DOCTYPE html>
<html>
  <head>
    <title>私のページ</title>
  </head>
  <body>
    <h1>見出し</h1>
    <div>
      <p>段落1</p>
      <p>段落2</p>
    </div>
  </body>
</html>

これがDOMツリーになると:

document
  └── html
      ├── head
      │   └── title
      │       └── "私のページ"(テキスト)
      └── body
          ├── h1
          │   └── "見出し"(テキスト)
          └── div
              ├── p
              │   └── "段落1"(テキスト)
              └── p
                  └── "段落2"(テキスト)

ノード(Node)って何?

DOMツリーの各要素を「ノード」と呼びます。

ノードの種類:

  • 要素ノード:HTMLタグ(<div><p>など)
  • テキストノード:文字の内容
  • 属性ノード:id、classなどの属性
  • ドキュメントノード:文書全体(document)

ツリーの「枝」や「葉」みたいなものですね!

親子関係と兄弟関係

DOMの要素には家族のような関係があります:

<div id="parent">        <!-- 親要素 -->
  <p id="child1">長男</p>  <!-- 子要素(兄) -->
  <p id="child2">次男</p>  <!-- 子要素(弟) -->
</div>

関係性:

  • divpたちの親(parent)
  • pたちはdiv子(children)
  • 2つのp兄弟(siblings)

この関係性を使って、要素を辿っていくことができるんです!


【実践】JavaScriptでDOMを操作する基本メソッド

要素を取得する(つかまえる)

まずは操作したい要素を見つけることから始まります。

1. IDで取得(一番簡単!)

// IDが"myDiv"の要素を取得
const element = document.getElementById('myDiv');

2. クラス名で取得

// クラス名が"box"の要素を全て取得
const elements = document.getElementsByClassName('box');

3. タグ名で取得

// 全てのp要素を取得
const paragraphs = document.getElementsByTagName('p');

4. セレクタで取得(最強!)

// CSSセレクタで取得(1つ)
const element = document.querySelector('#myDiv .box');

// CSSセレクタで取得(全て)
const elements = document.querySelectorAll('.box');

内容を変更する

要素を取得したら、中身を変更できます。

テキストを変更:

// 要素を取得
const title = document.getElementById('title');

// テキストを変更
title.textContent = '新しいタイトル';

HTMLを変更:

// HTMLごと変更(タグも含む)
title.innerHTML = '<strong>強調された</strong>タイトル';

⚠️ 注意: innerHTMLはXSS攻撃の危険があるので、ユーザー入力を直接入れないこと!

スタイルを変更する

見た目も自由に変えられます。

const box = document.getElementById('box');

// 色を変える
box.style.color = 'red';

// 背景色を変える
box.style.backgroundColor = 'yellow';

// サイズを変える
box.style.width = '200px';
box.style.height = '100px';

// 表示/非表示
box.style.display = 'none';  // 消す
box.style.display = 'block'; // 表示

クラスを操作する

CSSクラスの追加・削除もお手の物!

const element = document.getElementById('myElement');

// クラスを追加
element.classList.add('active');

// クラスを削除
element.classList.remove('active');

// クラスの切り替え(あれば削除、なければ追加)
element.classList.toggle('active');

// クラスがあるか確認
if (element.classList.contains('active')) {
    console.log('activeクラスがあります');
}

要素の作成・追加・削除

新しい要素を作る

DOMを使えば、HTMLに書いていない要素も作れます!

// 1. 新しい要素を作成
const newDiv = document.createElement('div');

// 2. 内容を設定
newDiv.textContent = '新しく作った要素です';

// 3. クラスを設定
newDiv.className = 'new-box';

// 4. ページに追加
document.body.appendChild(newDiv);

要素を好きな場所に追加

末尾に追加(appendChild):

const parent = document.getElementById('container');
const newElement = document.createElement('p');
newElement.textContent = '追加された段落';
parent.appendChild(newElement);

特定の位置に挿入(insertBefore):

const parent = document.getElementById('container');
const newElement = document.createElement('p');
const referenceElement = document.getElementById('existing');
parent.insertBefore(newElement, referenceElement);

便利な挿入メソッド(insertAdjacentHTML):

const element = document.getElementById('myDiv');

// 要素の直前に追加
element.insertAdjacentHTML('beforebegin', '<p>前</p>');

// 要素の最初の子として追加
element.insertAdjacentHTML('afterbegin', '<p>最初</p>');

// 要素の最後の子として追加
element.insertAdjacentHTML('beforeend', '<p>最後</p>');

// 要素の直後に追加
element.insertAdjacentHTML('afterend', '<p>後</p>');

要素を削除する

いらなくなった要素は削除できます。

// 方法1:親要素から削除
const element = document.getElementById('deleteMe');
element.parentNode.removeChild(element);

// 方法2:直接削除(新しい方法)
element.remove();

イベントリスナー:ユーザーの操作に反応する

イベントとは?

イベントは「何かが起きた」という出来事のことです。

よくあるイベント:

  • click:クリックされた
  • mouseover:マウスが乗った
  • keydown:キーが押された
  • submit:フォームが送信された
  • load:ページが読み込まれた
  • scroll:スクロールされた

イベントリスナーの使い方

// ボタンを取得
const button = document.getElementById('myButton');

// クリックイベントを設定
button.addEventListener('click', function() {
    alert('ボタンがクリックされました!');
});

もっと実践的な例:

// フォームの入力チェック
const input = document.getElementById('email');
const error = document.getElementById('error');

input.addEventListener('blur', function() {
    if (!input.value.includes('@')) {
        error.textContent = 'メールアドレスが正しくありません';
        error.style.color = 'red';
    } else {
        error.textContent = '';
    }
});

イベントの詳細情報を取得

イベントオブジェクトから詳しい情報を取得できます。

document.addEventListener('click', function(event) {
    console.log('クリックされた要素:', event.target);
    console.log('クリック位置X:', event.clientX);
    console.log('クリック位置Y:', event.clientY);
});

よくある操作パターンと実例

パターン1:タブ切り替え

// HTML
// <div class="tab" data-content="content1">タブ1</div>
// <div class="tab" data-content="content2">タブ2</div>
// <div id="content1" class="content">内容1</div>
// <div id="content2" class="content hidden">内容2</div>

const tabs = document.querySelectorAll('.tab');
const contents = document.querySelectorAll('.content');

tabs.forEach(tab => {
    tab.addEventListener('click', function() {
        // 全てのコンテンツを隠す
        contents.forEach(content => {
            content.classList.add('hidden');
        });
        
        // クリックされたタブのコンテンツを表示
        const targetId = this.dataset.content;
        document.getElementById(targetId).classList.remove('hidden');
    });
});

パターン2:モーダルウィンドウ

// 開くボタン
const openBtn = document.getElementById('openModal');
const modal = document.getElementById('modal');
const closeBtn = document.getElementById('closeModal');

// モーダルを開く
openBtn.addEventListener('click', function() {
    modal.style.display = 'block';
});

// モーダルを閉じる
closeBtn.addEventListener('click', function() {
    modal.style.display = 'none';
});

// 背景クリックで閉じる
modal.addEventListener('click', function(event) {
    if (event.target === modal) {
        modal.style.display = 'none';
    }
});

パターン3:TODOリスト

const input = document.getElementById('todoInput');
const addBtn = document.getElementById('addBtn');
const todoList = document.getElementById('todoList');

addBtn.addEventListener('click', function() {
    if (input.value.trim() === '') return;
    
    // 新しいリスト項目を作成
    const li = document.createElement('li');
    li.textContent = input.value;
    
    // 削除ボタンを追加
    const deleteBtn = document.createElement('button');
    deleteBtn.textContent = '削除';
    deleteBtn.addEventListener('click', function() {
        li.remove();
    });
    
    li.appendChild(deleteBtn);
    todoList.appendChild(li);
    
    // 入力欄をクリア
    input.value = '';
});

DOMを使う時の注意点とベストプラクティス

パフォーマンスを意識する

悪い例:

// 何度もDOMにアクセス(遅い)
for (let i = 0; i < 100; i++) {
    document.getElementById('list').innerHTML += '<li>項目' + i + '</li>';
}

良い例:

// 一度にまとめて追加(速い)
let html = '';
for (let i = 0; i < 100; i++) {
    html += '<li>項目' + i + '</li>';
}
document.getElementById('list').innerHTML = html;

DOMContentLoadedを使う

DOMの準備ができてから実行しましょう。

document.addEventListener('DOMContentLoaded', function() {
    // ここにDOM操作のコードを書く
    console.log('DOMの準備完了!');
});

セキュリティに注意

// 危険:ユーザー入力を直接innerHTML
const userInput = document.getElementById('input').value;
element.innerHTML = userInput;  // XSS攻撃の危険!

// 安全:textContentを使う
element.textContent = userInput;  // テキストとして扱われる

イベントリスナーの解除

不要になったイベントリスナーは削除してメモリリークを防ぎます。

function handleClick() {
    console.log('クリックされた');
}

// 追加
element.addEventListener('click', handleClick);

// 削除
element.removeEventListener('click', handleClick);

DOMとjQueryの違い

jQueryって何?

jQueryは、DOM操作を簡単にするためのライブラリです。

素のJavaScript(Vanilla JS):

document.getElementById('myDiv').style.display = 'none';

jQuery:

$('#myDiv').hide();

現代ではjQueryは必要?

jQueryが不要になった理由:

  • 最新のJavaScriptで十分簡単に書ける
  • パフォーマンスは素のJavaScriptの方が速い
  • ファイルサイズを削減できる

でも、古いプロジェクトではまだ使われています。


まとめ:DOMマスターへの第一歩

DOMの基本、理解できましたか?最初は難しく感じるかもしれませんが、実は単純な仕組みなんです。

この記事の重要ポイント:

  1. DOMとは
    • HTMLをJavaScriptから操作する仕組み
    • ツリー構造で階層的に管理
  2. 基本操作
    • 要素の取得:getElementByIdquerySelector
    • 内容の変更:textContentinnerHTML
    • スタイル変更:styleプロパティ
  3. 要素の追加・削除
    • 作成:createElement
    • 追加:appendChild
    • 削除:remove
  4. イベント処理
    • addEventListenerでユーザー操作に反応

まずは簡単な例から始めて、少しずつ複雑な操作に挑戦してみてください。ボタンクリックで文字を変える、それだけでも立派なDOM操作です!

DOMを理解すれば、Webページに命を吹き込むことができます。さあ、あなたも動きのあるWebサイトを作ってみませんか?🚀

コメント

タイトルとURLをコピーしました