フォーム入力を快適に！autocompleteの基本とブラウザ別の挙動を整理してみた

# はじめに

この記事は[ZOZO - Qiita Advent Calendar 2024 - Qiita](https://qiita.com/advent-calendar/2024/zozo) の6日目の記事です。

## 記事の内容

- 書いてあること
  - autocompleteの基本概念と主要ブラウザの挙動
- 書いていないこと
  - 詳細な技術的説明や特定の実装方法

# autocompleteについて

## autocompleteとは？
フォームの入力フィールドにブラウザが過去に入力した情報を自動的に補完する機能を提供するための属性です。ユーザーは以前に入力した情報を再度入力する手間を省けます。

[HTML 属性: autocomplete - HTML: ハイパーテキストマークアップ言語 | MDN](https://developer.mozilla.org/ja/docs/Web/HTML/Attributes/autocomplete) によると、autocompleteを指定する際には一緒に以下も揃っている必要があるようです。

>メモ: 自動入力を提供するために、ユーザーエージェントは <input>/<select>/<textarea> 要素に次のことを要求することがあります。
>
>1.name や id 属性を持つこと
>2.<form> 要素の子孫であること
>3.submit ボタンを持っているフォームが所有元であること

## 基本仕様

### autocomplete="〇〇"で設定した〇〇の値に合わせてサジェストされる

以下のコードの場合は電話番号がサジェストされます。

```:html
<input placeholder="電話番号" type="tel" autocomplete="tel">
```

入力できる値については以下をご確認ください。

- [HTML Standard](https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#autofill)
- [HTML 属性: autocomplete - HTML: ハイパーテキストマークアップ言語 | MDN](https://developer.mozilla.org/ja/docs/Web/HTML/Attributes/autocomplete#%E5%80%A4)

### autocompleteについて明示的に記載していない場合はidやnameから推測される

autocomplete＝〇〇を指定していない場合は、`autocomplete="on"`としてみなされ、idやnameから自動的に推測されるため、以下のコードの場合でも電話番号がサジェストされます。

```:html
<input placeholder="電話番号" type="tel" id="tel">
```

自動補完を無効にするためには `autocomplete="off"` を記述する必要がありますが、[フォームの自動補完を無効にするには - ウェブセキュリティ | MDN](https://developer.mozilla.org/ja/docs/Web/Security/Practical_implementation_guides/Turning_off_form_autocompletion) に記載の通り、

>ブラウザーに対して、同様のフォームで自動補完を行うために、ユーザーが入力したデータを保存しないよう指示しますが、実際の動作はブラウザーによって異なります。

とあります。

また、
>autocomplete を off に設定してもブラウザーがサジェスト値を表示し続ける場合は、 input 要素の name 属性を変更する必要があります。

ということもあり、name属性も推測不可能な名称にする必要があり、自動補完を無効にするのが難しい理由の一つです。

# 主要ブラウザのautocompleteについて

**パソコン**
| ブラウザ | autocomplete | 自動入力の設定方法 | 補完項目 |
| ---- | ---- | ---- | ---- |
| Google Chrome | ◯ | [Chrome でフォームに自動入力する - パソコン - Google Chrome ヘルプ](https://support.google.com/chrome/answer/142893?co=GENIE.Platform%3DDesktop&hl=ja) |![スクリーンショット 2024-12-04 19.43.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186755/4deeaeab-dac1-62e5-120b-05e0cc815c1c.png)<br>国/地域<br>郵便番号<br>都道府県<br>番地<br>組織<br>名前<br>電話<br>メール|
| Mozilla Firefox | ◯ | [フォームの自動補完 Firefox ヘルプ](https://support.mozilla.org/ja/kb/control-firefox-automatically-fills-in-forms)|一度入力したフォームの値を記憶する形式|
| Safari | ◯ | [MacのSafariで「自動入力」設定を変更する - Apple サポート (日本)](https://support.apple.com/ja-jp/guide/safari/ibrwa005/mac)| ![スクリーンショット 2024-12-04 19.47.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186755/b995efd5-81ed-bd5c-7afc-c37084675c7e.png)<br>姓・名<br>姓・名（フリガナ）<br>電話<br>メール<br>ユーザー名<br>郵便番号<br>都道府県<br>郡/市区町村<br>以降の住所<br>国/地域|
| Microsoft Edge | ◯ |[Microsoft Edge で情報を自動的に入力する - Microsoft サポート](https://support.microsoft.com/ja-jp/microsoft-edge/microsoft-edge-%E3%81%A7%E6%83%85%E5%A0%B1%E3%82%92%E8%87%AA%E5%8B%95%E7%9A%84%E3%81%AB%E5%85%A5%E5%8A%9B%E3%81%99%E3%82%8B-81da697c-9910-d9b8-d50a-1712d96f3db8)|![スクリーンショット 2024-12-04 20.17.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186755/493b286d-4750-9d74-b790-73b9437101c0.png)名<br>ミドルネーム<br>姓<br>生年月日<br>組織<br>電話<br>メール<br>国/組織<br>郵便番号<br>都道府県<br>番地|

**スマートフォン**

| OS         | ブラウザ       | autocomplete | 自動入力の設定方法 | 補完項目 |
|------------|----------------|--------------|--------------------|----------|
| Android 15 | Google Chrome  | ◯            | Chrome でフォームに自動入力する - Android - Google Chrome ヘルプ |国/地域<br>郵便番号<br>都道府県<br>番地<br>組織<br>名前<br>電話<br>メール|
| iOS 18.0   | Safari         | ◯            | iPhoneのSafariで情報を自動入力する - Apple サポート (日本) | 姓<br>姓（フリガナ）<br>名<br>名（フリガナ）<br>会社<br>会社名（フリガナ）<br>電話<br>メール<br>代名詞<br>URL<br>住所<br>生年月日 |

## 主要ブラウザの挙動について

サンプルとして [Check autocomplete](https://codepen.io/matsumana07384/pen/bNbEMZY) を使って各ブラウザで想定通りの値が入力されるかを確認してみました！

**パソコン**

| 項目           | 指定した値       | Google Chrome<br>バージョン: 131.0.6778.109（Official Build） （arm64） | Mozilla Firefox<br>バージョン 133.0 (64 ビット)  | Safari<br>  バージョン18.1 | Microsoft Edge<br>バージョン 131.0.2903.70 (公式ビルド) (arm64) |
|----------------|------------------|---------------|-----------------|---------------|----------------|
| 姓             | family-name      | ◯ | ー | ◯ |◯ |
| 名             | given-name       | ◯ | ー | ◯ |◯ |
| 郵便番号       | postal-code      | ◯ | ー | ◯ |◯ |
| 住所1          | address-line1    | ◯<br>「番地」に入力した内容が入る| ー | ◯<br>「以降の住所」に入力した内容が入る| ◯<br>「番地」に入力した内容が入る|
| 住所2          | address-line2    | ー | ー |◯<br>2つめの「以降の住所」に入力した内容が入る|✗|
| 電話番号       | tel              | ◯ |  ー | ◯ | ◯ |
| カード番号     | cc-number        | ◯ | ー |  ◯ | ◯ |
| セキュリティコード | cc-csc        | ◯ | ー | ◯ | ー <br>入力欄なし|
| 有効期限（年） | cc-exp-year      | ◯ |  ー | ◯ | ◯ |
| 有効期限（月） | cc-exp-month     | ◯ |  ー | ◯ | ◯ |

**スマホ**

検証環境


| 項目           | 指定した値       | Android Chrome<br>Chrome 131.0.6778.82 | iPhone Safari |
|----------------|------------------|----------------|---------------|
| 姓             | family-name      | ◯ | ◯ |
| 名             | given-name       | ◯ | ◯ |
| 郵便番号       | postal-code      | ◯ | ◯ |
| 住所1          | address-line1    |◯<br>「番地」に入力した内容が入る| ◯<br>「以降の住所」に入力した内容が入る|
| 住所2          | address-line2    |◯<br>「番地」に入力かつ改行していると入る| ◯<br>2つめの「以降の住所」に入力した内容が入る|
| 電話番号       | tel              | ◯ | ◯ |
| カード番号     | cc-number        | ◯ | ◯ |
| セキュリティコード | cc-csc        | ◯ | ◯ |
| 有効期限（年） | cc-exp-year      | ◯ | ◯ |
| 有効期限（月） | cc-exp-month     | ◯ | ◯ |

概ねどの値も想定通りに値が入ることを確認できました。

# おわりに

いかがでしたでしょうか？
autocompleteについては、一度2020年頃に社内向けで調査したものを今回、再調査してまとめたのですが、当時は海外の文化の関係で姓名が逆転していたり、電話番号についての設定も`tel`しかなく、国際番号が入ってしまって使いにくい印象がありました。ですが、姓名の逆転が解消されていたり、電話番号に指定できる値も増えていて、より便利になってきている印象を受けました。
autocompleteについてはうまくいかないことも多いですが、ユーザーの利便性向上のために頑張っていきたいものです。

この記事で紹介したautocompleteの設定をぜひご自身のプロジェクトでも試してみてください！
もっと詳しく学びたい方は、以下の参考サイトをご覧ください。

# 参考サイト
- [HTML 属性: autocomplete - HTML: ハイパーテキストマークアップ言語 | MDN](https://developer.mozilla.org/ja/docs/Web/HTML/Attributes/autocomplete)
- [フォームの自動補完を無効にするには - ウェブセキュリティ | MDN](https://developer.mozilla.org/ja/docs/Web/Security/Practical_implementation_guides/Turning_off_form_autocompletion)
- [Learn Forms  |  web.dev](https://web.dev/learn/forms#%E6%8E%A8%E5%A5%A8%E5%85%A5%E5%8A%9B_name_%E3%81%8A%E3%82%88%E3%81%B3_autocomplete_%E5%B1%9E%E6%80%A7%E5%80%A4)
- [Creating Amazing Forms: Sample order form](https://googlesamples.github.io/web-fundamentals/fundamentals/design-and-ux/input/forms/order.html)
- [ブラウザのパスワード保存と自動フィルイン - Cybozu Inside Out | サイボウズエンジニアのブログ](https://blog.cybozu.io/entry/7452)