【第2回】HTML解説 フォームとテーブルをマスターしよう【2025年最新版】

前回の「HTML入門ガイド」では、HTMLの基本構造やよく使うタグについて学びました。今回は、Webサイトに欠かせない**フォーム(入力欄)テーブル(表)**の作り方を実践的に解説します。

お問い合わせフォームや会員登録、データ表示など、実務で必ず使う重要な知識が身につきます。


この記事で学べること

  • フォームの基本構造と各種入力要素
  • 実践的なお問い合わせフォームの作成
  • テーブル(表)の作成と装飾方法
  • フォームとテーブルのアクセシビリティ対応
  • HTML5で追加された便利な機能
  • 実務で使えるテクニックとベストプラクティス

前提知識第1回 HTML解説を読んでいることを推奨します。


1. HTMLフォームの基礎知識

フォームとは?

フォームは、ユーザーがWebページ上でデータを入力し、サーバーに送信するための仕組みです。以下のような場面で使われます:

  • お問い合わせフォーム
  • 会員登録・ログイン画面
  • 検索ボックス
  • アンケートや投票
  • 商品購入(決済フォーム)
  • ファイルアップロード

フォームの基本構造

フォームは<form>タグで囲み、その中に各種入力要素を配置します。

html

&lt;form action="submit.php" method="post">
  &lt;!-- ここに入力要素を配置 -->
  &lt;label for="name">お名前:&lt;/label>
  &lt;input type="text" id="name" name="name">
  
  &lt;button type="submit">送信&lt;/button>
&lt;/form>

<form>タグの主要属性

action属性 フォームデータを送信する先のURL(サーバー側のプログラム)を指定します。

html

&lt;form action="/contact/send.php" method="post">

method属性 データの送信方法を指定します。主に2つの方法があります:

  • GET - URLにデータを付加して送信(検索フォームなど)
  • POST - データを見えない形で送信(個人情報など)

html

&lt;!-- 検索フォーム(GETが適切) -->
&lt;form action="/search" method="get">
  &lt;input type="text" name="q" placeholder="検索キーワード">
  &lt;button type="submit">検索&lt;/button>
&lt;/form>

&lt;!-- お問い合わせフォーム(POSTが適切) -->
&lt;form action="/contact" method="post">
  &lt;input type="email" name="email" placeholder="メールアドレス">
  &lt;button type="submit">送信&lt;/button>
&lt;/form>

enctype属性 ファイルをアップロードする場合に必須です。

html

&lt;form action="/upload" method="post" enctype="multipart/form-data">
  &lt;input type="file" name="file">
  &lt;button type="submit">アップロード&lt;/button>
&lt;/form>

2. 基本的な入力要素(input要素)

<input>タグは、フォームで最も頻繁に使われる要素です。type属性の値によって、様々な種類の入力欄を作成できます。

テキスト入力(type="text")

最も基本的な一行テキスト入力欄です。

html

&lt;label for="username">ユーザー名:&lt;/label>
&lt;input type="text" id="username" name="username" placeholder="例: taro_yamada" required>

主要な属性

  • id - label要素と関連付けるための一意のID
  • name - サーバーに送信される際のキー名
  • placeholder - 入力例を薄く表示
  • required - 必須入力項目にする
  • maxlength - 最大文字数を制限
  • minlength - 最小文字数を設定
  • readonly - 読み取り専用(編集不可)
  • disabled - 無効化(グレーアウト)

html

&lt;input type="text" 
       id="postcode" 
       name="postcode" 
       placeholder="123-4567"
       maxlength="8"
       required>

パスワード入力(type="password")

入力内容が「●●●」で隠されるパスワード専用の入力欄です。

html

&lt;label for="password">パスワード:&lt;/label>
&lt;input type="password" 
       id="password" 
       name="password" 
       minlength="8"
       required>

メールアドレス入力(type="email")

メールアドレス形式の検証が自動で行われます。スマートフォンでは、メール入力用のキーボードが表示されます。

html

&lt;label for="email">メールアドレス:&lt;/label>
&lt;input type="email" 
       id="email" 
       name="email" 
       placeholder="example@email.com"
       required>

電話番号入力(type="tel")

スマートフォンで電話番号用のキーボードが表示されます。

html

&lt;label for="phone">電話番号:&lt;/label>
&lt;input type="tel" 
       id="phone" 
       name="phone" 
       placeholder="090-1234-5678"
       pattern="[0-9]{2,4}-[0-9]{2,4}-[0-9]{3,4}">

pattern属性: 正規表現で入力パターンを制限できます。

数値入力(type="number")

数値のみを入力できます。上下ボタンで値を増減できます。

html

&lt;label for="age">年齢:&lt;/label>
&lt;input type="number" 
       id="age" 
       name="age" 
       min="0" 
       max="120" 
       step="1"
       value="20">
  • min - 最小値
  • max - 最大値
  • step - 増減の刻み幅
  • value - 初期値

日付・時刻入力

HTML5で追加された便利な入力タイプです。

html

&lt;!-- 日付 -->
&lt;label for="birthday">生年月日:&lt;/label>
&lt;input type="date" id="birthday" name="birthday" min="1900-01-01" max="2025-12-31">

&lt;!-- 時刻 -->
&lt;label for="meeting-time">予約時間:&lt;/label>
&lt;input type="time" id="meeting-time" name="meeting-time" min="09:00" max="18:00">

&lt;!-- 日時 -->
&lt;label for="appointment">予約日時:&lt;/label>
&lt;input type="datetime-local" id="appointment" name="appointment">

&lt;!-- 月 -->
&lt;label for="card-expiry">有効期限:&lt;/label>
&lt;input type="month" id="card-expiry" name="card-expiry">

