項目数の多いフォームではグループ化を活用しよう
開発環境
- HTML / React 19
前提
ECサイトや申し込みフォームなど、項目数が多いフォームを実装する機会がありました。
最初はデザインに従ってラベルと入力欄を素直に並べていたのですが、レビューで「ユーザーが途中で離脱しやすい」と指摘を受けました。
原因を考えたとき、「このフォームは何を聞いているのか」がページを見た瞬間にわからない状態になっていたことに気づきました。
本題
ラベルの羅列は不安を生む
⚠️ たとえばこういうフォームを想像してください。
氏名
メールアドレス
電話番号
郵便番号
都道府県
市区町村
番地
カード番号
有効期限
セキュリティコード入力項目としては正確でも、ユーザー視点では「このフォーム、何を入力させようとしている?」という状態です。
特に初めて訪れたユーザーは、全体を見渡してから入力を始めます。このとき「なんのためにこれを聞かれているか」がわからないと、入力をためらったり、途中で離脱したりします。
グループ見出しで「目的」を示す
🛠 フィールドをグループにまとめ、各グループに見出しをつけるだけで印象が変わります。
## お客様情報
氏名
メールアドレス
電話番号
## お届け先
郵便番号
都道府県
市区町村
番地
## お支払い情報
カード番号
有効期限
セキュリティコード👉 ユーザーは「自分の連絡先を入力する」「届け先を指定する」「支払い方法を登録する」という目的を理解しながら進められます。
HTML では fieldset と legend が使える
グループ化はセマンティクスの面でも意味があります。
<fieldset>
<legend>お届け先</legend>
<label>
郵便番号
<input type="text" name="postalCode" />
</label>
<label>
都道府県
<input type="text" name="prefecture" />
</label>
</fieldset>fieldset と legend を使うと、スクリーンリーダーがグループ名を読み上げるため、アクセシビリティの観点でも有効です。
React で実装する場合も同様で、グループごとにコンポーネントを分けて見出しを持たせる構成が自然です。
const DeliverySection = () => (
<fieldset>
<legend>お届け先</legend>
<PostalCodeField />
<PrefectureField />
<CityField />
<AddressLineField />
</fieldset>
);グループ名は「ユーザーの行為」で名付ける
見出しをつけるとき、システム寄りの名前(「配送先情報」「決済情報」)より、ユーザーの行為に近い言葉(「お届け先」「お支払い方法」)のほうが直感的です。
- システム寄り:「配送先情報を入力してください」
- ユーザー寄り:「お届け先」
言葉ひとつで、フォームの雰囲気がかなり変わります。
さいごに
項目数の多いフォームで離脱を減らしたいなら、まず「ユーザーがこのフォームの全体像を把握できているか」を確認するといいと思います。
グループ化と見出しはシンプルな施策ですが、「なんのために入力するか」がわかるだけで、ユーザーの不安はかなり和らぎます。
実装コストが低い割に効果を感じやすいので、項目が増えてきたタイミングで一度見直してみてください。