1ページ完結型 フォーム

見本の中のメニューやボタンは押して動きを試せます(リンク先へは移動しません)。

すべての入力欄を1つの画面に並べ、その場で送信します。項目が10個くらいまでのお問い合わせなら、まずこの形から考えます。

自分のサイトの中身で、この形を作らせる指示文です。最初の「サイトの情報」を書き換えてから渡します。今あるページを直させるときは、その HTML を貼ります。

この形で作る
# サイトの情報(ここを書き換える)
- どんなサイトか:〈例:工務店のサイト、税理士事務所のサイト、ネットショップ〉
- 入れたい文言・項目:〈見出し・ボタンの文言・項目の数など。決まっていなければ空けてよい〉
- 今あるページ:〈今のページを直すなら、その HTML を貼る。新しく作るなら空ける〉

# 作ってほしいもの
1ページ完結型のお問い合わせフォーム(Single-page form)。すべての入力欄を1つの画面に並べ、その場で送信する。

# 並べるもの(上から)
- 見出しと、返事までの目安
- お名前(必須)/メールアドレス(必須)/電話番号(任意)/ご用件(必須・select:制作のご相談/お見積もり/そのほか)/お問い合わせ内容(必須・textarea 5行)
- 個人情報の取り扱いへの同意(必須・チェックボックス)
- 送信ボタン

# 守ってほしいこと
- 各欄に label を付け、for と id で結ぶ。label の右に「必須」「任意」を文字の小さな札で示す(色だけ・* だけにしない)
- input には type と autocomplete を付ける(name・email・tel)。文字の大きさは 16px 以上、入力欄と送信ボタンの高さは 44px 以上
- 送信を押したら、未入力の欄に aria-invalid="true" を付け、欄のすぐ下にエラー文を出して aria-describedby で結ぶ
- フォームの上に「◯か所、入力を直してください」とエラーのまとめを出し、role="alert" で読み上げる。まとめの各行を押すと、その欄へ移る
- エラーを直したら、その欄のエラーはすぐ消す
- form には novalidate を付け、ブラウザの吹き出しではなく自前のエラー文を出す。送信は e.preventDefault() で止め、送れたら「送信しました」をボタンの近くに出す

# SP(画面幅 599px 以下)
- PC では項目名を左の列(幅 200px)、入力欄を右の列に並べる。SP では項目名を入力欄の上に置いて1列にする
- 送信ボタンは横幅いっぱいにする

# 出力
- HTML・CSS・JavaScript を分けて出す。ライブラリは使わない
- 色は CSS 変数(--accent など)にまとめ、あとから変えやすくする
- 文言は「サイトの情報」に合わせて考える。決まっていないところは〈 〉で囲んだ仮の文言にする
- 「並べるもの」に書いた項目の名前(エリア・間取りなど)は一例。サイトに合うものに置き換える
- 今あるページを渡したときは、そのページの色・文字・余白に合わせ、変えた場所を最後に箇条書きで知らせる

フォームを11の型に分け、AIへの指示文・動く見本・コードを載せています。

フォームはどの型を選ぶか

フォームの型は、1つを選ぶというより、組み合わせて使います。まず土台を項目の数と相手の違いで決め(1ページ完結型・ステップ分割型・条件分岐型)、そこに入力を手助けする工夫と、送る前後の画面を足します。項目が10個くらいまでなら1ページ完結型から始め、エラーはその場で知らせ、送信のあとは完了の表示を出す、が手堅い組み合わせです。

こんなとき 向いている型
項目が10個くらいまでのお問い合わせ1ページ完結型
メールアドレス・パスワード・郵便番号など、書き方に決まりがあるその場エラー表示型
住所を書いてもらう(通販・郵送・会員登録)住所自動入力型
申し込みや注文など、送ったあとで取り消しにくい確認画面型
送ったあと、連絡を待ってもらう送信完了型(どの型にも組み合わせる)
送れたことを、チェックが描かれる動きで伝えたいアニメーション集のチェックマークアニメーション(SVG・図形の動き)
項目が多く、一度に見せると書く気がなくなりそうステップ分割型
個人と法人など、相手によって聞くことが変わる条件分岐型
長い文章を書いてもらい、途中で閉じられやすい途中保存型
書類や写真を送ってもらうファイル添付型
時間の枠で予約を受け付ける日時予約型
料金や納期など、同じ質問が何度も届くFAQ併設型

送信が済んだときに紙吹雪を1回だけ舞わせる方法は、アニメーション集のインタラクションの動き(紙吹雪が舞う)にあります。

その場エラー表示型・住所自動入力型・送信完了型・途中保存型・FAQ併設型は、土台に足す型なので、1ページ完結型かステップ分割型を土台にして、その上に足して使います。

どの型でも守ること

  1. 項目名は label で入力欄の外に置く。placeholder を項目名の代わりにすると、書き始めた途端に何の欄か見えなくなります。for と id で結ぶと、項目名を押しても欄に移れます。
  2. 必須か任意かは、言葉で書いて示す。* の印や色だけに頼ると、見落とす人がいます。任意の項目が多いなら、そもそも聞かなくてよいかを見直します。
  3. エラーは欄のすぐ下に、直し方まで書く。間違いのある欄を aria-invalid="true" にし、aria-describedby でエラー文の id を指しておけば、読み上げソフトでも内容が伝わります。
  4. 入力欄の font-size は 16px 以上、押せる部分は 44px 前後にする。それより小さい欄を iPhone で押すと、画面が勝手にズームします。type と autocomplete を付けると、合うキーボードと自動入力が使えます。
  5. 送信のあとは、押した場所の近くで結果を知らせる。送っている間はボタンを押せなくして二重送信を防ぎ、送れたら完了の文や画面に切り替えます。

よくある質問 (FAQ)

決まった数はなく、返事をするのに本当に要る項目だけに絞ります。ふつうの問い合わせでは、たいていお名前と連絡先、用件の3項目で間に合います。会社名や住所は、要るときにあとから聞けます。どうしても10個を超えるなら、ステップ分割型で段階に分けます。

送ったあとで取り消しにくい申し込みや注文なら、はさむと安心です。項目が少ないお問い合わせなら、確認画面をはさまず、その場でエラーを知らせて、送信後に完了の表示を出すだけで足ります。確認画面をはさむときは「まだ送信されていません」と書き、修正のために戻ったとき、入れた内容がそのまま残っているようにします。

入力欄を離れたときに調べ、送信を押したときにもう一度まとめて調べるのが基本です。1文字打つごとに調べると、書き終わる前にエラーが出てしまいます。一度エラーが出た欄だけは、入力のたびに調べ直して、直った時点でエラーを消します。

「必須」と文字で書くほうが確実です。* は意味を知らない人がいて、読み上げソフトでは「アスタリスク」と読まれます。* を使うなら、フォームの最初に「* は必須の項目です」と書き添えます。どちらの場合も、入力欄には required を付けておきます。