&lt;!-- 週 -->
&lt;label for="week">週:&lt;/label>
&lt;input type="week" id="week" name="week">

URL入力(type="url")

URL形式の検証が自動で行われます。

html

&lt;label for="website">Webサイト:&lt;/label>
&lt;input type="url" 
       id="website" 
       name="website" 
       placeholder="https://example.com">

色選択(type="color")

カラーピッカーが表示され、色を選択できます。

html

&lt;label for="favorite-color">好きな色:&lt;/label>
&lt;input type="color" id="favorite-color" name="favorite-color" value="#3498db">

範囲選択(type="range")

スライダーで数値を選択できます。

html

&lt;label for="volume">音量:&lt;/label>
&lt;input type="range" 
       id="volume" 
       name="volume" 
       min="0" 
       max="100" 
       value="50"
       step="5">
&lt;output id="volume-output">50&lt;/output>

ファイル選択(type="file")

ファイルをアップロードできます。

html

&lt;label for="profile-image">プロフィール画像:&lt;/label>
&lt;input type="file" 
       id="profile-image" 
       name="profile-image" 
       accept="image/png, image/jpeg"
       multiple>
  • accept - 許可するファイル形式を指定
  • multiple - 複数ファイルの選択を許可

検索ボックス(type="search")

検索用の入力欄です。入力中に「×」ボタンが表示されます。

html

&lt;label for="search">サイト内検索:&lt;/label>
&lt;input type="search" 
       id="search" 
       name="search" 
       placeholder="キーワードを入力">

3. 選択式の入力要素

チェックボックス(type="checkbox")

複数の選択肢から、複数選択できます。

html

&lt;fieldset>
  &lt;legend>興味のある分野(複数選択可):&lt;/legend>
  
  &lt;input type="checkbox" id="web" name="interests" value="web">
  &lt;label for="web">Web制作&lt;/label>
  
  &lt;input type="checkbox" id="design" name="interests" value="design">
  &lt;label for="design">デザイン&lt;/label>
  
  &lt;input type="checkbox" id="programming" name="interests" value="programming" checked>
  &lt;label for="programming">プログラミング&lt;/label>
  
  &lt;input type="checkbox" id="marketing" name="interests" value="marketing">
  &lt;label for="marketing">マーケティング&lt;/label>
&lt;/fieldset>

checked属性: 初期状態で選択済みにします。

ラジオボタン(type="radio")

複数の選択肢から、1つだけ選択できます。同じname属性を持つラジオボタンがグループ化されます。

html

&lt;fieldset>
  &lt;legend>性別:&lt;/legend>
  
  &lt;input type="radio" id="male" name="gender" value="male" checked>
  &lt;label for="male">男性&lt;/label>
  
  &lt;input type="radio" id="female" name="gender" value="female">
  &lt;label for="female">女性&lt;/label>
  
  &lt;input type="radio" id="other" name="gender" value="other">
  &lt;label for="other">その他&lt;/label>
  
  &lt;input type="radio" id="no-answer" name="gender" value="no-answer">
  &lt;label for="no-answer">回答しない&lt;/label>
&lt;/fieldset>

セレクトボックス(select要素)

ドロップダウンメニューで選択肢を表示します。

html

&lt;label for="prefecture">都道府県:&lt;/label>
&lt;select id="prefecture" name="prefecture" required>
  &lt;option value="">選択してください&lt;/option>
  &lt;option value="tokyo">東京都&lt;/option>
  &lt;option value="osaka">大阪府&lt;/option>
  &lt;option value="aichi">愛知県&lt;/option>
  &lt;option value="fukuoka">福岡県&lt;/option>
&lt;/select>

選択肢のグループ化(optgroup)

html

&lt;label for="area">地域:&lt;/label>
&lt;select id="area" name="area">
  &lt;option value="">選択してください&lt;/option>
  
  &lt;optgroup label="関東">
    &lt;option value="tokyo">東京都&lt;/option>
    &lt;option value="kanagawa">神奈川県&lt;/option>
    &lt;option value="chiba">千葉県&lt;/option>
  &lt;/optgroup>
  
  &lt;optgroup label="関西">
    &lt;option value="osaka">大阪府&lt;/option>
    &lt;option value="kyoto">京都府&lt;/option>
    &lt;option value="hyogo">兵庫県&lt;/option>
  &lt;/optgroup>
&lt;/select>

複数選択可能なセレクトボックス

html

&lt;label for="languages">使用できる言語(Ctrlキーで複数選択):&lt;/label>
&lt;select id="languages" name="languages" multiple size="5">
  &lt;option value="html">HTML&lt;/option>
  &lt;option value="css">CSS&lt;/option>
  &lt;option value="javascript">JavaScript&lt;/option>
  &lt;option value="php">PHP&lt;/option>
  &lt;option value="python">Python&lt;/option>
&lt;/select>

4. テキストエリアとボタン

複数行テキストエリア(textarea)

複数行のテキストを入力できます。

html

&lt;label for="message">お問い合わせ内容:&lt;/label>
&lt;textarea id="message" 
          name="message" 
          rows="5" 
          cols="50"
          placeholder="お問い合わせ内容をご記入ください"
          maxlength="1000"
          required>&lt;/textarea>
  • rows - 表示行数
  • cols - 表示列数(文字数)
  • maxlength - 最大文字数

ボタン要素

送信ボタン(type="submit")

フォームを送信します。

html

&lt;button type="submit">送信する&lt;/button>

&lt;!-- input要素でも作成可能 -->
&lt;input type="submit" value="送信する">

