お問い合わせ

フローティングラベル コンタクトフォーム

このパーツは、入力欄に値が入るとラベルが上へ浮かび上がる Material Design 風のコンタクトフォームです。仕組みの肝は、入力欄に placeholder=" " (空白 1 文字)を置き、CSS の :not(:placeholder-shown) と :focus で「フォーカス中、または入力済み」を…

プレビュー

このパーツの使いどころと実装ポイント

このパーツは、入力欄に値が入るとラベルが上へ浮かび上がる Material Design 風のコンタクトフォームです。仕組みの肝は、入力欄に placeholder=" "(空白 1 文字)を置き、CSS の :not(:placeholder-shown):focus で「フォーカス中、または入力済み」を判定している点です。条件に合うと隣接する labeltransform:translateY(-22px) scale(.85) で縮みながら上に移動します。JavaScript を一切使わず、CSS だけでフローティングラベルを実現しているのが特徴です。下線だけのミニマルな見た目で、フォーカス時に下線とラベルが青く変わります。

向いている場面

余白を生かしたシンプルなサイトの問い合わせ欄、スタートアップやデザイン系サイトの申し込みフォーム、入力項目を少なく見せたいランディングページなどに向きます。ラベルが常に表示されるためプレースホルダ消失の問題が起きにくいのも利点です。

カスタマイズの勘所

  • 項目を増やすときは cfl__f のブロックを複製し、inputidlabelfor を一致させ、placeholder=" " の空白は必ず残します。テキストエリアにも同じ仕組みが効きます。

アクセシビリティ面では labelinputforid で正しく結ばれているため、スクリーンリーダーが項目名を読み上げ、ラベルのタップでも入力欄にフォーカスできます。required を活用し、送信時の検証も忘れず実装してください。

よくある質問

なぜプレースホルダに空白を入れているのですか。
ラベルを浮かせる判定に :placeholder-shown を使っているためです。プレースホルダを空にすると常に未表示扱いになり判定が効きません。空白 1 文字を入れておくと、何も入力されていないときだけラベルが定位置に戻り、入力するとラベルが浮く動きになります。
JavaScript なしで本当に動きますか。
動きます。フォーカス中かどうかは :focus、入力済みかどうかは :not(:placeholder-shown) という CSS の擬似クラスで判定しているため、スクリプトは不要です。ただし送信処理や入力内容の検証は別途サーバー側や JavaScript で実装する必要があります。