HTMLの<input type="tel">
は、電話番号の入力フィールドを設置するために使います。
<form>
<input type="tel" placeholder="電話番号">
<button type="submit">送信</button>
</form>
type="tel"を使うメリット
番号入力用のキーボードが開く
<input type="text">
を電話番号入力欄にすることももちろんできますが、その場合Android・iOSのモバイル端末では通常の文字列入力用キーボードが表示されます。
ユーザーがいちいちキーボードを切り替えなくても良くなるわけですね。電話番号入力欄にtype="tel"
を使うべき1番の理由はユーザー体験向上のためです。
場合によっては、ブラウザやアプリケーションが「電話番号の入力欄であること」を把握でき、電話番号の自動補完などを行ってくれるかもしれません。
エラーチェックはしてくれない
注意したいのはtype="tel"
を使っても「電話番号として正しい形式になっているか」などのエラーチェックはしてくれません。デフォルトでは全角文字や記号も送信できてしまいます。
正確性を求めるのであれば、JavaScriptによるバリデーションや、後述のpattern
属性によりエラーチェックしましょう。
type="email"
やtype="url"
なら「正しいメールアドレスの形式か」「正しいURLの形式か」をチェックしてくれます。
type="tel"の属性
ここではよく使う属性を中心に紹介します。
pattern:使用可能な文字や桁数を指定する
pattern
属性を使えば、正規表現で使用可能な文字列や有効な桁数を指定できます(正規表現にマッチしない入力をエラーとみなしてくれます)。
数字とハイフンだけを許容する例
pattern="[\d\-]*"
<form>
<input
type="tel"
name="tel"
pattern="[\d\-]*"
>
<button>送信する</button>
</form>
👆半角数字とハイフン-
以外を送信しようとするとエラーになります。
桁数まで制限する例
pattern="\d{2,4}-\d{3,4}-\d{3,4}"
<form>
<input
type="tel"
name="tel"
pattern="\d{2,4}-\d{3,4}-\d{3,4}"
>
<button>送信する</button>
</form>
👆このように指定すると「2〜4桁の数字-
3〜4桁の数字-
3〜4桁の数字」という具体的な制限になります。
リアルタイムでエラーメッセージを表示する
ブラウザによるエラーメッセージは送信時にのみ表示されます。しかし、ちょっとしたCSSのテクニックによりリアルタイムでエラー表示できます。
<input type="tel" name="tel" pattern="\d{2,4}-\d{3,4}-\d{3,4}">
<div class="error">正しい形式の電話番号を入力してください</div>
電話番号の形式になっていないとエラーメッセージが表示
👆CSSの:invalidを使えば、エラーの検知されているフィールドのスタイルを変えることができます。これに隣接セレクタ[1]を組み合わせることで、ユーザーの入力に対してリアルタイムでエラーメッセージを表示できます。
具体的には、エラーが検知されているフィールド(input:invalid
)の隣にあるエラーメッセージ(.error
)を表示しています。
patternの注意点
- 送信時にエラーチェックするためには
<form>
の中に<input>
と送信ボタンを入れる必要があります。 - あくまでブラウザ上だけのチェックです。多少のHTMLの知識がある人ならサーバーに好きな文字列を送れてしまいます。できればサーバー側でもバリデーションするのが良いでしょう。
maxlength:入力可能な最大文字数を指定する
<input type="tel" name="tel" pattern="[\d\-]*" maxlength="11">
👆maxlength
を使えば、入力可能な文字数を制限できます。たとえばハイフンなしで入力してもらう場合、日本の電話番号ならmaxlength="11"
になるでしょう。
<form>
<input type="tel" name="tel" pattern="[\d\-]*" maxlength="11">
<button>送信する</button>
</form>
11桁以上入力しようとしても反応しない
minlength:最小文字数を指定する
逆にminlength
により最小文字数を指定できます。ただpattern
で文字数制限をしている場合は不要です。
maxlength
は指定文字数以上の入力を無効化(入力してもフィールドが反応しない状態)にしてくれるため、pattern
と合わせて使うメリットがあります。
required:入力必須にする
<input type="tel" name="tel" pattern="[\d\-]*" required>
👆フィールドを必須入力にしたい場合は、required
属性を指定しましょう。
その他よく使う属性
name
:フィールドの名前を指定placeholder
:プレースホルダーを指定size
:入力欄の幅を指定(デフォルトは20)autofocus
:ページ読み込み時にフォーカスをあてる
基本的にtype="text"
と同じ属性が使えます。詳しくは下記のページをチェックしてみてください。
要素A + 要素B { ~ }
とすれば、要素Aのとなりの要素Bに対してのみスタイルをあてることができます。 ↩︎
一方
type="tel"
を使うと、モバイル端末で入力欄にフォーカスが当たったときに、数字入力のキーボードを表示してくれます。