リセットボタン(type="reset")

フォームの入力内容をすべてクリアします。

html

&lt;button type="reset">入力内容をクリア&lt;/button>

注意: ユーザーが誤ってクリックするとデータが消えるため、使用は慎重に。

通常のボタン(type="button")

JavaScriptで処理を実行するために使います。

html

&lt;button type="button" onclick="checkForm()">入力内容を確認&lt;/button>

5. フォームのグループ化とラベル

fieldset と legend

関連する入力項目をグループ化します。

html

&lt;form>
  &lt;fieldset>
    &lt;legend>基本情報&lt;/legend>
    
    &lt;label for="name">お名前:&lt;/label>
    &lt;input type="text" id="name" name="name" required>
    
    &lt;label for="email">メールアドレス:&lt;/label>
    &lt;input type="email" id="email" name="email" required>
  &lt;/fieldset>
  
  &lt;fieldset>
    &lt;legend>配送先住所&lt;/legend>
    
    &lt;label for="postcode">郵便番号:&lt;/label>
    &lt;input type="text" id="postcode" name="postcode">
    
    &lt;label for="address">住所:&lt;/label>
    &lt;input type="text" id="address" name="address">
  &lt;/fieldset>
  
  &lt;button type="submit">送信&lt;/button>
&lt;/form>

label要素の重要性

<label>要素は、入力欄と説明文を関連付けます。これにより:

  1. アクセシビリティ向上 - スクリーンリーダーが正しく読み上げる
  2. クリック範囲拡大 - ラベルをクリックしても入力欄にフォーカス
  3. SEO効果 - 検索エンジンがフォームの内容を理解しやすい

labelの2つの書き方

方法1: for属性を使う(推奨)

html

&lt;label for="username">ユーザー名:&lt;/label>
&lt;input type="text" id="username" name="username">

方法2: 囲む形式

html

&lt;label>
  ユーザー名:
  &lt;input type="text" name="username">
&lt;/label>

6. 実践:お問い合わせフォームを作ろう

ここまで学んだ知識を使って、実践的なお問い合わせフォームを作成します。

html

&lt;!DOCTYPE html>
&lt;html lang="ja">
&lt;head>
  &lt;meta charset="UTF-8">
  &lt;meta name="viewport" content="width=device-width, initial-scale=1.0">
  &lt;title>お問い合わせフォーム&lt;/title>
&lt;/head>
&lt;body>
  &lt;h1>お問い合わせフォーム&lt;/h1>
  
  &lt;form action="/contact/submit" method="post">
    &lt;!-- 基本情報 -->
    &lt;fieldset>
      &lt;legend>基本情報&lt;/legend>
      
      &lt;div>
        &lt;label for="name">お名前 &lt;span style="color: red;">*&lt;/span>&lt;/label>
        &lt;input type="text" 
               id="name" 
               name="name" 
               placeholder="山田 太郎"
               required
               autocomplete="name">
      &lt;/div>
      
      &lt;div>
        &lt;label for="email">メールアドレス &lt;span style="color: red;">*&lt;/span>&lt;/label>
        &lt;input type="email" 
               id="email" 
               name="email" 
               placeholder="example@email.com"
               required
               autocomplete="email">
      &lt;/div>
      
      &lt;div>
        &lt;label for="phone">電話番号(任意)&lt;/label>
        &lt;input type="tel" 
               id="phone" 
               name="phone" 
               placeholder="090-1234-5678"
               pattern="[0-9]{2,4}-[0-9]{2,4}-[0-9]{3,4}"
               autocomplete="tel">
      &lt;/div>
    &lt;/fieldset>
    
    &lt;!-- お問い合わせ内容 -->
    &lt;fieldset>
      &lt;legend>お問い合わせ内容&lt;/legend>
      
      &lt;div>
        &lt;label for="category">お問い合わせ種別 &lt;span style="color: red;">*&lt;/span>&lt;/label>
        &lt;select id="category" name="category" required>
          &lt;option value="">選択してください&lt;/option>
          &lt;option value="product">製品について&lt;/option>
          &lt;option value="service">サービスについて&lt;/option>
          &lt;option value="support">サポートについて&lt;/option>
          &lt;option value="other">その他&lt;/option>
        &lt;/select>
      &lt;/div>
      
      &lt;div>
        &lt;label for="subject">件名 &lt;span style="color: red;">*&lt;/span>&lt;/label>
        &lt;input type="text" 
               id="subject" 
               name="subject" 
               placeholder="お問い合わせの件名"
               required>
      &lt;/div>
      
      &lt;div>
        &lt;label for="message">お問い合わせ内容 &lt;span style="color: red;">*&lt;/span>&lt;/label>
        &lt;textarea id="message" 
                  name="message" 
                  rows="8" 
                  placeholder="お問い合わせ内容を詳しくご記入ください"
                  required
                  maxlength="2000">&lt;/textarea>
        &lt;small>2000文字以内でご記入ください&lt;/small>
      &lt;/div>
    &lt;/fieldset>
    
    &lt;!-- ファイル添付 -->
    &lt;fieldset>
      &lt;legend>ファイル添付(任意)&lt;/legend>
      
      &lt;div>
        &lt;label for="attachment">ファイルを選択:&lt;/label>
        &lt;input type="file" 
               id="attachment" 
               name="attachment"
               accept=".jpg,.jpeg,.png,.pdf"
               multiple>
        &lt;small>JPG、PNG、PDFファイル(最大5MB)&lt;/small>
      &lt;/div>
    &lt;/fieldset>
    
    &lt;!-- プライバシーポリシー同意 -->
    &lt;div>
      &lt;input type="checkbox" 
             id="privacy" 
             name="privacy" 
             value="agreed"
             required>
      &lt;label for="privacy">
        &lt;a href="/privacy" target="_blank">プライバシーポリシー&lt;/a>に同意する 
        &lt;span style="color: red;">*&lt;/span>
      &lt;/label>
    &lt;/div>
    
    &lt;!-- 送信ボタン -->
    &lt;div>
      &lt;button type="submit">送信する&lt;/button>
      &lt;button type="reset">入力内容をクリア&lt;/button>
    &lt;/div>
    
    &lt;p>&lt;small>&lt;span style="color: red;">*&lt;/span> は必須項目です&lt;/small>&lt;/p>
  &lt;/form>
