10日で覚えるHTMLDay 8: セマンティックHTML
books.chapter 810日で覚えるHTML

Day 8: セマンティックHTML

今日学ぶこと

  • セマンティックHTMLとは何か
  • ページ構造のセマンティック要素
  • コンテンツのセマンティック要素
  • アクセシビリティとの関係

セマンティックHTMLとは

「セマンティック」とは「意味のある」という意味です。セマンティックHTMLとは、コンテンツの意味や役割を適切に表現するHTML要素を使うことです。

flowchart LR
    subgraph NonSemantic["❌ 非セマンティック"]
        D1["<div class='header'>"]
        D2["<div class='nav'>"]
        D3["<div class='content'>"]
    end
    subgraph Semantic["✅ セマンティック"]
        S1["<header>"]
        S2["<nav>"]
        S3["<main>"]
    end
    style NonSemantic fill:#ef4444,color:#fff
    style Semantic fill:#22c55e,color:#fff

なぜセマンティックHTMLが重要なのか

恩恵 説明
アクセシビリティ スクリーンリーダーがページ構造を理解できる
SEO 検索エンジンがコンテンツの重要度を判断できる
メンテナンス性 コードを読む人が構造を理解しやすい
一貫性 標準的な構造で統一感が生まれる

ページ構造のセマンティック要素

典型的なページ構成

flowchart TB
    subgraph Page["Webページの構造"]
        Header["&lt;header&gt;<br>ロゴ、サイト名"]
        Nav["&lt;nav&gt;<br>ナビゲーション"]
        Main["&lt;main&gt;<br>メインコンテンツ"]
        Article["&lt;article&gt;<br>記事"]
        Aside["&lt;aside&gt;<br>サイドバー"]
        Footer["&lt;footer&gt;<br>フッター"]
    end
    Header --> Nav
    Nav --> Main
    Main --> Article
    Main --> Aside
    Article --> Footer
    style Header fill:#3b82f6,color:#fff
    style Nav fill:#8b5cf6,color:#fff
    style Main fill:#22c55e,color:#fff
    style Article fill:#f59e0b,color:#fff
    style Aside fill:#f59e0b,color:#fff
    style Footer fill:#ef4444,color:#fff

<header>

ページまたはセクションのヘッダーです。

<header>
    <h1>サイト名</h1>
    <nav>
        <a href="/">ホーム</a>
        <a href="/about">概要</a>
        <a href="/contact">お問い合わせ</a>
    </nav>
</header>

<nav>

ナビゲーションリンクのグループです。

<nav aria-label="メインナビゲーション">
    <ul>
        <li><a href="/">ホーム</a></li>
        <li><a href="/blog">ブログ</a></li>
        <li><a href="/about">概要</a></li>
    </ul>
</nav>

ポイント: ページに複数の<nav>がある場合、aria-labelで区別します。

<main>

ページのメインコンテンツです。1ページに1つだけ使用します。

<main>
    <h1>ブログ記事一覧</h1>
    <!-- メインコンテンツ -->
</main>

<footer>

ページまたはセクションのフッターです。

<footer>
    <p>&copy; 2026 サイト名. All rights reserved.</p>
    <nav aria-label="フッターナビゲーション">
        <a href="/privacy">プライバシーポリシー</a>
        <a href="/terms">利用規約</a>
    </nav>
</footer>

コンテンツのセマンティック要素

<article>

独立して完結するコンテンツに使います。

<article>
    <header>
        <h2>HTMLセマンティクスの重要性</h2>
        <p><time datetime="2026-01-29">2026年1月29日</time></p>
    </header>
    <p>セマンティックHTMLを使うことで...</p>
    <footer>
        <p>著者: 田中太郎</p>
    </footer>
</article>

判断基準: そのコンテンツだけを切り出して他のページに貼っても意味が通じるなら、<article>が適切です。

<section>

テーマを持つコンテンツのグループです。

<section>
    <h2>最新ニュース</h2>
    <article>...</article>
    <article>...</article>
</section>

<section>
    <h2>イベント情報</h2>
    <p>来月のイベント一覧...</p>
</section>

<aside>

メインコンテンツに関連するが、独立したコンテンツです。

<aside>
    <h3>関連記事</h3>
    <ul>
        <li><a href="/post1">CSSの基本</a></li>
        <li><a href="/post2">JavaScriptの基本</a></li>
    </ul>
</aside>

article / section / div の使い分け

flowchart TB
    Q1{"独立して<br>意味が通じる?"}
    Q2{"テーマがある?"}
    Q3["&lt;div&gt;<br>汎用コンテナ"]
    A["&lt;article&gt;"]
    S["&lt;section&gt;"]
    Q1 -->|"はい"| A
    Q1 -->|"いいえ"| Q2
    Q2 -->|"はい"| S
    Q2 -->|"いいえ"| Q3
    style A fill:#22c55e,color:#fff
    style S fill:#3b82f6,color:#fff
    style Q3 fill:#f59e0b,color:#fff

