Skip to Content
Lecture第3回:HTML応用とセマンティクス

第3回:HTML応用とセマンティクス

🎯 学習目標

  • セマンティックHTMLの重要性を理解する
  • 構造的で意味のあるマークアップができる
  • フォームとテーブルを正しく実装できる
  • アクセシビリティを考慮したHTMLを書ける

📚 導入(5分)

前回課題の発表とフィードバック

前回作成した自己紹介ページを確認しましょう:

  • 適切な見出し階層になっているか
  • リストは正しく使い分けられているか
  • alt属性は適切に設定されているか

セマンティクスの概念紹介

セマンティック(semantic) = 「意味論的な」

<!-- ❌ 非セマンティック(意味が不明確) --> <div class="header"> <div class="nav">...</div> </div> <!-- ✅ セマンティック(意味が明確) --> <header> <nav>...</nav> </header>

💡 理論学習(30分)

セマンティックHTML(20分)

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

1. SEO(検索エンジン最適化)

検索エンジンがページの構造と内容を正確に理解:

<!-- 検索エンジンが記事として認識 --> <article> <h1>記事タイトル</h1> <time datetime="2024-01-15">2024年1月15日</time> <p>記事の内容...</p> </article>
2. アクセシビリティ(音声読み上げ)

スクリーンリーダーが適切にナビゲート:

<!-- スクリーンリーダーが「ナビゲーション」として認識 --> <nav aria-label="メインメニュー"> <ul> <li><a href="/">ホーム</a></li> <li><a href="/about">私について</a></li> </ul> </nav>
3. 保守性の向上

コードが自己文書化される:

<!-- 役割が一目瞭然 --> <main> <section id="profile">...</section> <section id="skills">...</section> <aside>広告</aside> </main>

主要セマンティック要素

header:ページ/セクションのヘッダー
<!-- ページ全体のヘッダー --> <header> <h1>サイトタイトル</h1> <nav> <ul> <li><a href="/">ホーム</a></li> <li><a href="/about">概要</a></li> </ul> </nav> </header> <!-- 記事のヘッダー --> <article> <header> <h2>記事タイトル</h2> <p>投稿日:<time>2024-01-15</time></p> </header> <p>記事本文...</p> </article>
<!-- メインナビゲーション --> <nav aria-label="メインメニュー"> <ul> <li><a href="/">ホーム</a></li> <li><a href="/products">製品</a></li> <li><a href="/contact">お問い合わせ</a></li> </ul> </nav> <!-- パンくずリスト --> <nav aria-label="パンくずリスト"> <ol> <li><a href="/">ホーム</a></li> <li><a href="/products">製品</a></li> <li>製品詳細</li> </ol> </nav>
main:メインコンテンツ
<body> <header>...</header> <!-- ページのメインコンテンツ(1ページに1つだけ) --> <main> <h1>ページのメインタイトル</h1> <p>メインコンテンツ...</p> </main> <footer>...</footer> </body>
section:テーマ別セクション
<main> <!-- 関連するコンテンツのグループ --> <section> <h2>私について</h2> <p>自己紹介...</p> </section> <section> <h2>スキル</h2> <ul> <li>HTML</li> <li>CSS</li> </ul> </section> </main>
article:独立した記事
<!-- ブログ記事 --> <article> <header> <h2>HTMLセマンティクスの重要性</h2> <p>著者:山田太郎</p> <time datetime="2024-01-15">2024年1月15日</time> </header> <p>記事の内容...</p> <footer> <p>カテゴリ:Web開発</p> </footer> </article>
aside:補足情報
<main> <article> <h1>メイン記事</h1> <p>記事内容...</p> </article> <!-- サイドバー --> <aside> <h2>関連記事</h2> <ul> <li><a href="#">関連記事1</a></li> <li><a href="#">関連記事2</a></li> </ul> </aside> </main>
footer:ページ/セクションのフッター
<!-- ページフッター --> <footer> <nav> <ul> <li><a href="/privacy">プライバシーポリシー</a></li> <li><a href="/terms">利用規約</a></li> </ul> </nav> <p>&copy; 2024 会社名. All rights reserved.</p> </footer>

フォームとテーブル(10分)

フォーム要素の基本