&lt;/body>
&lt;/html>

7. HTMLテーブル(表)の基礎

テーブルは、データを行と列で整理して表示するための要素です。

テーブルの基本構造

html

&lt;table>
  &lt;tr>
    &lt;th>見出し1&lt;/th>
    &lt;th>見出し2&lt;/th>
    &lt;th>見出し3&lt;/th>
  &lt;/tr>
  &lt;tr>
    &lt;td>データ1-1&lt;/td>
    &lt;td>データ1-2&lt;/td>
    &lt;td>データ1-3&lt;/td>
  &lt;/tr>
  &lt;tr>
    &lt;td>データ2-1&lt;/td>
    &lt;td>データ2-2&lt;/td>
    &lt;td>データ2-3&lt;/td>
  &lt;/tr>
&lt;/table>

テーブルの主要要素

  • <table> - テーブル全体を囲む
  • <tr> (table row) - 行を表す
  • <th> (table header) - 見出しセル
  • <td> (table data) - データセル

セマンティックなテーブル構造

html

&lt;table>
  &lt;!-- ヘッダー部分 -->
  &lt;thead>
    &lt;tr>
      &lt;th>商品名&lt;/th>
      &lt;th>価格&lt;/th>
      &lt;th>在庫&lt;/th>
    &lt;/tr>
  &lt;/thead>
  
  &lt;!-- ボディ部分 -->
  &lt;tbody>
    &lt;tr>
      &lt;td>ノートPC&lt;/td>
      &lt;td>¥98,000&lt;/td>
      &lt;td>在庫あり&lt;/td>
    &lt;/tr>
    &lt;tr>
      &lt;td>マウス&lt;/td>
      &lt;td>¥2,980&lt;/td>
      &lt;td>在庫あり&lt;/td>
    &lt;/tr>
    &lt;tr>
      &lt;td>キーボード&lt;/td>
      &lt;td>¥12,800&lt;/td>
      &lt;td>在庫切れ&lt;/td>
    &lt;/tr>
  &lt;/tbody>
  
  &lt;!-- フッター部分 -->
  &lt;tfoot>
    &lt;tr>
      &lt;th>合計&lt;/th>
      &lt;td colspan="2">¥113,780&lt;/td>
    &lt;/tr>
  &lt;/tfoot>
&lt;/table>
  • <thead> - テーブルヘッダー
  • <tbody> - テーブルボディ(データ部分)
  • <tfoot> - テーブルフッター(合計行など)

セルの結合

横方向の結合(colspan)

複数の列を結合します。

html

&lt;table border="1">
  &lt;tr>
    &lt;th colspan="3">2025年 売上実績&lt;/th>
  &lt;/tr>
  &lt;tr>
    &lt;th>1月&lt;/th>
    &lt;th>2月&lt;/th>
    &lt;th>3月&lt;/th>
  &lt;/tr>
  &lt;tr>
    &lt;td>¥1,000,000&lt;/td>
    &lt;td>¥1,200,000&lt;/td>
    &lt;td>¥1,500,000&lt;/td>
  &lt;/tr>
&lt;/table>

縦方向の結合(rowspan)

複数の行を結合します。

html

&lt;table border="1">
  &lt;tr>
    &lt;th rowspan="2">商品カテゴリ&lt;/th>
    &lt;th colspan="2">売上&lt;/th>
  &lt;/tr>
  &lt;tr>
    &lt;th>Q1&lt;/th>
    &lt;th>Q2&lt;/th>
  &lt;/tr>
  &lt;tr>
    &lt;td>電子機器&lt;/td>
    &lt;td>¥5,000,000&lt;/td>
    &lt;td>¥6,000,000&lt;/td>
  &lt;/tr>
  &lt;tr>
    &lt;td>家具&lt;/td>
    &lt;td>¥3,000,000&lt;/td>
    &lt;td>¥3,500,000&lt;/td>
  &lt;/tr>
&lt;/table>

キャプションの追加

テーブルにタイトルを付けます。

html

&lt;table>
  &lt;caption>2025年度 月別売上表&lt;/caption>
  &lt;thead>
    &lt;tr>
      &lt;th>月&lt;/th>
      &lt;th>売上&lt;/th>
    &lt;/tr>
  &lt;/thead>
  &lt;tbody>
    &lt;tr>
      &lt;td>1月&lt;/td>
      &lt;td>¥1,000,000&lt;/td>
    &lt;/tr>
    &lt;tr>
      &lt;td>2月&lt;/td>
      &lt;td>¥1,200,000&lt;/td>
    &lt;/tr>
  &lt;/tbody>
&lt;/table>

8. 実践:価格表を作ろう

html

