CSSの便利なセレクタ「:placeholder-shown疑似クラス」を使うと、フローティングラベルも簡単に実装できる
Post on:2018年6月19日
sponsorsr
フローティングラベルとは、フォームのラベルが入力時にアニメーションで上方向にフローティングするテクニックです。
一昔前までは、完全に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















