HTML5 の入力型

前の記事では <input> 要素を見てきて、 HTML の初期から利用できる type 属性の値をカバーしてきました。ここでは最近のフォームコントロールの機能、特定のデータを集めるのに HTML5 で追加された、新しい入力型を詳しく見ていきましょう。

前提条件: 基本的な HTML の理解
目的: ネイティブフォームコントロールで利用できる新しい入力型の理解と、 HTML を用いた実装方法。

メモ: この記事のたいていの機能はブラウザー間で広く対応されています。例外は注記しておきます。ブラウザーの対応についての詳細は、HTML フォーム要素のリファレンス、特に <input> 型リファレンスを見てください。

HTML フォームコントロールの見た目はデザイナーの仕様により全く異なるため、ウェブ開発者はときどき独自のフォームコントロールを作成します。これは上級のチュートリアル — カスタムフォームウィジェットの作成方法 — で扱います。

メールアドレスフィールド

このフィールド型は type 属性の email の値に設定されます。

html
<input type="email" id="email" name="email" />

この type が使われたとき、ユーザーは有効なメールアドレスをフィールドに入力することが必須です。その他のコンテンツでは、ブラウザーによってフォーム送信時にエラーが表示されます。この動作は下記のスクリーンショットで見ることができます。

"Please enter an email address." というメッセージを表示している無効なメール入力欄

email 入力型と multiple 属性を組み合わせて、複数のメールアドレスが同じ入力に(カンマ区切りで)入力させることもできます。

html
<input type="email" id="email" name="email" multiple />

いくつかの端末 — 特にスマートフォンのような動的キーボードつきのタッチ端末 — では、 @ キーを含むメールアドレス入力に適した別の仮想キーパッドが現れることもあります。Android 版 Firefox のキーボードの例として下記のスクリーンショットを見てください。

既定でアットマークが付いている、 Android 版 Firefox のメールアドレス入力キーボード

メモ: 基本的なテキスト入力型の例は basic input の例にあります(ソースコード も見てください)。

これは新しい入力型を使う良い理由であり、こうした端末のユーザーの使い勝手を向上させます。

クライアント側の検証

上で見てきたように、他の新しい input 型と同様に、email は組み込みのクライアント側のエラー検証 — データがサーバーに送られる前にブラウザーで実行されるもの — があります。これはユーザーが正確に入力するのに役立ち、時間を短縮できます — データが正しくないことをサーバーとのラウンドトリップを待つことなくすぐに知ることは便利です。

しかしこれは完全なセキュリティ対策と考えるべきではありません! アプリは送信データのセキュリティ確認をクライアント側と同様にサーバー側でも行うべきで、なぜならクライアント側の検証は簡単にオフにできるため悪意のあるユーザーは簡単にサーバーに不正なデータを送信できるためです。起こりうることについてはウェブサイトセキュリティを読んで下さい。サーバー側の検証を実装するのはこのモジュールの範囲を超えていますが、記憶しておくべきです。

既定の制約では a@b は有効なメールアドレスです。これは既定では email 入力型はイントラネットのメールアドレスを許可しているためです。異なる検証動作を実装するには、pattern 属性を用いたり、エラーメッセージをカスタムできます。この機能の使い方は後の クライアント側の検証の記事で話します。

メモ: 入力データがメールアドレスでない場合、:invalid 擬似クラスがマッチして、validityState.typeMismatch プロパティは true を返します。

検索フィールド

検索フィールドは、ページやアプリの検索ボックス作成に使われるものです。このフィールド型は search の値を type 属性のに使用することで設定されます。

html
<input type="search" id="search" name="search" />

text フィールドと search フィールドの主な違いは、ブラウザーの見た目のスタイル設定方法です。よく、search フィールドは角丸で描画されます。また時折、値がクリックされたときに値をクリアする "Ⓧ" も表示されます。その他、動的キーボードのある端末では、キーボードの Enter キーが "検索"、あるいは虫眼鏡アイコンで表示されることもあります。

下記のスクリーンショットでは macOS での Firefox 71, Safari 13, Chrome 79 と Windoes10 での Edge 18 と Chrome 79 での文字が入った検索フィールドを表示しています。注意として、クリアのアイコンはフィールドに値が入った場合のみ表示され、Safari を除いてフィールドにフォーカスが当たった場合のみ表示されます。

様々なプラットフォームの検索フィールドのスクリーンショット

