HTMLのformタグとinput属性の使い方まとめ+バリデーション入門【初心者向け完全ガイド】

HTMLのformタグとinput属性の使い方まとめ+バリデーション入門【初心者向け完全ガイド】

HTMLのformタグとinput属性の使い方まとめ+バリデーション入門【初心者向け完全ガイド】

Webアプリでもブログのお問い合わせページでも、フォームはユーザーから情報を受け取る最重要インターフェースです。ところが「<form><input>は何となく書いているけれど、属性の意味やバリデーションの仕組みは曖昧」という声をよく耳にします。

この記事では HTMLだけで実装できる標準バリデーション を中心に、formタグとinput要素の基礎から実践的なサンプルまでを一気に整理します。これさえ読めば、まずはHTMLだけで完結する安全で使いやすいフォームを構築できるようになります。さらに必要に応じて、JavaScriptで相関チェックや動的制御を加える方法も紹介します。

目次

formタグとは ― 基本構造と主要属性

役割

<form>タグは 送信対象となる入力要素をまとめ、サーバーへデータを送るコンテナ です。フォーム外の要素は送信対象になりません。

主な属性

属性役割よく使う値・注意点
action送信先URL省略時は「現在のURLと同じパス」へ送信(クエリ文字列は無視される)。ディレクトリ構造が深い場合や静的サイトで疑似パスを使っている場合は、意図しないエンドポイントに送られることがあるため要注意。
methodHTTPメソッドget (既定) / post
enctypeエンコード方式ファイルアップロード時は multipart/form-data
target送信結果の表示先_self / _blank など
autocomplete自動補完の可否on / off
novalidate検証スキップ属性を付けるだけで全項目のバリデーションを無効化

ポイント
method="get"はURLにクエリ文字列が露出するため、パスワードや個人情報には必ずpostを使いましょう。

input要素の仕組みと共通属性

<input>type属性によって機能が変わる万能タグ です。共通して覚えておくべき属性は次のとおりです。

属性概要補足
type入力フィールドの種類text, email, number など
name送信時のキー名同じnameを複数使うと配列送信
value既定値checkboxradioは「送信される値」を定義
placeholder入力例必ずlabelと併用(アクセシビリティ)
required未入力時に送信ブロックブール属性(値は不要)
pattern正規表現パターン/は不要。JavaScriptのRegExpとは構文が一部異なり、先読み/後読みなどは使用不可
patternは空欄をブロックしないため、必須入力としたい場合はrequiredも併用してください。
min / max数値・日付の下限/上限type="number", dateなどで有効
maxlength / minlength文字数制限textareaでも使用可
autocompleteブラウザ補完の指定"email", "postal-code"など語彙固定
disabled / readonly入力不可disabledは送信もされない

input type一覧と具体例

以下は主要typeと利用シーンです。覚えると開発効率が大幅アップします。

typeUIイメージ標準バリデーション代表的な使い方・備考
text一行テキストなしユーザー名など
emailメールアドレス形式チェックログイン・問い合わせ
urlURL形式チェックSNSリンク収集
tel電話番号形式チェックなしスマホでは電話用キーボードが開く連絡先
numberスピンボックス数値・min/max年齢、数量
passwordパスワード伏せ字表示認証
search検索ボックスなしサイト内検索
checkboxチェックボックスなし利用規約同意
radio排他選択なし性別など
fileファイル選択acceptでMIME制限※MIME spoofingは防げないためサーバー側で必ず再検証画像アップロード
date / time / datetime-localカレンダーUI範囲チェック予約フォーム
rangeスライダーmin/max/step音量調整
colorカラーピッカー16進数カラーテーマ設定
hidden非表示値なしCSRFトークン
submit / reset / buttonボタン送信/リセット

HTML5標準バリデーションのしくみ

ブラウザは送信前に「制約付き検証(Constraint Validation)」を自動実行します。以下のすべてを満たさないと送信はブロックされ、エラーメッセージが表示されます。

  1. required:未入力禁止
  2. type依存チェック:emailなら「@」を含む等
  3. pattern:正規表現一致
  4. min / max / step:範囲・刻み値
  5. minlength / maxlength:文字数
  6. multipleemailfileで複数可否