form:データ送信の枠組み
<form action="/submit" method="POST"> <!-- フォーム要素 --> </form>
input:様々な入力タイプ
<!-- テキスト入力 --> <label for="name">名前:</label> <input type="text" id="name" name="name" required> <!-- メールアドレス --> <label for="email">メール:</label> <input type="email" id="email" name="email" required> <!-- パスワード --> <label for="password">パスワード:</label> <input type="password" id="password" name="password" minlength="8"> <!-- 数値 --> <label for="age">年齢:</label> <input type="number" id="age" name="age" min="0" max="120"> <!-- 日付 --> <label for="birthday">誕生日:</label> <input type="date" id="birthday" name="birthday"> <!-- チェックボックス --> <label> <input type="checkbox" name="agree" value="yes"> 利用規約に同意する </label> <!-- ラジオボタン --> <fieldset> <legend>性別:</legend> <label> <input type="radio" name="gender" value="male"> 男性 </label> <label> <input type="radio" name="gender" value="female"> 女性 </label> <label> <input type="radio" name="gender" value="other"> その他 </label> </fieldset>
textarea:複数行テキスト
<label for="message">メッセージ:</label> <textarea id="message" name="message" rows="5" cols="30"> デフォルトテキスト </textarea>
select/option:選択肢
<label for="prefecture">都道府県:</label> <select id="prefecture" name="prefecture"> <option value="">選択してください</option> <option value="tokyo">東京都</option> <option value="osaka">大阪府</option> <option value="kyoto">京都府</option> </select>
button:送信ボタン
<!-- 送信ボタン --> <button type="submit">送信</button> <!-- リセットボタン --> <button type="reset">リセット</button> <!-- 通常のボタン(JavaScriptで使用) --> <button type="button" onclick="alert('クリックされました')"> クリック </button>

テーブルの構造

<table> <!-- テーブルのキャプション --> <caption>2024年売上データ</caption> <!-- ヘッダー部 --> <thead> <tr> <th scope="col">月</th> <th scope="col">売上</th> <th scope="col">前年比</th> </tr> </thead> <!-- ボディ部 --> <tbody> <tr> <th scope="row">1月</th> <td>100万円</td> <td>+10%</td> </tr> <tr> <th scope="row">2月</th> <td>120万円</td> <td>+15%</td> </tr> </tbody> <!-- フッター部 --> <tfoot> <tr> <th scope="row">合計</th> <td>220万円</td> <td>+12.5%</td> </tr> </tfoot> </table>

🛠️ 実習(50分)

前回の自己紹介ページのブラッシュアップ(45分)

セマンティックHTMLを使った構造化

