問い合わせフォームを作ろうとして、入力欄やボタンをどう組み合わせればよいのか、ボタンを押すだけでメールが届くのかと迷っていませんか。
HTMLのフォームは、入力した情報をまとめて送るための仕組みです。全体をまとめるform、入力欄を作るinput、項目名を示すlabel、操作を行うbuttonに分けると、構造を理解しやすくなります。
この記事では、4つの要素の違いを確認し、名前とメールアドレスを入力するフォームを書きます。完成コードを保存してブラウザーで開き、ラベルの連動や入力チェックを確かめるところまで進めます。入力画面と、メールを届ける処理の違いも分かるようになります。
form・input・label・buttonの役割と親子関係- 名前とメールアドレスを入力するフォームの基本的な書き方
forとid、nameと値の違いaction・method・typeの選び方- 入力や送信がうまくいかないときの症状別の確認先
HTMLのフォームとは?
HTMLのフォームは、ユーザーが入力・選択した情報をまとめて送信するための領域です。問い合わせフォームなら名前やメールアドレス、検索フォームなら検索キーワードを受け取ります。
MDNのform要素の解説では、formは情報を送信するための対話型コントロールを含む文書の区間と説明されています。
フォームは入力欄だけでなく送信のまとまり
フォームには、テキスト入力欄だけでなく、項目名、チェックボックス、送信ボタンなども含められます。formは、それらを一つの送信単位としてまとめる外側の要素です。
<form>
<!-- ラベル、入力欄、ボタンを入れる -->
</form>
formは見た目の枠を作るためではなく、どの入力項目を一緒に送るかをまとめるために使います。見た目の枠線や余白はCSSで整えます。
HTMLだけでできること・できないこと
HTMLでは、入力欄と送信ボタンを画面に表示し、送信先や送信方法を指定できます。ただし、送られた内容を保存したり、担当者へメールで届けたりする処理はHTMLの役割ではありません。
HTMLは入力画面と送信の入口を作るものと考えましょう。実際の保存・メール送信・自動返信には、サーバー側のプログラムやフォームサービスが必要です。
formの内側で、labelが項目を説明し、inputが値を受け取り、buttonが送信を実行します。この流れを先に覚えると、属性を追加しても役割を見失いません。
form・input・label・buttonの違い
4つの要素は、フォーム全体・入力欄・項目名・操作ボタンという役割に分かれます。
| 要素 | 役割 | 主に確認する属性 |
|---|---|---|
form | 入力項目を一つの送信単位にまとめる | action、method |
input | 文字、メールアドレス、選択状態などを受け取る | type、id、name |
label | 入力欄が何の項目かを示す | for |
button | 送信や画面上の操作を実行する | type |
formはフォーム全体を囲む
この基本例では、formの開始タグと終了タグの間へ、同じフォームとして送信したいinputやbuttonを書きます。formの中に別のformを入れ子にはできません。
inputは値を受け取る
inputは入力欄を作る要素です。type="text"なら1行の文字入力、type="email"ならメールアドレス入力の用途を示せます。MDNのinput要素の解説にあるように、typeによって見た目と動作が変わり、省略時の既定値はtextです。
labelは入力欄の意味を示す
labelには「お名前」「メールアドレス」のような項目名を書きます。for属性とinputのidを同じ値にすると、両者を関連付けられます。
buttonは送信などの操作を実行する
buttonはクリックできるボタンを作ります。フォームを送信するならtype="submit"、JavaScriptなどで独自の処理を実行するならtype="button"を使います。
HTMLで基本のフォームを書く方法
ここでは、テキストエディターでHTMLファイルを編集します。開始タグと終了タグの書き方が分かれば進められます。名前とメールアドレスの2項目を使い、入力画面とブラウザー側のチェックを確認しましょう。
HTMLのbody内に、formの開始タグと終了タグを書きます。以下のSTEP1・2は構造を理解するための途中のコードです。すぐに試す場合は、STEP3の完成コードを使ってください。
<form>
</form>
項目ごとにlabelとinputを置きます。labelのforとinputのidは、同じ文字列にします。
<form>
<p>
<label for="name">お名前</label>
<input type="text" id="name" name="name">
</p>
<p>
<label for="email">メールアドレス</label>
<input type="email" id="email" name="email">
</p>
</form>
pは1項目を段落としてまとめるための一例です。レイアウトだけを目的にする場合は、構造に合う要素を選び、最終的な並び方はCSSで調整します。
type="submit"のボタンと、必須入力を表すrequiredを追加します。下がHTMLファイル全体の完成コードです。/contactは送信先を説明するための仮のURLで、受け取り処理は用意していません。練習では、次のSTEPで示す未入力・形式違いの確認まで行います。
<!doctype html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>フォームの練習</title>
</head>
<body>
<form action="/contact" method="post">
<p>
<label for="name">お名前(必須)</label>
<input type="text" id="name"
name="name" required>
</p>
<p>
<label for="email">メールアドレス(必須)</label>
<input type="email" id="email"
name="email" required>
</p>
<button type="submit">送信する</button>
</form>
</body>
</html>
ブラウザーでは「お名前(必須)」「メールアドレス(必須)」と入力欄、その下に送信ボタンが表示されます。CSSで装飾していないため、枠やボタンの見た目はブラウザーによって異なります。
- STEP3の完成コードだけを新しいファイルへ貼り付け、文字コードUTF-8、ファイル名
form-practice.htmlで保存します。末尾が.txtになっていないか確認し、そのファイルをブラウザーで開きます。 - 「メールアドレス(必須)」の文字をクリックします。メール入力欄にカーソルが移れば、
forとidの関連付けはできています。 - 何も入力せず「送信する」を押します。お名前欄に入力を促す案内が出て、ページが移動しなければ、
requiredが働いています。 - お名前に「練習」、メールアドレスに
abcを入れて、もう一度ボタンを押します。メール形式の案内が出て送信されなければ、type="email"のチェックを確認できました。 - 確認後は入力内容を消して終了します。有効なメールアドレスを入れて送信しても、この練習用の仮URLではメールの到着や受付完了を確認できません。
案内の文言はブラウザーによって異なります。コードを直したときは、ファイルを保存してからページを再読み込みし、該当する動作だけをもう一度確かめてください。
入力画面の確認と、送信先で受け取る処理の確認を分けましょう。ラベルの連動と入力チェックができたら、この練習は完了です。メール送信の確認は、受け取り処理を用意してから行います。
formのaction・methodの書き方
formでは、主にactionで送信先、methodで送信方法を指定します。
<form action="/contact" method="post">
<!-- 入力項目 -->
</form>
actionはデータの送信先を指定する
actionには、フォームデータを受け取るURLを書きます。/contactのような相対的な指定も、https://example.com/contactのような完全URLも使えます。パスの基準が分からない場合は、HTMLの相対パスと絶対パスの違いも確認してください。
methodはGETまたはPOSTを指定する
基本的な送信方法はgetとpostです。
| method | データの主な送られ方 | 向いている例 |
|---|---|---|
get | URLの末尾へクエリとして付く | サイト内検索、絞り込み |
post | リクエスト本文に入る | 問い合わせ、登録フォーム |
methodを省略した場合はgetとして扱われます。ただし、postを選べば自動的に安全になるわけではありません。HTTPS、入力値の検証、保存方法などは送信先側でも設計します。
検索条件のようにURLへ残したい情報はGET、問い合わせ内容のように送信処理へ渡す情報はPOSTを基本に検討します。
inputのtype・id・nameの書き方
inputは属性の組み合わせで用途が決まります。初心者が最初に覚えたいのはtype・id・nameです。
typeは入力欄の種類を決める
よく使うtypeは次のとおりです。
| type | 用途 | 例 |
|---|---|---|
text | 1行の文字入力 | 氏名、会社名 |
email | メールアドレス入力 | 連絡先メール |
password | 入力文字を隠す | パスワード |
checkbox | 複数選択や同意 | 興味のある項目、規約同意 |
radio | 一つだけ選択 | 連絡方法、プラン |
submit | フォーム送信 | 送信ボタン |
送信ボタンはinput type="submit"でも作れますが、表示する文字や要素を柔軟に扱いやすいbuttonを使う方法も覚えておくと便利です。
idはページ内で要素を識別する
idはページ内で要素を識別する値です。labelのforから入力欄を指すときにも使います。同じページ内で重複しない値にします。
nameは送信データの項目名になる
nameは、送信データに付く項目名です。例えば、次の入力欄にhoai@example.comと入力すると、項目名emailと入力値hoai@example.comが組になります。ここでは、送信前の関係をemail=hoai@example.comと表しています。実際の送信時には、送信形式に応じて文字が符号化されます。
<input type="email" id="email" name="email">
入力欄が画面に表示されていても、nameがなければ通常のフォーム送信データにはその値が含まれません。
type="text"やtype="email"にHTMLで書くvalue属性は、最初に表示する値です。利用者が書き換えた後に送られるのは現在の入力値なので、HTMLに書いた初期値と分けて考えましょう。
labelのforとinputのidを関連付ける
labelとinputを関連付ける代表的な方法は、forとidに同じ値を書くことです。
<label for="email">メールアドレス</label>
<input type="email" id="email" name="email">
MDNのlabel要素の解説でも、明示的な関連付けではinputのidと同じ値をlabelのforへ指定すると説明されています。
ラベルをクリックして入力欄を選べる
正しく関連付けると、ラベルの文字をクリックしたときに対応する入力欄へフォーカスが移ります。チェックボックスやラジオボタンでは、文字部分も選択に使えるため操作しやすくなります。
この例では、forとidの一致によって、どの項目名がどの入力欄に対応するかを伝えます。
for・idとnameは役割が異なる
forとidは、画面上でラベルと入力欄を結び付けます。一方、nameは送信先へ渡すデータの項目名です。