もう 1 つの注目すべき機能として、search フィールドの値は同一サイトの複数ページにまたがって、自動保存してオートコンプリートすることができます。これはたいていのモダンブラウザーでは自動的に起こる傾向があります

電話番号フィールド

電話番号を入力するための特殊なフィールドは、 tel の値を type 属性に使うと作成することができます。

html
<input type="tel" id="tel" name="tel" />

動的キーボードつきのタッチ端末でアクセスしたとき、たいていの端末では type="tel" が出てくると数字のキーパッドを表示します。つまりこの型は、テンキーが役立つときはいつでも有用であり、電話番号だけに使用する必要はありません。

下記は Android 用 Firefox キーボードの例です。

Android 用 Firefox の電話番号キーボードの例で、既定でアスタリスクが表示されています。

世界中にはいろいろな電話番号の書式があるため、このフィールドはユーザーが入力した値に制約を一切つけません(つまり、文字が入っていることもありえます)。

前に触れた通り、 pattern 属性が制約を強化するのに使われます。これはクライアント側検証で学びます。

URL フィールド

URL を入力するための特殊な型のフィールドは、 url の値をtype 属性に使うと作成することができます。

html
<input type="url" id="url" name="url" />

これはフィールドに特別な検証制約を追加します。ブラウザーは (http:のような) プロトコルがない場合や、URL の形式が良くない場合にエラーを報告します。動的キーボードのある端末ではよく、コロン、ピリオド、スラッシュの複数やすべてをデフォルトキーとして表示します。

例は下記のものを見てください(Android 用 Firefox の例)。

Android 用 Firefox の URL キーボードの例で、既定でスラッシュが表示されています。

メモ: URL が正しい形式であっても、それが必ずしも実際存在する場所を参照しているとは限りません。

数値フィールド

数値入力用のコントロールは、 <input> typenumber を指定して作成することができます。このコントロールはテキストフィールドのような見た目ですが、浮動小数値のみを許可し、通常は数値を増減するためのスピナー形式のボタンがあります。動的キーボードつきの端末では、一般的に数値キーボードが表示されます。

下記のスクリーンショット (Android 用 Firefox より) に例があります。

Firefox for Android email keyboard, with ampersand displayed by default.

number 入力型では、minmax 属性を設定することで最小値と最大値の制約をつけることができます。

スピナーボタンを押すことで増減させる増分を接とするのに step 属性を使うこともできます。既定では、 number 入力型は数値が整数値の場合のみ検証します。浮動小数を許可するには、 step="any" を指定します。省略された場合、step 値は既定で 1 となり、つまりすべての数値が有効です。

いくつか例を見てみましょう。次の最初の例では値が 110 の間に制限され、増減ボタンで値が 2 ずつ変更される数値コントロールを作成しています。

html
<input type="number" name="age" id="age" min="1" max="10" step="2" />

2 つ目の例では値が 01 の間に制限され、増減ボタンで値が 0.01 ずつ変更される数値コントロールを作成しています。

html
<input type="number" name="change" id="pennies" min="0" max="1" step="0.01" />

number 入力型は有効な値の範囲に制限されているときに意味を持ちます。例えば、ある人の年齢や身長です。範囲が大きすぎて増分が意味をなさない場合 (例えば USA の郵便番号は、00001 から 99999 の範囲です)、tel 型がより良い選択となることもあります。これは数値のスピナー UI 機能に対して、数値キーパッドを提供します。

スライダーコントロール

数字を選ぶもう 1 つの方法はスライダーです。家造りのようなサイトで資産の価格をフィルターするのによく見ることでしょう。これを示す例をライブで見てみましょう。

使用からすると、スライダーはテキストフィールドより不正確です。このため、正確な値が必ずしも重要でない数値の選択に使われます。

スライダーは <input>type 属性を range にセットして作成します。スライダーはマウスやタッチや、キーパッドの矢印で移動できます。

スライダーを適切に設定するのは重要です。そのためには、それぞれ最小、最大、増分値を設定する min, max, step 属性を設定するのを強くお奨めします。

上の例の背後にあるコードを見て、どのように実現されるかを見てみましょう。まずは基本となる HTML です。

html
<label for="price">Choose a maximum house price: </label>
<input
  type="range"
  name="price"
  id="price"
  min="50000"
  max="500000"
  step="100"
  value="250000" />
<output class="price-output" for="price"></output>

この例では、値が 50000500000 までの範囲で、100 ずつ増減するスライダーを作成しています。既定の値は value 属性を使って 250000 としています。

