Mozilla's getting a new look. What do you think? https://mzl.la/brandsurvey

初めての HTML フォーム

ここは、HTML フォームの入門記事です。シンプルな連絡フォームによって、HTML フォームを作るための基本的な要件を見ていきます。この記事では、読者は HTML フォームについては何も知らないが HTMLCSS の基礎は理解しているものとします。

始める前に

HTML フォームとは何か?

HTML フォームとは、ユーザと Web サイトやアプリケーションとの対話の要となるもののひとつです。フォームによって、ユーザーは Web サイトへデータを送ることができます。それらのデータはたいてい Web サーバに送られますが、Web ページ自身が使用するためにデータを横取りすることもできます。

HTML フォームは 1 つ以上のウィジェットで作られます。それらのウィジェットはテキストフィールド (単一行または複数行)、セレクトボックス、ボタン、チェックボックスあるいはラジオボタンがあります。それらのウィジェットはたいてい、用途を説明するラベルと対になります。

フォームを扱うために必要なものは?

HTML を扱うために必要なもの以上に求められるものはありません。テキストエディタと Web ブラウザが必要です。もちろん、慣れているのでしたら Visual StudioEclipseAptana などの IDE を使用してもかまいません。

HTML フォームと通常の HTML ドキュメントの大きな違いは、フォームで集めたデータはたいてい Web サーバに送られることです。この場合、Web サーバがそれらのデータを受け取って処理するように設定しなければなりません。そのようにサーバを設定する方法は本記事で扱う範囲を超えますが、詳しく知りたい場合は、このテーマについて詳しく扱っている記事であるフォームデータの送信と取得をご覧ください。

フォームを設計する

コードを書き始める前に、そこから離れてフォームに考える時間をとるとよいでしょう。簡単なモデルを作ると、あなたがユーザにたずねたいデータの適切なセットを定義することの助けになります。ユーザ体験 (UX) の観点では、フォームが大規模になるとユーザが離れるリスクが高まると覚えておくことが重要です。簡単に、かつ集中するようにしてください。本当に必要なことだけをたずねてください。フォームの設計は、サイトやアプリケーションを構築する際の大事なステップです。これらまで扱うと本記事の対象を超えてしまいますが、そこまで踏み込みたい場合は以下の記事をご覧ください:

本記事では、シンプルな連絡フォームを作成します。簡単に図を描いてみましょう。

The form to build, roughly sketch

このフォームには、3 つのテキストフィールドと 1 つのボタンがあります。要するに、ユーザへ名前、メールアドレス、送信したいメッセージをたずねます。ボタンを押すと、データを Web サーバに送信します。

HTML を書きましょう

これで、HTML に移ってフォームのコードを書く準備ができました。連絡フォームを作るために、以下の HTML 要素を使用します: <form><label><input><textarea>、そして <button> です。

<form> 要素

すべての HTML フォームは、以下のように <form> 要素から始まります:

<form action="/my-handling-form-page" method="post">

</form>

これは、フォームを正式に定義します。これは <div> 要素や <p> 要素と同様にコンテナ要素ですが、フォームの動作を設定するための固有の属性もサポートします。すべての属性は省略可能ですが、少なくとも action 属性と method 属性は常に設定することがベストプラクティスであると考えられます。

  • action 属性は、フォームで収集したデータを送信すべき場所 (URL) を定義します。
  • method 属性は、データを送信するために使用する HTTP メソッド ("get" または "post") を定義します。

これらの属性がどのように働くかについて、詳しくはフォームデータの送信と取得で説明しています。

<label><input> および <textarea> 要素でウィジェットを追加する

連絡フォームはとてもシンプルで 3 つのテキストフィールドを持っており、それぞれにラベルがついています。名前の入力フィールドは、基本的な単一行のテキストフィールドです。メールアドレスの入力フィールドは、メールアドレスだけを受け付ける単一行のテキストフィールドです。メッセージの入力フィールドは、基本的な複数行のテキストフィールドです。

HTML コードで、それらは以下のようになります:

<form action="/my-handling-form-page" method="post">
    <div>
        <label for="name">Name:</label>
        <input type="text" id="name" />
    </div>
    <div>
        <label for="mail">E-mail:</label>
        <input type="email" id="mail" />
    </div>
    <div>
        <label for="msg">Message:</label>
        <textarea id="msg"></textarea>
    </div>
</form>

<div> 要素はコードを扱いやすく構造化するとともに、スタイル設定を容易にするため (後述) に置いています。すべての <label> 要素における、for 属性の使い方に注目してください。これは、ラベルとフォームウィジェットを関連付けるための正式な方法です。この属性は、対応するウィジェットの id を参照します。これには利点があります。もっとも明確な利点は、ユーザがラベルをクリックすると対応するウィジェットがアクティブになることです。この属性の利点をさらに知りたいのでしたら、こちらの記事ですべてを詳しく説明しています: HTML フォームの構築方法.