&lt;table border="1" style="border-collapse: collapse; width: 100%;">
  &lt;caption>&lt;strong>料金プラン比較表&lt;/strong>&lt;/caption>
  
  &lt;thead>
    &lt;tr style="background-color: #f0f0f0;">
      &lt;th>プラン&lt;/th>
      &lt;th>月額料金&lt;/th>
      &lt;th>ストレージ容量&lt;/th>
      &lt;th>ユーザー数&lt;/th>
      &lt;th>サポート&lt;/th>
    &lt;/tr>
  &lt;/thead>
  
  &lt;tbody>
    &lt;tr>
      &lt;th scope="row">無料プラン&lt;/th>
      &lt;td style="text-align: center;">¥0&lt;/td>
      &lt;td style="text-align: center;">10GB&lt;/td>
      &lt;td style="text-align: center;">1名&lt;/td>
      &lt;td style="text-align: center;">メールのみ&lt;/td>
    &lt;/tr>
    &lt;tr style="background-color: #fffacd;">
      &lt;th scope="row">スタンダード&lt;/th>
      &lt;td style="text-align: center;">&lt;strong>¥1,980&lt;/strong>&lt;/td>
      &lt;td style="text-align: center;">100GB&lt;/td>
      &lt;td style="text-align: center;">5名&lt;/td>
      &lt;td style="text-align: center;">メール・チャット&lt;/td>
    &lt;/tr>
    &lt;tr>
      &lt;th scope="row">プレミアム&lt;/th>
      &lt;td style="text-align: center;">&lt;strong>¥4,980&lt;/strong>&lt;/td>
      &lt;td style="text-align: center;">1TB&lt;/td>
      &lt;td style="text-align: center;">無制限&lt;/td>
      &lt;td style="text-align: center;">24時間電話対応&lt;/td>
    &lt;/tr>
  &lt;/tbody>
  
  &lt;tfoot>
    &lt;tr>
      &lt;td colspan="5" style="text-align: center; background-color: #f0f0f0;">
        &lt;small>※すべて税込価格です&lt;/small>
      &lt;/td>
    &lt;/tr>
  &lt;/tfoot>
&lt;/table>

scope属性: スクリーンリーダーが見出しの範囲を正しく認識できるようにします。

  • scope="row" - 行の見出し
  • scope="col" - 列の見出し

9. フォームの高度なテクニック

HTML5のバリデーション機能

HTML5には、JavaScriptを使わずにフォーム検証できる機能が組み込まれています。

html

&lt;!-- 必須入力 -->
&lt;input type="text" name="username" required>

&lt;!-- 最小・最大文字数 -->
&lt;input type="text" name="password" minlength="8" maxlength="20">

&lt;!-- パターンマッチング(正規表現) -->
&lt;input type="text" name="zipcode" pattern="\d{3}-\d{4}" 
       title="郵便番号を123-4567の形式で入力してください">

&lt;!-- 数値の範囲指定 -->
&lt;input type="number" name="age" min="18" max="100">

&lt;!-- カスタムエラーメッセージ -->
&lt;input type="email" name="email" required 
       oninvalid="this.setCustomValidity('正しいメールアドレスを入力してください')"
       oninput="this.setCustomValidity('')">

autocomplete属性でユーザビリティ向上

ブラウザの自動入力機能を活用します。

html

&lt;form>
  &lt;input type="text" name="name" autocomplete="name">
  &lt;input type="email" name="email" autocomplete="email">
  &lt;input type="tel" name="phone" autocomplete="tel">
  &lt;input type="text" name="address" autocomplete="street-address">
  &lt;input type="text" name="postcode" autocomplete="postal-code">
  &lt;input type="text" name="country" autocomplete="country-name">
  &lt;input type="text" name="cc-number" autocomplete="cc-number">
&lt;/form>

datalist要素でサジェスト機能

入力候補を表示します。

html

&lt;label for="browser">お使いのブラウザ:&lt;/label>
&lt;input type="text" id="browser" name="browser" list="browsers">

&lt;datalist id="browsers">
  &lt;option value="Chrome">
  &lt;option value="Firefox">
  &lt;option value="Safari">
  &lt;option value="Edge">
  &lt;option value="Opera">
&lt;/datalist>

ユーザーが入力を始めると、候補がドロップダウンで表示されます。

output要素で計算結果を表示

フォームの計算結果を動的に表示します。

html

&lt;form oninput="result.value=parseInt(a.value)+parseInt(b.value)">
  &lt;label for="a">数値A:&lt;/label>
  &lt;input type="number" id="a" name="a" value="0">
  
  &lt;label for="b">数値B:&lt;/label>
  &lt;input type="number" id="b" name="b" value="0">
  
  &lt;output name="result" for="a b">0&lt;/output>
&lt;/form>

progress と meter 要素

進捗やメーター(計測値)を視覚的に表示します。

html

&lt;!-- 進捗バー -->
&lt;label for="file-upload">アップロード進捗:&lt;/label>
&lt;progress id="file-upload" value="70" max="100">70%&lt;/progress>

&lt;!-- メーター(ディスク使用量など) -->
&lt;label for="disk-usage">ディスク使用量:&lt;/label>
&lt;meter id="disk-usage" 
       min="0" 
       max="100" 
       low="33" 
       high="66" 
       optimum="20" 
       value="85">85%&lt;/meter>

10. アクセシビリティへの配慮

ARIA属性の活用

スクリーンリーダーのためのアクセシビリティを向上させます。

html

&lt;!-- エラーメッセージの関連付け -->
&lt;label for="email">メールアドレス:&lt;/label>
&lt;input type="email" 
       id="email" 
       name="email" 
       aria-describedby="email-error"
       aria-invalid="true">
&lt;span id="email-error" role="alert" style="color: red;">
  正しいメールアドレスを入力してください
&lt;/span>

&lt;!-- 必須項目の明示 -->
&lt;label for="username">
  ユーザー名 
  &lt;span aria-label="必須">*&lt;/span>