スライダーについての問題は、現在の値がいくつなのかのフィードバックが一切ないことです。これは、現在の値を入れている <output> 要素を導入する理由です (この要素は次の記事でも見ていきます)。入力値や、あらゆる要素内の計算結果を表示できますが、<output> は特別です — <label>のように — for 属性を取って要素や出力値の元となる要素と関連付けることができます。

実際に現在の値を表示して、変更時に更新するには、JavaScript を使う必要がありますが、比較的に簡単です。

js
const price = document.querySelector("#price");
const output = document.querySelector(".price-output");

output.textContent = price.value;

price.addEventListener("input", () => {
  output.textContent = price.value;
});

ここでは range 入力と output を 2 つの変数に保存しています。次に outputtextContent を入力の value ですぐにセットします。最後に、イベントリスナーをセットして、range スライダーが移動するといつも、outputtextContent を新しい値に更新します。

メモ: CSS Tricks に、このテーマに応じた素晴らしいチュートリアルがあります。 The Output Element です。

日付と時刻ピッカー

日付と時刻の値を収集することは、ウェブ開発者にとってずっと悪夢でした。良い使い勝手を実現するには、カレンダーを選択する UI を提供することが重要です。これにより、ユーザーはネイティブのカレンダーアプリケーションに切り替えることなく日付を選択でき、解釈しにくいさまざまな形式で日付を入力できる可能性があります。前千世紀の最後の 1 分は、例えば 1999/12/31 23:59 や 12/31/99T11:59PM のように、様々な方法で入力される可能性があります。

HTML の日付コントロールは、カレンダーウィジェットを提供して統一されたデータを作成し、この種類のデータを扱うことができます。

日付と時刻コントロールは <input> 要素と、日付か時間かその両方かを集めたいのかにあわせて適当な type 属性を使って作成できます。対応していないブラウザーにおいて、 <select> 要素で代替する場合の実行例は次の通りです。

利用できるいろいろな型を簡単に見ていきましょう。注意としては、この型の使用法はとても複雑で、特にブラウザーの対応考えたに場合そうです(下記を見てください)。完全な詳細情報は、それぞれの型のリファレンスページと、そこにある詳細な例を見てください。

datetime-local

<input type="datetime-local"> は特定のタイムゾーン情報のない日付と時刻を表示して選択するウィジェットを作成します。

html
<input type="datetime-local" name="datetime" id="datetime" />

month

<input type="month"> は年と月を表示して選択するウィジェットを作成します。

html
<input type="month" name="month" id="month" />

time

<input type="time"> は時刻の値を表示して選択するウィジェットを作成します。時刻は 12 時間のフォーマットで表示されますが、返値は 24 時間フォーマットです。

html
<input type="time" name="time" id="time" />

week

<input type="week"> は本年の週の番号を表示して選択するウィジェットを作成します。

週は月曜始まりで日曜日で終わります。それに加えて、その年の最初の週はその年の最初の木曜日を含みます—これはその年の最初の日を含まないことも、前年の最後の数日を含むこともあります。

html
<input type="week" name="week" id="week" />

date/time 値の制限

日付をと時刻のコントロールはすべて、minmax 属性で制約をつけることができて、さらに step 属性 (この値は入力型によって変わります)で追加の制約も可能です。

html
<label for="myDate">When are you available this summer?</label>
<input
  type="date"
  name="myDate"
  min="2013-06-01"
  max="2013-08-31"
  step="7"
  id="myDate" />

色選択コントロール

色も扱いが難しいです。色の表現がたくさんあります。 RGB 値(10 進数や 16 進数)、HSL 値、キーワードなどです。

color コントロールは <input> 要素を、 type 属性に colorをつけて作成できます。

html
<input type="color" name="color" id="color" />

通常、色コントロールをクリックすると、選択するためにオペレーティングシステムで既定の色選択機能が表示されます。

次のライブサンプルも試してみてください。

返値は常に小文字で 6 桁の 16 進数の色です。

スキルテスト

この記事の最後に達しましたが、最も大切な情報を覚えていますか?次に進む前に、この情報が身に付いたかどうかを確認するテストがあります。スキルテスト: HTML5 のコントロールを見てください。

まとめ

これで、HTML5 フォーム入力型のツアーは終わりです。他にもいくつかコントロール型があり、その動作がとても特殊なため簡単にまとめることはできませんが、知っておく必要があります。次の記事でそれらに応じて説明します。

高度なトピック