<input> 要素でもっとも重要な属性は、type 属性です。この属性は <input> 要素の動作を定義するため、とても重要です。これは要素を根本的に変えるものですから、注意してください。詳しく知りたい場合は、ネイティブフォームウィジェットの記事をご覧ください。本記事の例では、値 text (これは属性の既定値であり、制御や検証を行わずあらゆるテキストを受け入れる、単一行のテキストフィールドを表します) および、正しい形式の電子メールアドレスだけを受け入れる単一行のテキストフィールドを定義する値 email のみ使用します。後者の値は基本的なテキストフィールドを、ユーザが入力した値にいくらかのチェックを実行する "賢い" フィールドに変えます。フォームの検証について詳しく知りたいのでしたら、データフォームの検証の記事をご覧ください。

最後に、<input /><textarea></textarea> の構文に注意してください。これは HTML の奇妙な点のひとつです。<input> タグは自動的に閉じられる要素であり、正式に要素を閉じたい場合は終了タグを置くのではなく、要素自身の終端に "/" を追加しなければなりません。一方 <textarea> は自動的に閉じられない要素ですので、適切な終了タグで閉じなければなりません。これは HTML フォーム固有の機能に影響を与えます。それは、既定値を定義する方法です。<input> 要素で既定値を定義するには、以下のように value 属性を使用しなければなりません:

<input type="text" value="by default this element is filled with this text" />

一方 <textarea> で既定値を定義したい場合は、以下のように <textarea> 要素の開始タグと終了タグの間に既定値を置かなければなりません:

<textarea>by default this element is filled with this text</textarea>

最後に <button> を追加する

フォームはほぼできあがりました。あとは、ユーザがフォームに記入したらデータを送信するためのボタンを追加します。これは、<button> 要素を使用して簡単にできます:

<form action="/my-handling-form-page" method="post">
    <div>
        <label for="name">Name:</label>
        <input type="text" id="name" />
    </div>
    <div>
        <label for="mail">E-mail:</label>
        <input type="email" id="mail" />
    </div>
    <div>
        <label for="msg">Message:</label>
        <textarea id="msg"></textarea>
    </div>
    
    <div class="button">
        <button type="submit">Send your message</button>
    </div>
</form>

ボタンは 3 種類あります。submitresetbutton です。

  • submit ボタンをクリックするとフォームのデータを、<form> 要素の action 属性で定義した Web ページへ送信します。
  • reset ボタンをクリックすると、直ちにすべてのフォームウィジェットを既定値にリセットします。UX の観点では、このようなボタンはバッドプラクティスであると考えられています。
  • button ボタンをクリックすると...何もしません! おかしなことのように見えますが、JavaScript を使用してカスタムボタンを作成するために驚くほど役立ちます。

<input> 要素で対応するタイプを指定して、ボタンを作成することもできます。<button> 要素との大きな違いは、<input> 要素ではラベルとしてプレーンテキストしか許容しませんが、<button> 要素では HTML を使用できます。

CSS でフォームを少し見栄えよくしましょう

HTML フォームができました。このフォームをお気に入りのブラウザで見ると、見栄えがよくないでしょう。

これから説明する CSS スタイルシートで、いくらか見栄えをよくしましょう。

では始めましょう。フォームを中央に配置して、ボーダーでわかりやすくします:

form {
    /* フォームをページの中央に置く */
    margin: 0 auto;
    width: 400px;
    /* フォームの範囲がわかるようにする */
    padding: 1em;
    border: 1px solid #CCC;
    border-radius: 1em;
}

そして、各フォームウィジェットの間にいくらかスペースを設けます:

form div + div {
    margin-top: 1em;
}

次に、ラベルに注目しましょう。さらにフォームを見やすくするには、すべてのラベルを同じサイズにして、同じ側に揃えるのがよいと考えられます。この例ではラベルを右揃えにしますが、場合によっては左揃えでもかまいません。

label {
    /* すべてのラベルを同じサイズにして、きちんと揃える */
    display: inline-block;
    width: 90px;
    text-align: right;
}

HTML フォームでもっとも難しいことのひとつが、HTML ウィジェット自体のスタイル設定です。テキストフィールドは簡単にスタイルを設定できますが、他のウィジェットでは簡単にできないものがあります。HTML フォームウィジェットへのスタイル設定について詳しく知りたい場合は、HTML フォームへのスタイル設定の記事をご覧ください。