&lt;/label>
&lt;input type="text" 
       id="username" 
       name="username" 
       required
       aria-required="true">

&lt;!-- グループの説明 -->
&lt;fieldset>
  &lt;legend>配送方法&lt;/legend>
  &lt;div role="group" aria-labelledby="shipping-label">
    &lt;p id="shipping-label">配送方法を選択してください&lt;/p>
    &lt;input type="radio" id="standard" name="shipping" value="standard">
    &lt;label for="standard">通常配送(3-5営業日)&lt;/label>
    
    &lt;input type="radio" id="express" name="shipping" value="express">
    &lt;label for="express">速達配送(翌日)&lt;/label>
  &lt;/div>
&lt;/fieldset>

キーボード操作への対応

html

&lt;!-- tabindex で操作順序を制御 -->
&lt;form>
  &lt;input type="text" name="field1" tabindex="1">
  &lt;input type="text" name="field3" tabindex="3">
  &lt;input type="text" name="field2" tabindex="2">
  &lt;button type="submit" tabindex="4">送信&lt;/button>
&lt;/form>

&lt;!-- accesskey でショートカットキーを設定 -->
&lt;button type="submit" accesskey="s">送信 (Alt+S)&lt;/button>

11. レスポンシブなフォームとテーブル

モバイル対応フォーム

html

&lt;style>
  /* スマートフォンでの表示最適化 */
  @media (max-width: 768px) {
    input, select, textarea {
      width: 100%;
      font-size: 16px; /* iOSのズームを防ぐ */
    }
    
    button {
      width: 100%;
      padding: 15px;
      font-size: 18px;
    }
  }
&lt;/style>

&lt;form>
  &lt;div style="margin-bottom: 15px;">
    &lt;label for="mobile-email">メールアドレス:&lt;/label>
    &lt;input type="email" 
           id="mobile-email" 
           name="email"
           inputmode="email"
           autocomplete="email">
  &lt;/div>
  
  &lt;div style="margin-bottom: 15px;">
    &lt;label for="mobile-phone">電話番号:&lt;/label>
    &lt;input type="tel" 
           id="mobile-phone" 
           name="phone"
           inputmode="tel"
           autocomplete="tel">
  &lt;/div>
  
  &lt;button type="submit">送信&lt;/button>
&lt;/form>

inputmode属性: モバイルで表示されるキーボードタイプを指定します。

  • text - 標準キーボード
  • numeric - 数字キーボード
  • tel - 電話番号用
  • email - メール用(@を含む)
  • url - URL用(.comなど)

レスポンシブテーブル

スマートフォンで横スクロール可能なテーブル:

html

&lt;div style="overflow-x: auto;">
  &lt;table style="width: 100%; min-width: 600px;">
    &lt;thead>
      &lt;tr>
        &lt;th>商品名&lt;/th>
        &lt;th>価格&lt;/th>
        &lt;th>在庫&lt;/th>
        &lt;th>カテゴリ&lt;/th>
        &lt;th>評価&lt;/th>
      &lt;/tr>
    &lt;/thead>
    &lt;tbody>
      &lt;tr>
        &lt;td>ノートPC&lt;/td>
        &lt;td>¥98,000&lt;/td>
        &lt;td>在庫あり&lt;/td>
        &lt;td>電子機器&lt;/td>
        &lt;td>★★★★☆&lt;/td>
      &lt;/tr>
      &lt;!-- 他の行 -->
    &lt;/tbody>
  &lt;/table>
&lt;/div>

12. フォームセキュリティのベストプラクティス

CSRF対策

html

&lt;form action="/submit" method="post">
  &lt;!-- CSRFトークンを隠しフィールドで送信 -->
  &lt;input type="hidden" name="csrf_token" value="ランダムに生成されたトークン">
  
  &lt;input type="text" name="username">
  &lt;button type="submit">送信&lt;/button>
&lt;/form>

パスワードフィールドのセキュリティ

html

&lt;label for="password">パスワード:&lt;/label>
&lt;input type="password" 
       id="password" 
       name="password"
       minlength="8"
       required
       autocomplete="new-password"
       pattern="(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,}"
       title="8文字以上で、大文字、小文字、数字を含める必要があります">

機密情報の送信

html

&lt;!-- HTTPSを使用していることを確認 -->
&lt;form action="https://secure.example.com/login" method="post">
  &lt;input type="email" name="email" autocomplete="email" required>
  &lt;input type="password" name="password" autocomplete="current-password" required>
  &lt;button type="submit">ログイン&lt;/button>
&lt;/form>

13. 実践的なテーブル例

データテーブル(ソート可能な前提)

html

&lt;table id="data-table">
  &lt;caption>社員名簿&lt;/caption>
  &lt;thead>
    &lt;tr>
      &lt;th scope="col">
        &lt;button type="button" aria-label="社員IDでソート">社員ID&lt;/button>
      &lt;/th>
      &lt;th scope="col">
        &lt;button type="button" aria-label="氏名でソート">氏名&lt;/button>
      &lt;/th>
      &lt;th scope="col">
        &lt;button type="button" aria-label="部署でソート">部署&lt;/button>
      &lt;/th>
      &lt;th scope="col">
        &lt;button type="button" aria-label="入社日でソート">入社日&lt;/button>
      &lt;/th>
      &lt;th scope="col">メールアドレス&lt;/th>
    &lt;/tr>
  &lt;/thead>
  &lt;tbody>
    &lt;tr>
      &lt;td>E001&lt;/td>
      &lt;td>山田 太郎&lt;/td>
      &lt;td>営業部&lt;/td>
      &lt;td>2020-04-01&lt;/td>
      &lt;td>&lt;a href="mailto:yamada@example.com">yamada@example.com&lt;/a>&lt;/td>
    &lt;/tr>
    &lt;tr>
      &lt;td>E002&lt;/td>
      &lt;td>佐藤 花子&lt;/td>
      &lt;td>開発部&lt;/td>
      &lt;td>2021-07-15&lt;/td>
      &lt;td>&lt;a href="mailto:sato@example.com">sato@example.com&lt;/a>&lt;/td>
    &lt;/tr>
    &lt;tr>
      &lt;td>E003&lt;/td>
      &lt;td>鈴木 一郎&lt;/td>
      &lt;td>総務部&lt;/td>
      &lt;td>2019-10-01&lt;/td>
      &lt;td>&lt;a href="mailto:suzuki@example.com">suzuki@example.com&lt;/a>&lt;/td>
    &lt;/tr>
  &lt;/tbody>
