| この記事の要点 |
|
<div> は汎用コンテナ
<div> (division) は意味を持たない汎用ブロックレベル要素です。それ自体は何の意味も持たず、CSS でスタイル適用したり JavaScript で操作したりするための「入れ物」として使われます。
HTML4 時代はレイアウト構築のために <div class="header"> / <div class="footer"> のように多用されていましたが、HTML5 では意味のあるセマンティック要素に置き換えることが推奨されています。
<!-- ❌ 古い書き方 (HTML4 風) -->
<div class="header">
<div class="logo">Logo</div>
<div class="nav">...</div>
</div>
<div class="main">
<div class="article">...</div>
<div class="sidebar">...</div>
</div>
<div class="footer">...</div>
<!-- ✅ HTML5 セマンティック -->
<header>
<h1>Logo</h1>
<nav>...</nav>
</header>
<main>
<article>...</article>
<aside>...</aside>
</main>
<footer>...</footer>
セマンティック要素優先の理由
| 観点 | <div> のみ | セマンティック要素 |
|---|---|---|
| SEO | クローラーが構造を理解しにくい | 記事 (article) / ナビ (nav) を識別 |
| スクリーンリーダー | 「div, div, div ...」と読み上げ | 「ナビゲーション、メイン、フッター」と認識 |
| キーボード操作 | ランドマーク間スキップ不可 | ランドマーク間ジャンプ可能 |
| CSS | class セレクタ必須 | 要素セレクタで指定可能 |
| HTML Outline | 暗黙のセクション無し | 明示的なドキュメント構造 |
ARIA role で補強
レガシー HTML でどうしても <div> を使うときは ARIA role でセマンティクスを補えます。ただし、ネイティブのセマンティック要素を使う方が優先です (Rule of ARIA "No ARIA is better than bad ARIA")。
<!-- ARIA で意味を付与 (やむを得ない場合) -->
<div role="banner"> <!-- = header -->
<div role="navigation"> <!-- = nav -->
<div role="main"> <!-- = main -->
<div role="article"> <!-- = article -->
<div role="complementary"> <!-- = aside -->
<div role="contentinfo"> <!-- = footer -->
<div role="search"> <!-- 検索ランドマーク (HTML5 にネイティブ無し) -->
divitis (div 多用症)
意味なく <div> を入れ子にしまくる悪習を divitis (div 中毒) と呼びます。React / Vue の隆盛で再び見られる現象です。
<!-- ❌ divitis: 無意味な div ネスト -->
<div class="card">
<div class="card-inner">
<div class="card-content">
<div class="card-title">
<div class="title-text">タイトル</div>
</div>
<div class="card-body">
<div class="body-text">本文</div>
</div>
</div>
</div>
</div>
<!-- ✅ セマンティック + 必要最小限の div -->
<article class="card">
<h2>タイトル</h2>
<p>本文</p>
</article>
React / Vue のフラグメント
SPA フレームワークでは「親要素が必要だが意味的に <div> を増やしたくない」というケースが頻発します。Fragment を使うと余計な <div> を回避できます。
// ❌ 不要な div で囲む
function Card() {
return (
<div>
<h2>Title</h2>
<p>Body</p>
</div>
);
}
// ✅ Fragment で囲む
function Card() {
return (
<>
<h2>Title</h2>
<p>Body</p>
</>
);
}
// Vue 3 は複数ルートをサポート
<template>
<h2>Title</h2>
<p>Body</p>
</template>
CSS Grid / Flexbox のラッパーとしての div
レイアウト目的の <div> は許容されます。意味があるならセマンティック要素、純粋にレイアウトだけなら <div> と使い分けます。
<main>
<h1>記事一覧</h1>
<!-- レイアウト目的の div は OK -->
<div class="grid-3-col">
<article>...</article>
<article>...</article>
<article>...</article>
</div>
</main>
<style>
.grid-3-col {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 1.5rem;
}
</style>
div と span の違い
| 要素 | display | 用途 |
|---|---|---|
<div> | block (改行する) | セクション / カード / コンテナ |
<span> | inline (改行しない) | テキスト中の一部を装飾 |
<!-- div: 改行する -->
<div>A</div>
<div>B</div>
<!-- 表示: A の下に B -->
<!-- span: 改行しない -->
<p>これは <span style="color:red">赤い</span> テキストです。</p>
<!-- 表示: 1 行で「これは 赤い テキストです。」 -->
こんなときは何を使う?
| 目的 | 推奨要素 |
|---|---|
| ページのヘッダー | <header> |
| サイト全体のナビ | <nav> |
| メインコンテンツ (1 ページ 1 つ) | <main> |
| 独立した記事 | <article> |
| 章 / 関連コンテンツの塊 | <section> |
| サイドバー / 補足 | <aside> |
| フッター | <footer> |
| ボタン | <button> |
| カード型のレイアウトラッパー (意味なし) | <div> |
| Grid/Flex のラッパー | <div> |
| テキスト内の一部だけ装飾 | <span> |
FAQ
Q: <section> と <div> の違いは?
A: <section> は見出しを伴う関連コンテンツの塊。<div> は意味なし。section 内には <h2> 等の見出しを置きます。
Q: 全部 <div> で書いても動くじゃん?
A: 動きますが SEO / アクセシビリティ / 保守性で大きく劣ります。スクリーンリーダー利用者にはランドマークが無いページとして読まれます。
Q: <div> に onclick を付けたい
A: クリック可能な要素は <button> / <a> を使うべき。<div> にイベント付けるとキーボード操作 (Tab/Enter) や ARIA 対応が必要になり保守が大変。
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスのソフト一覧|Blender・Metasequoiaと用途別の選び方
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- Visual Studio「デザイナーを表示できません」エラーの原因と対処 2026-10-28 12:06:00
- SSH 認証に失敗しました。再試行してください の対処 2026-10-28 12:06:00
- SSH2 秘密鍵の読み込みに失敗しました の原因と対処 2026-10-28 12:06:00
- TeraTerm のよくあるエラーと対処法完全ガイド — Connection refused / 2026-10-28 12:06:00
- Visual Studio エラー一覧|コンパイルエラー・警告の確認方法と対処 2026-10-28 11:39:57
- Whitelabel Error Page の原因と消し方|Spring Boot のエラーページ 2026-10-28 11:39:57
- Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法 2026-10-28 11:39:57
- SQL WHERE 句完全ガイド 2026-10-28 11:39:57
- SQL JOIN 完全ガイド (INNER/LEFT/RIGHT/FULL OUTER) 2026-10-28 11:39:57
- tomcat の起動 / 停止ログと catalina.log・catalina.out の違い 2026-10-28 10:24:23
- Tomcat の起動確認方法 5 つ|localhost:8080・ポート・プロセス・ログ 2026-10-28 10:24:23
- Oracle 19c COMMITの使い方: 暗黙コミット・自動確定・応答不明時の確認 2026-10-28 09:59:09
- Oracle 19c DELETE文|削除対象の確認・COMMIT前の判断・ROLLBACKの条件 2026-10-28 09:59:09
- Oracle 19c INSERT文|INSERT ALL・SELECT・RETURNINGとMERGEの使い分け 2026-10-28 09:59:09
- Oracle 19cのトランザクション制御|COMMIT・ROLLBACK・分離レベルと接続設定 2026-10-28 09:59:09