forとidは「どのラベルがどの入力欄か」、nameは「送信先で何という項目か」と分けて覚えると、同じ値を機械的に書くのではなく役割から判断できます。
buttonのtypeを使い分ける
buttonのtypeには、主にsubmit・button・resetがあります。
| type | 動作 | 主な用途 |
|---|---|---|
submit | フォームを送信する | 送信、登録、検索 |
button | それだけでは送信しない | JavaScriptで開閉・追加などを行う |
reset | 入力内容を初期値へ戻す | 限定的なリセット操作 |
<button type="submit">送信する</button>
<button type="button">入力欄を追加する</button>
MDNのbutton要素の解説では、フォームに関連付いたbuttonはtypeを指定しないとsubmitとして扱われること、送信しないボタンにはtype="button"を指定することが示されています。
フォーム内のbuttonは、送信させたいかどうかを判断してtypeを明示します。
入力欄の表示切り替えなど、送信しない操作ボタンにはtype=”button”を明記して意図しない送信を防ぐのが安全です。
入力しやすいフォームにする基本
正しく送信できるだけでなく、何を入力すればよいかが分かり、キーボードや読み上げソフトでも操作しやすい形を目指します。
placeholderだけで項目名を済ませない
placeholderは入力例や補足に使えますが、入力を始めると見えなくなります。項目名はlabelで示し、placeholderは補助として使います。