時間と日付

<time> 要素

<p>投稿日: <time datetime="2026-01-29">2026年1月29日</time></p>
<p>会議: <time datetime="2026-02-01T14:00">2月1日 14:00</time></p>
<p>期間: <time datetime="PT2H30M">2時間30分</time></p>
datetime形式 意味
YYYY-MM-DD 2026-01-29 日付
HH:MM 14:00 時刻
YYYY-MM-DDTHH:MM 2026-01-29T14:00 日時
PTXHXM PT2H30M 期間

<details><summary>

折りたたみ可能なコンテンツを作成できます。JavaScriptなしで実現できます。

<details>
    <summary>よくある質問: HTMLとは?</summary>
    <p>HTML(HyperText Markup Language)は、
    Webページの構造を定義するマークアップ言語です。</p>
</details>

<details open>
    <summary>最初から開いた状態</summary>
    <p>open属性をつけると、初期状態で開きます。</p>
</details>

<dialog> 要素

モーダルダイアログを作成するための要素です。

<dialog id="myDialog">
    <h2>確認</h2>
    <p>本当に削除しますか?</p>
    <form method="dialog">
        <button value="cancel">キャンセル</button>
        <button value="confirm">削除する</button>
    </form>
</dialog>

アクセシビリティの基本

ARIA属性

ARIA(Accessible Rich Internet Applications)属性で、要素の役割を補足できます。

<nav aria-label="メインメニュー">...</nav>
<button aria-expanded="false">メニューを開く</button>
<div role="alert">エラーが発生しました。</div>
属性 用途
aria-label 要素の説明テキスト
aria-expanded 展開状態
aria-hidden 支援技術から隠す
role 要素の役割を指定

原則: まず適切なHTML要素を使い、それだけでは不十分な場合にのみARIA属性を追加します(「No ARIA is better than bad ARIA」)。


実践: ブログサイトのトップページ

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>My Tech Blog</title>
</head>
<body>
    <header>
        <h1>My Tech Blog</h1>
        <nav aria-label="メインナビゲーション">
            <ul>
                <li><a href="/">ホーム</a></li>
                <li><a href="/blog">ブログ</a></li>
                <li><a href="/about">著者について</a></li>
            </ul>
        </nav>
    </header>

    <main>
        <section>
            <h2>最新記事</h2>

            <article>
                <header>
                    <h3><a href="/blog/semantic-html">セマンティックHTMLの重要性</a></h3>
                    <p><time datetime="2026-01-29">2026年1月29日</time></p>
                </header>
                <p>セマンティックHTMLを使うことで、アクセシビリティとSEOの両方が向上します...</p>
                <footer>
                    <p>タグ: HTML, アクセシビリティ</p>
                </footer>
            </article>

            <article>
                <header>
                    <h3><a href="/blog/css-grid">CSS Gridで作るレイアウト</a></h3>
                    <p><time datetime="2026-01-28">2026年1月28日</time></p>
                </header>
                <p>CSS Gridを使えば、複雑なレイアウトも簡単に実現できます...</p>
                <footer>
                    <p>タグ: CSS, レイアウト</p>
                </footer>
            </article>
        </section>

        <aside>
            <h2>プロフィール</h2>
            <p>Web技術について学んだことを共有しています。</p>

            <h2>カテゴリ</h2>
            <ul>
                <li><a href="/tag/html">HTML</a></li>
                <li><a href="/tag/css">CSS</a></li>
                <li><a href="/tag/javascript">JavaScript</a></li>
            </ul>
        </aside>
    </main>

    <footer>
        <p>&copy; 2026 My Tech Blog. All rights reserved.</p>
        <nav aria-label="フッターナビゲーション">
            <a href="/privacy">プライバシーポリシー</a> |
            <a href="/terms">利用規約</a>
        </nav>
    </footer>
</body>
</html>

まとめ

要素 用途
<header> ヘッダー領域
<nav> ナビゲーション
<main> メインコンテンツ(1つだけ)
<article> 独立したコンテンツ
<section> テーマを持つグループ
<aside> 補足コンテンツ
<footer> フッター領域
<time> 日時情報
<details> / <summary> 折りたたみコンテンツ

重要ポイント

  1. <div>の代わりにセマンティック要素を使う
  2. <main>1ページに1つだけ
  3. <article>独立して意味が通じるかで判断
  4. ARIA属性は最後の手段として使う

練習問題

問題1: 基本

<header>, <main>, <footer>を使って、基本的なページ構造を作成してください。

問題2: 応用

ブログサイトのトップページを作成してください。3つ以上の<article><aside>を含めましょう。

チャレンジ問題

FAQページを<details><summary>で作成してください。5つ以上の質問と回答を含め、適切なセマンティック要素でマークアップしましょう。


参考リンク


次回予告: Day 9では「HTMLのベストプラクティス」について学びます。SEO、パフォーマンス、メタデータなど、実践的なテクニックを習得しましょう。