&lt;/table>

スケジュール表

html

&lt;table border="1" style="border-collapse: collapse; width: 100%;">
  &lt;caption>週間スケジュール&lt;/caption>
  &lt;thead>
    &lt;tr>
      &lt;th scope="col">時間&lt;/th>
      &lt;th scope="col">月曜日&lt;/th>
      &lt;th scope="col">火曜日&lt;/th>
      &lt;th scope="col">水曜日&lt;/th>
      &lt;th scope="col">木曜日&lt;/th>
      &lt;th scope="col">金曜日&lt;/th>
    &lt;/tr>
  &lt;/thead>
  &lt;tbody>
    &lt;tr>
      &lt;th scope="row">9:00-10:00&lt;/th>
      &lt;td>チームミーティング&lt;/td>
      &lt;td>プロジェクト作業&lt;/td>
      &lt;td>プロジェクト作業&lt;/td>
      &lt;td>プロジェクト作業&lt;/td>
      &lt;td>週次報告会&lt;/td>
    &lt;/tr>
    &lt;tr>
      &lt;th scope="row">10:00-12:00&lt;/th>
      &lt;td colspan="4" style="background-color: #e8f5e9;">開発作業&lt;/td>
      &lt;td rowspan="2" style="background-color: #fff3e0;">クライアント打ち合わせ&lt;/td>
    &lt;/tr>
    &lt;tr>
      &lt;th scope="row">13:00-15:00&lt;/th>
      &lt;td colspan="2">コードレビュー&lt;/td>
      &lt;td colspan="2">テスト作業&lt;/td>
    &lt;/tr>
    &lt;tr>
      &lt;th scope="row">15:00-17:00&lt;/th>
      &lt;td>ドキュメント作成&lt;/td>
      &lt;td>バグ修正&lt;/td>
      &lt;td>新機能開発&lt;/td>
      &lt;td>リファクタリング&lt;/td>
      &lt;td>振り返り&lt;/td>
    &lt;/tr>
  &lt;/tbody>
&lt;/table>

14. よくある質問(FAQ)

Q1. フォームとテーブルにスタイルを適用するには?

A. HTMLではなくCSSで装飾します。次回の「CSS入門ガイド」で詳しく解説します。

Q2. フォームのデータはどこに送信される?

A. <form>タグのaction属性で指定したサーバー側のプログラム(PHP、Python、Node.jsなど)に送信されます。

Q3. JavaScriptなしでフォーム検証はできる?

A. HTML5の検証属性(required、pattern、minlength等)で基本的な検証は可能です。ただし、より複雑な検証にはJavaScriptが必要です。

Q4. テーブルはレイアウトに使っても良い?

A. いいえ。テーブルはデータ表示専用です。レイアウトにはCSSのFlexboxやGridを使用してください。

Q5. モバイルでテーブルが見づらい場合は?

A. 横スクロール可能にするか、CSSでカード型レイアウトに変更するのが一般的です。

Q6. フォームの送信時にページが更新されるのを防ぐには?

A. JavaScriptでevent.preventDefault()を使用します。詳細はJavaScript講座で解説します。


15. フォーム・テーブルのベストプラクティス

フォーム設計の原則

  1. シンプルに保つ - 本当に必要な項目だけを聞く
  2. 明確なラベル - 何を入力すべきか一目でわかるように
  3. エラーメッセージは具体的に - 「入力エラー」ではなく「メールアドレスの形式が正しくありません」
  4. 進捗を表示 - 複数ページのフォームでは現在の位置を示す
  5. モバイルファースト - スマートフォンでの入力しやすさを最優先

テーブル設計の原則

  1. 見出しを明確に - <th>で列・行の見出しを適切に設定
  2. データは左揃え、数値は右揃え - CSSで設定
  3. 行の識別を容易に - 背景色を交互に変える(ストライプ)
  4. 大量データは避ける - ページネーションを検討
  5. キャプションを付ける - テーブルの内容を簡潔に説明

16. トラブルシューティング

よくあるエラーと解決法

エラー1: フォームが送信されない

原因:

  • <form>タグがない
  • action属性が設定されていない
  • 送信ボタンのtype="submit"がない

解決法:

html

&lt;form action="/submit" method="post">
  &lt;input type="text" name="username">
  &lt;button type="submit">送信&lt;/button> &lt;!-- type属性を明示 -->
&lt;/form>

エラー2: テーブルのレイアウトが崩れる

原因:

  • <tr><td>の閉じタグ忘れ
  • colspanやrowspanの計算ミス

解決法:

  • HTMLバリデーターでチェック
  • 各行の列数が一致しているか確認

エラー3: ラベルをクリックしても入力欄にフォーカスしない