<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="description" content="Web制作を学んでいる山田太郎のポートフォリオサイト"> <title>山田太郎 - ポートフォリオ</title> </head> <body> <!-- ページヘッダー --> <header> <h1>山田太郎のポートフォリオ</h1> <nav aria-label="メインナビゲーション"> <ul> <li><a href="#about">私について</a></li> <li><a href="#skills">スキル</a></li> <li><a href="#works">作品</a></li> <li><a href="#contact">お問い合わせ</a></li> </ul> </nav> </header> <!-- メインコンテンツ --> <main> <!-- 自己紹介セクション --> <section id="about"> <h2>私について</h2> <article> <header> <h3>プロフィール</h3> <img src="https://via.placeholder.com/200" alt="山田太郎のプロフィール写真"> </header> <p> はじめまして、<strong>山田太郎</strong>です。 Web制作の勉強を始めて3ヶ月になります。 </p> <dl> <dt>職業</dt> <dd>Webデザイナー志望</dd> <dt>出身地</dt> <dd>東京都渋谷区</dd> <dt>趣味</dt> <dd>プログラミング、読書、映画鑑賞</dd> </dl> </article> </section> <!-- スキルセクション --> <section id="skills"> <h2>スキル</h2> <table> <caption>技術スキル一覧</caption> <thead> <tr> <th scope="col">技術</th> <th scope="col">レベル</th> <th scope="col">経験</th> </tr> </thead> <tbody> <tr> <th scope="row">HTML</th> <td>中級</td> <td>3ヶ月</td> </tr> <tr> <th scope="row">CSS</th> <td>初級</td> <td>2ヶ月</td> </tr> <tr> <th scope="row">JavaScript</th> <td>初級</td> <td>1ヶ月</td> </tr> </tbody> </table> </section> <!-- 作品セクション --> <section id="works"> <h2>作品</h2> <article> <h3>自己紹介サイト</h3> <time datetime="2024-01-15">2024年1月15日</time> <p>HTML5とセマンティックマークアップを使用した自己紹介サイト</p> <a href="#">詳細を見る</a> </article> <article> <h3>企業サイト(模写)</h3> <time datetime="2024-01-10">2024年1月10日</time> <p>実際の企業サイトを模写して作成</p> <a href="#">詳細を見る</a> </article> </section> <!-- お問い合わせセクション --> <section id="contact"> <h2>お問い合わせ</h2> <form action="/submit" method="POST"> <fieldset> <legend>基本情報</legend> <div> <label for="contact-name"> お名前 <span aria-label="必須">*</span> </label> <input type="text" id="contact-name" name="name" required aria-required="true" > </div> <div> <label for="contact-email"> メールアドレス <span aria-label="必須">*</span> </label> <input type="email" id="contact-email" name="email" required aria-required="true" placeholder="example@email.com" > </div> <div> <label for="contact-tel"> 電話番号 </label> <input type="tel" id="contact-tel" name="tel" pattern="[0-9]{3}-[0-9]{4}-[0-9]{4}" placeholder="090-1234-5678" > </div> </fieldset> <fieldset> <legend>お問い合わせ内容</legend> <div> <label for="contact-type"> お問い合わせ種別 </label> <select id="contact-type" name="type"> <option value="">選択してください</option> <option value="work">お仕事の依頼</option> <option value="question">質問</option> <option value="other">その他</option> </select> </div> <div> <label for="contact-message"> メッセージ <span aria-label="必須">*</span> </label> <textarea id="contact-message" name="message" rows="5" required aria-required="true" ></textarea> </div> </fieldset> <div> <label> <input type="checkbox" name="privacy" required> <a href="/privacy">プライバシーポリシー</a>に同意する </label> </div> <div> <button type="submit">送信する</button> <button type="reset">リセット</button> </div> </form> </section> <!-- 補足情報 --> <aside> <h2>最新のお知らせ</h2> <ul> <li> <time datetime="2024-01-15">2024/01/15</time> ポートフォリオサイトを更新しました </li> <li> <time datetime="2024-01-10">2024/01/10</time> 新しい作品を追加しました </li> </ul> </aside> </main> <!-- ページフッター --> <footer> <nav aria-label="フッターナビゲーション"> <ul> <li><a href="/privacy">プライバシーポリシー</a></li> <li><a href="/sitemap">サイトマップ</a></li> </ul> </nav> <address> 連絡先: <a href="mailto:taro@example.com">taro@example.com</a> </address> <p> <small>&copy; 2024 山田太郎. All rights reserved.</small> </p> </footer> </body> </html>

アクセシビリティの考慮点

ARIA属性の活用

<!-- ランドマークの明確化 --> <nav aria-label="メインメニュー"> <nav aria-label="パンくずリスト"> <nav aria-label="フッターメニュー"> <!-- 必須項目の明示 --> <input required aria-required="true"> <span aria-label="必須">*</span> <!-- 現在のページを示す --> <a href="/home" aria-current="page">ホーム</a> <!-- 説明の関連付け --> <input aria-describedby="password-help"> <small id="password-help">8文字以上で入力してください</small>

スキップリンク

<!-- ページの最初に配置(通常は非表示) --> <a href="#main" class="skip-link">メインコンテンツへスキップ</a> <main id="main"> <!-- メインコンテンツ --> </main>

📝 まとめ・質疑応答(5分)

セマンティックHTMLの利点確認

✅ チェックリスト

  • 適切なセマンティック要素を使用している
  • フォームにラベルが正しく関連付けられている
  • テーブルに適切なヘッダーが設定されている
  • ARIA属性で補足情報を提供している
  • 文書構造が論理的である

次回予告:CSSでのスタイリング

次回から本格的にCSSを学習します:

  • CSSの基本構文
  • セレクターの種類と詳細度
  • 色、フォント、サイズの指定
  • ボックスモデルの理解

🏠 宿題

  1. セマンティックHTMLで企業サイトのトップページを作成

    • header, nav, main, section, article, aside, footerをすべて使用
    • お問い合わせフォームを含める
    • テーブルで料金表を作成
  2. アクセシビリティチェック

    • WAVE でアクセシビリティをチェック
    • スクリーンリーダーで読み上げテスト(可能であれば)
  3. 構造化データの追加(発展)

    <script type="application/ld+json"> { "@context": "https://schema.org", "@type": "Person", "name": "山田太郎", "jobTitle": "Webデザイナー" } </script>

📚 参考リソース


次回もお楽しみに! 🚀

Last updated on