「ボタンをクリックしたら文字が変わる仕組みって?」 「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>
関係性:
div
はp
たちの親(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の基本、理解できましたか?最初は難しく感じるかもしれませんが、実は単純な仕組みなんです。
この記事の重要ポイント:
- DOMとは
- HTMLをJavaScriptから操作する仕組み
- ツリー構造で階層的に管理
- 基本操作
- 要素の取得:
getElementById
、querySelector
- 内容の変更:
textContent
、innerHTML
- スタイル変更:
style
プロパティ
- 要素の取得:
- 要素の追加・削除
- 作成:
createElement
- 追加:
appendChild
- 削除:
remove
- 作成:
- イベント処理
addEventListener
でユーザー操作に反応
まずは簡単な例から始めて、少しずつ複雑な操作に挑戦してみてください。ボタンクリックで文字を変える、それだけでも立派なDOM操作です!
DOMを理解すれば、Webページに命を吹き込むことができます。さあ、あなたも動きのあるWebサイトを作ってみませんか?🚀
コメント