<label for="email">メールアドレス</label>
<input
type="email"
id="email"
name="email"
placeholder="name@example.com"
>
requiredは必須入力を示す
requiredを付けると、その入力欄を空のまま送信しようとしたときに、ブラウザの入力チェックが働きます。
<input type="text" id="name" name="name" required>
ただし、ブラウザ側のチェックだけに頼らず、送信先側でも入力値を検証します。
複数の選択肢はfieldsetとlegendでまとめる
ラジオボタンやチェックボックスが一つの質問に属する場合は、fieldsetでまとめ、legendで質問名を示せます。次は2項目の入力例から、連絡方法を選ぶ例への発展です。ここでは、labelでinputを囲む別の関連付け方を使っています。
<fieldset>
<legend>希望する連絡方法</legend>
<label>
<input type="radio" name="contact" value="email">
メール
</label>
<label>
<input type="radio" name="contact" value="phone">
電話
</label>
</fieldset>
フォームが動かないときの確認ポイント
うまく動かないときは、自分の症状に合う項目から確認します。直した後は保存・再読み込みし、その症状が解消すれば確認を終えて構いません。
入力欄の一部が送信対象にならない
この基本例では、一緒に送信したい入力欄と送信ボタンを、同じform内へ置きます。終了タグが途中に入っていないか、別のformを入れ子にしていないかを確認します。送信先を用意した段階で、必要な項目が一緒に届けば修正できています。
ラベルを押しても入力欄へ移動しない
labelのforと入力欄のidを、大文字小文字やハイフンも含めて一致させます。同じidをほかの入力欄に使っていないかも確認し、ラベルを押して狙った欄にカーソルが移れば完了です。
<!-- 一致している例 -->
<label for="user-email">メールアドレス</label>
<input id="user-email" name="email" type="email">
入力した値が送信先で見つからない
入力欄のnameが空になっていないか、送信先が受け取る項目名と一致するかを確認します。disabledで無効にした欄や、未選択のチェックボックス・ラジオボタンは送信されません。受け取り処理で、期待した項目名と値を確認できれば完了です。
ボタンを押しても送信が始まらない
ブラウザーが入力を促している場合は、必須項目やメール形式を直します。案内が出ない場合は、送信ボタンがtype="submit"か確認してください。反対に、送信したくない操作にはtype="button"を指定します。送信先を用意した後で、意図した動作になるか確かめます。
送信後にエラーが出る・メールが届かない
actionのURLと、そのURLで受け取る処理を確認します。練習コードの/contactは仮の指定なので、エラーになっても入力欄の書き方が原因とは限りません。実用化するときは、受け取り処理の仕様に合わせてactionとmethodを設定し、受付結果・保存内容・メール到着まで確認します。
一度に複数箇所を変えず、症状に関係する箇所を一つずつ直すと、原因を特定しやすくなります。
HTMLフォームでよくある質問
- 同じページにフォームを2つ置けますか?
-
置けます。ただし、
form同士を入れ子にせず、別々に並べます。入力欄のidはページ全体で重複させず、それぞれのlabelのforを対応する値にします。 - buttonとinput type=”submit”はどちらを使えばよいですか?
-
どちらもフォームを送信できます。文字以外の要素も含めて柔軟に内容を組み立てたい場合は
button type="submit"が使いやすく、単純な送信ボタンならinput type="submit"でも構いません。
まとめ
HTMLフォームは、form・input・label・buttonの役割を分けて考えると書きやすくなります。
formは入力項目を一つの送信単位にまとめるinputは文字や選択状態などの値を受け取るlabelは入力欄の意味を示し、forとidで関連付けるnameは送信データの項目名になるbuttonはtypeで送信するかどうかを明示する- メール送信や保存には、HTMLとは別に受け取り処理が必要
まずは完成コードを保存してブラウザーで開き、ラベルのクリックと未入力・メール形式のチェックを試してみましょう。入力画面を確認できたら、必要な入力欄や送信先の設定へ進めます。
目的に合わせて次の内容を学ぶ
入力欄の種類や初期値を詳しく知りたい場合は、inputの解説へ進んでください。

入力画面を作れたら、送信先と送信方法を確認しましょう。受け取り側に合わせて設定する考え方を解説しています。


