input 要素の type 属性を text に設定しておくと、単純なテキスト入力フィールドが表示されますが、下記のように、より具体的な入力データの種類を設定しておくこともできます。
上記のような値を type 属性に設定しておくと、それぞれのデータ入力に適した UI を表示してくれたり、入力したテキストのフォーマットをチェックしてくれたりするようになります(振る舞いは Web ブラウザによって多少異なります)。
例えば、type 属性を email に設定しておくと、入力したテキストに @ が含まれていない場合に警告メッセージを表示してくれるようになります。
<label>E-mail <input type="email"></label>
input 要素の pattern 属性を使用すると、独自の入力フォーマットを設定することができます。
pattern 属性で指定するパターン文字列は、JavaScript の正規表現 エンジンで処理されます。
下記の例では、「ユーザ ID」と「日付」のフィールドに、独自の入力フォーマットを設定しています(「メール」のフィールドには pattern 属性を指定していないため、type="email" 用のデフォルトの入力フォーマットが使用されます)。
<label>
ユーザーID:
<input type="text" name="userid" pattern="^[0-9A-Za-z]+$" required>
(半角英数)※必須
</label><br>
<label>
メール:
<input type="email" required>
※必須
</label><br>
<label>
日付:
<input type="text" pattern="\d\d\d\d-\d\d-\d\d">
(YYYY-MM-DD)
</label><br>
pattern 属性はテキスト系の入力フィールドに対して使用するもののため、type 属性の値が text、search、tel、url、email、password である場合のみ機能します(それ以外のケースでは無視されます)。
CSS の疑似クラスである :valid と :invalid を使用すると、input 要素に入力したテキストが、pattern 属性で指定したフォーマットに合致しているかどうかに応じてスタイルを適用することができます。
下記の例では、input 要素に入力したテキストが、フォーマットを満たしていない場合に背景色がピンクになるように設定しています。
input[type=text]:invalid, input[type=email]:invalid {
background: pink;
}
type 属性が email に設定されている input 要素の場合は、デフォルトで組み込まれているメールアドレス用のフォーマットで入力チェックが行われます。
pattern 属性で独自の入力フォーマットを指定した場合は、そちらを利用して入力チェックが行われます。
下記の表示サンプルでは、初期状態で「ユーザ ID」と「メール」の入力フィールドが invalid 状態になっていると思います。
これは、それらの input 要素に required 属性が設定されているからです。
入力が必須とされているフィールドに何も入力されていない場合は、invalid 状態とみなされます。