<form>
| 対応: | HTML 4(1997) |
|---|
『<form>』はユーザーが入力したデータをサーバーに送信するためのフォームコンテナで、送信先・送信方法などを属性で指定します。
構文
<form action="送信先URL" method="post"> <!-- フォーム部品をここに配置 --> <input type="text" name="username"> <button type="submit">送信</button> </form>
属性一覧
| 属性 | 概要 |
|---|---|
| action | フォームデータの送信先URLを指定します。省略すると現在のページのURLに送信されます。 |
| method | 送信方法を指定します。『get』(URLにデータを付加)か『post』(リクエストボディに含める)を指定します。 |
| enctype | 送信データのエンコード形式を指定します。ファイルアップロード時は『multipart/form-data』を指定します。 |
| novalidate | この属性を付けると、ブラウザ標準のバリデーション(入力チェック)を無効にします。 |
| autocomplete | フォーム全体に対してオートコンプリートを有効(『on』)・無効(『off』)にします。 |
| target | 送信結果を表示するウィンドウを指定します。『_blank』で新しいタブに表示します。 |
サンプルコード
sample_form.html
<!-- 基本的なお問い合わせフォーム(POST送信) -->
<form action="/contact.php" method="post" autocomplete="on">
<div>
<label for="name">お名前(必須)</label>
<input type="text" id="name" name="name" required>
</div>
<div>
<label for="email">メールアドレス(必須)</label>
<input type="email" id="email" name="email" required>
</div>
<div>
<label for="message">お問い合わせ内容</label>
<textarea id="message" name="message" rows="5"></textarea>
</div>
<button type="submit">送信する</button>
</form>
<!-- 検索フォーム(GET送信): URLにパラメータが付く -->
<form action="/search" method="get">
<input type="search" name="q" placeholder="キーワードを入力">
<button type="submit">検索</button>
</form>
<!-- 送信後のURL例: /search?q=HTML -->
<!-- ファイルアップロードフォーム(enctype必須) -->
<form action="/upload.php" method="post" enctype="multipart/form-data">
<label for="file">ファイルを選択:</label>
<input type="file" id="file" name="file" accept="image/*">
<button type="submit">アップロード</button>
</form>
実行結果
お名前・メールアドレスの入力欄とテキストエリア、送信ボタンが表示されます。「送信する」ボタンをクリックすると入力内容が検証され、問題がなければ『/contact.php』に POST 送信されます。検索フォームは送信後にURLが『/search?q=入力値』の形式になります。ファイルアップロードフォームでは画像ファイルのみ選択できます。
FormData API でフォームデータを取得する
JavaScriptの『FormData』オブジェクトを使うと、フォームの入力値を簡単に取得してAJAX送信できます。ページをリロードせずにデータを送信したい場合に活用します。
<form id="contactForm">
<input type="text" name="name" placeholder="お名前" required>
<input type="email" name="email" placeholder="メールアドレス" required>
<textarea name="message" rows="4"></textarea>
<button type="submit">送信</button>
</form>
<script>
document.getElementById('contactForm').addEventListener('submit', function(e) {
e.preventDefault(); // デフォルトの送信を阻止
var formData = new FormData(this); // フォームの入力値を自動収集
// 個別の値を取得
console.log(formData.get('name'));
console.log(formData.get('email'));
// fetch でAJAX送信
fetch('/api/contact', {
method: 'POST',
body: formData // Content-Typeは自動でmultipart/form-dataになる
})
.then(function(res) { return res.json(); })
.then(function(data) {
alert('送信しました');
});
});
</script>
CSSでフォームをスタイリングする
フォームのデフォルトスタイルはブラウザごとに異なります。統一されたデザインにするには、ブラウザのデフォルトスタイルを上書きするCSSを書きます。
<style>
form { max-width: 480px; }
/* ラベルと入力欄を縦並びにする */
.form-group {
display: flex;
flex-direction: column;
gap: 4px;
margin-bottom: 16px;
}
/* 入力欄の共通スタイル */
input[type="text"],
input[type="email"],
textarea {
width: 100%;
padding: 8px 12px;
border: 1px solid #ccc;
border-radius: 4px;
font-size: 1rem;
box-sizing: border-box;
transition: border-color 0.2s;
}
/* フォーカス時に枠線を強調 */
input:focus, textarea:focus {
outline: none;
border-color: #4a90e2;
box-shadow: 0 0 0 3px rgba(74, 144, 226, 0.2);
}
/* エラー状態 */
input:invalid:not(:placeholder-shown) {
border-color: #e74c3c;
}
/* 送信ボタン */
button[type="submit"] {
padding: 10px 24px;
background: #4a90e2;
color: #fff;
border: none;
border-radius: 4px;
cursor: pointer;
font-size: 1rem;
}
button[type="submit"]:hover { background: #2c6fbc; }
</style>
概要
『method="get"』は検索フォームのようにURLにデータを残したい場合に適しており、『method="post"』はパスワードや個人情報など、URLに含めたくないデータの送信に使います。パスワードや個人情報を送信するフォームには必ず『method="post"』を使い、かつHTTPS通信であることを確認してください。
『enctype』属性はデフォルトが『application/x-www-form-urlencoded』で、通常のテキストデータの送信には問題ありません。ファイルアップロード機能を含む場合は必ず『multipart/form-data』を指定します。指定を忘れるとファイルが正しく送信されません。
フォームの中に配置できる入力部品(テキスト入力など)については 『input(テキスト系)』 をご覧ください。
対応ブラウザ
1 以降 ○
1 以降 ○
3 以降 ○
2 以前 ×
8 ○
7 ○
6 ○
14 以前 ×
2 以降 ○
Android Browser
4.4 以降 ○
4 以前 ×※ バージョン情報は MDN に基づいています。
JavaScriptとの連携(FormData)
『FormData』APIを使うと、フォームのデータをJavaScriptで簡単に取得・送信できます。Ajax(非同期)でフォームを送信する際の標準的な方法です。
<form id="contact-form">
<label for="name">お名前</label>
<input type="text" id="name" name="name" required>
<label for="message">メッセージ</label>
<textarea id="message" name="message" required></textarea>
<button type="submit">送信</button>
<p id="result"></p>
</form>
<script>
document.getElementById('contact-form').addEventListener('submit', function(e) {
e.preventDefault(); // デフォルトの送信を止める
// FormData でフォームのデータを一括取得
var formData = new FormData(this);
// fetch APIで非同期送信
fetch('/api/contact', {
method: 'POST',
body: formData // Content-Typeは自動でmultipart/form-dataになる
})
.then(function(response) {
return response.json();
})
.then(function(data) {
document.getElementById('result').textContent = '送信が完了しました。';
})
.catch(function(error) {
document.getElementById('result').textContent = '送信に失敗しました。';
});
});
</script>
アクセシビリティの実践
フォームのアクセシビリティを高めるためのポイントをまとめます。
| 項目 | 対応方法 |
|---|---|
| 全入力欄に関連付けられたラベルを付ける | label要素のfor属性とinputのidを一致させる(placeholderのみでは不十分) |
| 必須項目を視覚的に示す | CSSで「*(必須)」マークを表示し、aria-required="true"もセットする |
| エラーを入力欄に関連付ける | aria-describedby でエラーメッセージの要素を関連付ける |
| フォームをグループ化する | 関連する入力欄をfieldset/legendで囲んでグループ名を付ける |
| 送信後の結果を伝える | aria-live="polite" の領域に成功・失敗メッセージを表示する |
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。