ここでは、一般的なテクニックをいくつか使用します。フォント、サイズ、ボーダーの外見を調和させます:

input, textarea {
    /* すべてのテキストフィールドのフォント設定を一致させる
       デフォルトで、textarea は等幅フォントが設定されている */
    font: 1em sans-serif;

    /* すべてのテキストフィールドを同じサイズにする */
    width: 300px;
    -moz-box-sizing: border-box;
    box-sizing: border-box;

    /* テキストフィールドのボーダーの外見を同一にする */
    border: 1px solid #999;
}

HTML フォームは、各要素の状態を示すための疑似クラスを多数サポートしています。例えば、ウィジェットがアクティブになったときに少し強調するようにします。これは、ユーザがフォーム内のどこにいるかをわかりやすくするために便利な方法です。

input:focus, textarea:focus {
    /* アクティブな要素を少し強調する */
    border-color: #000;
}

複数行のテキストフィールドは、少し特別な対処が必要です。デフォルトで <textarea> 要素は、下端がテキストのベースラインに揃えられるインラインブロックです。ほとんどの場合、これは望ましくありません。この場合にラベルとフィールドをきれいに揃えるには、<textarea>vertical-align プロパティを top に変更しなければなりません。

また、ユーザが <textarea> をリサイズできるようにするために便利な手段である resize プロパティを使用することにも注目してください。

textarea {
    /* 複数行のテキストフィールドをラベルにきちんと揃える */
    vertical-align: top;

    /* テキスト入力に十分な領域を与える */
    height: 5em;

    /* ユーザが textarea を垂直方向にリサイズできるようにする
       これが動作しないブラウザもある */
    resize: vertical;
}

ボタンもまた、特別なスタイルが必要です。フォームの最後で、クラスが button である <div> 要素内にボタンを置いています。ここで、ボタンを他のウィジェットに揃えたいと思います。このためには、<label> が存在するかのようにしなければなりません。これは、パディングやマージンの操作によってできます。

.button {
    /* ボタンを他のテキストフィールドと同じ場所に置く */
    padding-left: 90px; /* label 要素と同じサイズ */
}
button {
    /* このマージンは、ラベルとテキストフィールドの間のスペースと
       おおよそ同じスペースを表す */
    margin-left: .5em;
}

これで、フォームがよりきれいになりました。

データを Web サーバに送信する

最後の、またもっともややこしいであろう部分が、サーバ側でのフォームデータの扱いです。前述のとおりたいてい、HTML フォームはデータをユーザにたずねて Web サーバに送信するために便利な手段です。

<form> 要素は action 属性と method 属性により、どこへどのようにデータを送信するかを定義できます。

しかし、これだけでは不十分です。データに名前をつけることが必要です。これらの名前は両側で重要です。ブラウザ側ではそれぞれのデータにどのような名前をつけるかを示すものであり、サーバ側では名前によってそれぞれのデータを扱うことができます。

よってデータに名前をつけるために、各々のデータを集めるフォームウィジェットの name 属性を使用しなければなりません:

<form action="/my-handling-form-page" method="post">
    <div>
        <label for="name">Name:</label>
        <input type="text" id="name" name="user_name" />
    </div>
    <div>
        <label for="mail">E-mail:</label>
        <input type="email" id="mail" name="user_email" />
    </div>
    <div>
        <label for="msg">Message:</label>
        <textarea id="msg" name="user_message"></textarea>
    </div>
    
    <div class="button">
        <button type="submit">Send your message</button>
    </div>
</form>

この例では、フォームはそれぞれ "user_name"、"user_email"、"user_message" と名付けられた 3 つのデータを送信します。これらのデータは URL "/my-handling-form-page" へ、HTTP の POST メソッドで送信します。

サーバ側では URL "/my-handling-form-page" のスクリプトが、HTTP リクエストに埋め込まれた 3 つのキーおよび値のアイテムリストとしてデータを受け取ります。スクリプトがデータを処理する方法は、あなた次第です。各サーバサイド言語 (PHP、Python、Ruby、Java、C# など) は、これらのデータを扱う仕組みを持っています。これは本ガイドで踏み込んでいく範囲を超えますが、詳しく知りたい場合はフォームデータの送信と取得の記事にサンプルを載せていますのでご覧ください。

結論

おめでとうございます! 初めての HTML フォームが完成しました。こちらが最終結果のデモです。

Live example

さて、より深く見ていくときが来ました。HTML フォームはここで見てきたものよりさらに強力であり、ガイドの他の記事で残りの部分を習得できます。

ドキュメントのタグと貢献者

 このページの貢献者: yyss, Sheppy, ethertank
 最終更新者: yyss,