ブラウザのキーボードを制御する inputmode

html
tomoyukikashiro
tomoyukikashiro

input[type]によるキーボードの表示制御

Googleの記事、web foundamentals 最適なフォームの作成では、type属性による入力しやすいキーボードの表示コントロールが説明されていました。

例えば、type="email"を指定すると、

<input type="email">

emailが入力しやすいキーボードが表示されます。

type=emailを指定したキーボード表示の例

しかし、この指定方法には副作用もありました。
例えば、type="number" を指定した場合、

<input type="number">

このように、入力フィールド内に余計な入力補助要素 が表示したり、フィールドにhoverした状態でmouse wheelを動かすと 入力済みの値が勝手に増減 したりします。

input=numberを指定した入力フィールドの表示

前者はCSSで後者はJavaScriptで無効化することは可能ですが、気軽に使うことができませんでした。

inputmodeとは

開発者向けのウェブ技術 > HTML: HyperText Markup Language > グローバル属性 > inputmode

inputmode はグローバル属性で、ユーザーが要素やその内容を編集する際に入力されるデータの型のヒントを提供する列挙型属性です。下記の値が存在します。

type属性を利用せず、キーボードだけを制御する属性です。
指定内容は、 none, text, decimal, numeric, tel, search, email, url でそれぞれブラウザ別にどのようにキーボードが表示するかみてみましょう。確認したブラウザは、以下です。

  • Safari - iOS 13 iPhone 8 (simulator)
  • Chrome - Android 10 Pixel 3a
  • Chrome - windows 10 Surface Go (タブレット)

また、下記でも確認しましたが、まだinputmode非対応だったためキーボードは制御できませんでした。

  • Edge - windows 10 Surface Go (タブレット)

inputmode=none

<input type="text" inputmode="none">

アプリケーション固有の入力インターフェイスを用意しているときに、システムのキーボードを表示させない指定ですが、

  • Safari - iOS 13 iPhone 8 (simulator)
  • Edge - windows 10 Surface Go (タブレット)
  • Chrome - windows 10 Surface Go (タブレット)

これらブラウザではキーボードが表示してました。

inputmode=text

<input type="text" inputmode="text">

iOS safari / Android Chrome inputmode=text
windows10 Surface Go Chrome inputmode=text

inputmode=decimal

<input type="text" inputmode="decimal">

inputmode=text とは異なり数値が入力しやすいキーボードになっています。
また、小数点を入力できるように、 . も表示しています。

iOS safari / Android Chrome inputmode=decimal
windows10 Surface Go Chrome inputmode=decimal

inputmode=numeric

<input type="text" inputmode="numeric">

Androidは inputmode=decimal と同様ですが、iOSは、. が表示してなくより numeric(整数) 入力に最適されているのがわかります。

iOS safari / Android Chrome inputmode=numeric
windows10 Surface Go Chrome inputmode=numeric

inputmode=tel

<input type="text" inputmode="tel">

電話番号を入力しやすいように、inputmode=muneric と違い +*# が表示しています。

iOS safari / Android Chrome inputmode=tel
windows10 Surface Go Chrome inputmode=tel

inputmode=search

<input type="text" inputmode="search">

見た感じ、inputmode=text と同じでした。
Androidはエンターキーの見た目だけちょっと違うみたいです。

iOS safari / Android Chrome inputmode=search
windows10 Surface Go Chrome inputmode=search

inputmode=email

<input type="text" inputmode="email">

Emailが入力しやすいように アルファベットと@ が表示しています。

iOS safari / Android Chrome inputmode=email
windows10 Surface Go Chrome inputmode=email

inputmode=url

<input type="text" inputmode="url">

URLが入力しやすいように /.com が表示されています。

iOS safari / Android Chrome inputmode=url
windows10 Surface Go Chrome inputmode=url

注意点

キーボード表示を制御できますが、入力値そのものを制御できるわけではありません。
例えば inputmode=email でemailが入力しやすいキーボードにはなりますが、emailとしてinvalidな文字の入力を禁止することはできませんので、今まで通りバリデーションはアプリケーション側で行いましょう。

ブラウザサポート

https://caniuse.com/#feat=input-inputmode

デモ

https://codepen.io/Tkashiro/full/dyyROPJ