CSSの便利なセレクタ「:placeholder-shown疑似クラス」を使うと、フローティングラベルも簡単に実装できる
Post on:2018年6月19日
フローティングラベルとは、フォームのラベルが入力時にアニメーションで上方向にフローティングするテクニックです。
一昔前までは、完全にJavaScriptの範疇、もしくは強引なCSSでもたつく感じのアニメーションでしか実装できませんでした。しかし、:placeholder-shown疑似クラスを使用すると、シンプルなコードで滑らかなフローティングラベルを実装できます。
下記のデモはJavaScriptは無し、CSSのみで実装されています。
input :not(:placeholder-shown)
フローティングラベルの挙動は、フォーカスがはずれている時は入力欄に表示され、フォーカスがあたった時は入力欄の上に表示されます。
フォーカスがはずれている時とあたった時
:placeholder-shown疑似クラスとは、プレイスホルダーが有効なフォーム要素を選択し、そこにスタイルを適用できます。
参考: :placeholder-shown -Selectors Level 4
デモでは、否定疑似クラス「:not」と組み合わせて、ラベルのテキストを移動・変形させ、カラーを変更しています。
参考: 否定疑似クラス「:not」の便利な使い方と使う時の注意点
1 2 3 4 |
.inp input:not(:placeholder-shown) + span { color: #5a667f; transform: translateY(-26px) scale(0.75); } |
HTML
フォームはinput要素、ラベル、ボーダーで構成されています。
1 2 3 4 5 |
<label for="inp" class="inp"> <input type="text" id="inp" placeholder=" "> <span class="label">お名前</span> <span class="border"></span> </label> |
CSS
各要素を「position: absolute;」にし、フローティングラベルは「input:not(:placeholder-shown) + span」と「input:focus + span」で実装します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
.inp { position: relative; margin: auto; width: 100%; max-width: 280px; } .inp .label { position: absolute; top: 16px; left: 0; font-size: 16px; color: #9098a9; font-weight: 500; transform-origin: 0 0; transition: all 0.2s ease; } .inp .border { position: absolute; bottom: 0; left: 0; height: 2px; width: 100%; background: #07f; transform: scaleX(0); transform-origin: 0 0; transition: all 0.15s ease; } .inp input { -webkit-appearance: none; width: 100%; border: 0; font-family: inherit; padding: 12px 0; height: 48px; font-size: 16px; font-weight: 500; border-bottom: 2px solid #c8ccd4; background: none; border-radius: 0; color: #223254; transition: all 0.15s ease; } .inp input:hover { background: rgba(34,50,84,0.03); } .inp input:not(:placeholder-shown) + span { color: #5a667f; transform: translateY(-26px) scale(0.75); } .inp input:focus { background: none; outline: none; } .inp input:focus + span { color: #07f; transform: translateY(-26px) scale(0.75); } .inp input:focus + span + .border { transform: scaleX(1); } |
「:placeholder-shown」は主要なモダンブラウザでサポートされていますが、IE, Edgeは未サポートです。
ポリフィルも利用できます。
実際の動作は、下記ページでご覧ください。
フローティングラベルは、非常に軽快に動作します。
See the Pen input :not(:placeholder-shown) by Andreas Storm (@andreasstorm) on CodePen.
sponsors