ui
floating label
入力欄にフォーカスすると、プレースホルダー位置のラベルが上に浮き上がって縮む定番フォーム演出。ラベルが常に残るためプレースホルダー消失問題が起きない。フォーカスだけでなく「記入済み」判定まで入れて初めて完成する。
02 — Prompt template
03 — Params
duration(浮き上がり時間 s) — 範囲 0.1〜0.5 / 初期 0.2
0.15〜0.25sが目安。入力操作への応答なので、0.3sを超えるとワンテンポ遅れて感じる。rise(浮き上がり量 px) — 範囲 12〜32 / 初期 22
上に移動する距離。ラベルの中心が入力枠の上辺に乗るあたりが収まりがよい。scale(縮小率) — 範囲 0.6〜0.9 / 初期 0.75
浮いた後のラベルの縮小率。0.7〜0.8で「見出しからラベルへ」の階層感が出る。
04 — Vocab
:focus-within — 子孫要素がフォーカスされている間、親に当たる擬似クラス。ラッパー側のCSSだけでラベルを動かせる。
:placeholder-shown — プレースホルダーが表示中(=未入力)の間だけ当たる擬似クラス。:not()と組み合わせると「記入済み」をCSSだけで判定できる。
transform-origin: left — 縮小の基準点を左端に固定する指定。ラベルが左揃えのまま小さくなり、横ズレしない。
記入済み判定 — フォーカスが外れても値があればラベルを浮かせたままにする判定。これが漏れるとラベルと入力値が重なる事故になる。
05 — NG → OK examples
NG
言い方: 「「プレースホルダーをおしゃれに動かして」」
なぜNG: フォーカスで浮くだけの実装が高確率で返ってきて、文字を入れたままフォーカスを外すとラベルが入力値に重なって戻る「記入済み判定漏れ」が起きる。font-sizeを直接アニメーションさせるガタつく実装も多い。
OK
言い方: 「「floating labelを:focus-withinで。translateY(-22px) scale(0.75)、0.2s ease-out、transform-origin: left。値が入っていれば浮かせたまま」」
なぜOK: 移動量・縮小率・origin・記入済み判定まで指定。「値が入っていれば浮かせたまま」の一言が実用品質を分ける。