原因:

  • <label>for属性と<input>idが一致していない

解決法:

html

&lt;!-- 正しい例 -->
&lt;label for="email">メールアドレス:&lt;/label>
&lt;input type="email" id="email" name="email">

エラー4: モバイルで入力欄が小さい

原因:

  • font-sizeが16px未満
  • viewportの設定がない

解決法:

html

&lt;meta name="viewport" content="width=device-width, initial-scale=1.0">
&lt;style>
  input, select, textarea {
    font-size: 16px; /* 最低16px */
  }
&lt;/style>

17. 実践課題:あなたもやってみよう

課題1: 会員登録フォーム(初級)

以下の項目を含む会員登録フォームを作成してください:

  • ユーザー名(必須、4-20文字)
  • メールアドレス(必須)
  • パスワード(必須、8文字以上)
  • パスワード確認(必須)
  • 生年月日(必須)
  • 性別(選択式)
  • 利用規約への同意(チェックボックス、必須)

課題2: 商品一覧テーブル(中級)

以下の要素を含む商品一覧テーブルを作成してください:

  • 商品ID、商品名、価格、カテゴリ、在庫状況の列
  • thead、tbody、tfootを使った構造化
  • 合計金額を表示するフッター
  • 価格が高い商品の行を強調表示

課題3: 予約フォーム(上級)

レストラン予約フォームを作成してください:

  • 予約日(date)
  • 予約時間(time、営業時間内のみ)
  • 人数(number、1-10名)
  • コース選択(select)
  • アレルギー・要望(textarea)
  • 連絡先情報(名前、電話、メール)
  • 適切なグループ化(fieldset)

18. 次のステップ

学習ロードマップ

今回学んだこと ✓

  •  フォームの基本構造
  •  各種入力要素の使い方
  •  テーブルの作成方法
  •  アクセシビリティへの配慮

次に学ぶべきこと

  •  CSSでフォームとテーブルをデザイン
  •  JavaScriptでフォーム検証を実装
  •  サーバーサイドでのフォーム処理
  •  データベースとの連携

推奨学習リソース

公式ドキュメント

  • MDN Web Docs - HTML Forms - フォームの詳細ガイド
  • WHATWG HTML Standard - HTML仕様書
  • W3C WAI-ARIA - アクセシビリティ標準

オンラインツール

  • HTML Form Generator - フォームを視覚的に作成
  • Tables Generator - テーブルコードを自動生成
  • Can I Use - ブラウザ対応状況を確認

実践練習サイト

  • CodePen - フォームのデモを試す
  • JSFiddle - インタラクティブなフォームを作成

19. HTML5の最新フォーム機能

新しい入力タイプの活用

html

&lt;!-- 複数メールアドレス -->
&lt;input type="email" multiple name="recipients">

&lt;!-- URLの検証 -->
&lt;input type="url" name="website" placeholder="https://example.com">

&lt;!-- 週の選択 -->
&lt;input type="week" name="week">

&lt;!-- 月の選択 -->
&lt;input type="month" name="month">

&lt;!-- 時刻の範囲 -->
&lt;input type="time" name="start-time" min="09:00" max="18:00">

フォームの自動保存(ブラウザ機能)

html

&lt;form>
  &lt;!-- ブラウザが入力内容を記憶 -->
  &lt;input type="text" name="name" autocomplete="name">
  &lt;input type="email" name="email" autocomplete="email">
  
  &lt;!-- 自動保存を無効化したい場合 -->
  &lt;input type="password" name="password" autocomplete="off">
&lt;/form>

リアルタイムバリデーション

html

&lt;form>
  &lt;label for="username">ユーザー名:&lt;/label>
  &lt;input type="text" 
         id="username" 
         name="username"
         pattern="[a-zA-Z0-9_]{4,20}"
         title="4-20文字の英数字とアンダースコアのみ使用可能"
         oninput="this.setCustomValidity('')"
         oninvalid="this.setCustomValidity('ユーザー名は4-20文字の英数字で入力してください')">
  
  &lt;span id="username-feedback">&lt;/span>
&lt;/form>


まとめ:フォームとテーブルをマスターしよう

フォームとテーブルは、Webサイトで最も頻繁に使用される重要な要素です。この記事で学んだ内容をしっかり理解し、実践することで、ユーザーフレンドリーで機能的なWebページを作成できるようになります。

重要ポイントの振り返り

フォーム

  • 適切な入力タイプを選ぶ - type属性で最適な入力方法を提供
  • ラベルは必須 - アクセシビリティとユーザビリティのために
  • バリデーションを活用 - HTML5の検証機能で基本的なエラーを防止
  • モバイルを考慮 - inputmode属性とfont-size:16px以上

テーブル

  • セマンティックな構造 - thead、tbody、tfootを適切に使用
  • 見出しの明確化 - thタグとscope属性でアクセシビリティ向上
  • レスポンシブ対応 - スマートフォンでの表示方法を工夫
  • データ表示専用 - レイアウト目的では使用しない

次回予告

第3回: CSS入門ガイド - フォームとテーブルを美しくデザインしよう

次回は、CSSを使ってフォームとテーブルを視覚的に魅力的にデザインする方法を学びます。以下の内容を予定しています:

  • フォームのスタイリング基礎
  • ボタンのデザインバリエーション
  • テーブルの装飾テクニック
  • レスポンシブデザインの実装
  • アニメーション効果の追加

最も重要なこと: この記事を読むだけでなく、実際に手を動かしてフォームとテーブルを作成してみてください。エラーを経験し、解決することで、確実にスキルが身につきます。

さあ、実践を始めましょう!

\ 最新情報をチェック /

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です