<label for="user_email">メールアドレス</label>
<input type="email"
       id="user_email"
       name="user_email"
       placeholder="example@example.com"
       required
       maxlength="254">

カスタムバリデーション ― JavaScript連携

標準機能だけで足りない場合は Constraint Validation API を使います。

<script>
document.querySelector('form').addEventListener('submit', e => {
  const pass  = document.getElementById('password');
  const pass2 = document.getElementById('password2');

  if (pass.value !== pass2.value) {
    pass2.setCustomValidity('パスワードが一致しません');
  } else {
    pass2.setCustomValidity('');
  }

  if (!e.target.reportValidity()) e.preventDefault();
});
</script>
  • setCustomValidity() で独自メッセージを付与
  • reportValidity() でフォーム全体を再チェック
  • エラー要素には aria-invalid="true" と説明用IDを紐付けるとスクリーンリーダーで分かりやすくなります。

実践サンプル:会員登録フォームを作る

以下はフロントエンドだけで完結する会員登録フォーム例です。標準属性だけで多くのバリデーションが実現できる点に注目してください。

<form action="/signup" method="post" enctype="multipart/form-data" novalidate>
  <h2>会員登録フォーム</h2>

  <label for="username">ユーザー名</label>
  <input type="text" id="username" name="username"
         required minlength="3" maxlength="20"
         placeholder="3〜20文字の半角英数字">

  <label for="email">メールアドレス</label>
  <input type="email" id="email" name="email"
         required autocomplete="email">

  <label for="password">パスワード</label>
  <input type="password" id="password" name="password"
         required minlength="8" pattern="^[A-Za-z0-9]+$"
         placeholder="英数字8文字以上">

  <label for="password2">パスワード(確認)</label>
  <input type="password" id="password2" required>

  <label for="birthday">生年月日</label>
  <input type="date" id="birthday" name="birthday" required>

  <label for="avatar">プロフィール画像(JPEG/PNG, 2MBまで)</label>
  <input type="file" id="avatar" name="avatar"
         accept="image/jpeg,image/png" required>

  <button type="submit">登録する</button>
</form>

<script>
/* 18歳未満をブロックする動的max値 */
const birthday = document.getElementById('birthday');
const today = new Date();
today.setFullYear(today.getFullYear() - 18);
birthday.max = today.toISOString().split('T')[0];

document.querySelector('form').addEventListener('submit', e => {
  const p1 = document.getElementById('password');
  const p2 = document.getElementById('password2');

  p2.setCustomValidity(p1.value === p2.value ? '' : 'パスワードが一致しません');
  if (!e.target.reportValidity()) e.preventDefault();
});
</script>

解説ポイント

  • labelinputforidで明示的に紐付け、アクセシビリティを強化。
  • 生年月日のmax「現在日−18年」をJavaScriptで自動設定 し、時間経過に強い実装に(”18歳以上か”の判定)。
  • ファイルアップロードはacceptで一次フィルタ、サーバー側でMIME/拡張子チェックを必ず実施

チェックリスト&まとめ

チェック項目確認しましたか?
送信先URL(action)はHTTPSか
個人情報送信はmethod="post"
すべての入力にlabelfor属性で紐付け
必須項目にはrequired
文字数・範囲はmin/max/lengthで制御
メールやURLは専用typeで自動検証
正規表現が必要ならpattern活用(JSと構文差異に注意)
ファイルはサーバー側でMIME再検証
カスタム検証はsetCustomValidity()
アクセシビリティ属性(aria-*)

PHPのコメントアウト:よくあるミスと正しい記述方法&注意点

まとめ

  • <form>は送信コンテナ、<input>は万能入力フィールド
  • HTML5以降はブラウザだけで強力なバリデーションが可能
  • JavaScriptは「相関チェック」や「動的条件」など標準属性で賄えない部分を補完する程度でOK
  • アクセシビリティとセキュリティを意識し、入力制御はフロントとバックエンドの両方で実装することが安全なフォーム開発の鉄則です。

これで「フォームが動かない」「バリデーションが抜け漏れる」といった初歩的なトラブルは激減します。ぜひ自分のサイトに取り入れて、ユーザー体験と開発効率を同時に高めてください。

【完全比較】display:noneとvisibility:hiddenの違いとは?使い分け・注意点まで徹底解説

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次