下記の記事で紹介されているフローティングラベルが気になったので、CSSで出来るだけ再現してみました。

使いやすいフォームデザインのための新しい4つのルール
私たちは日々、オンライン上でフォームを使っています。購入を完了するため、メーリングリストやソーシャルネットワークなどに登録するため、ディスカッションに参加するた…
html
入力のテキストフィールドと対応するラベルを記述しています。
<div class="floating-box">
<input type="text" id="fname" name="fname" value="">
<label for="fname">お名前</label>
</div>
<div class="floating-box">
<input type="email" id="email" name="email" value="">
<label for="email">メールアドレス</label>
</div>
<div class="floating-box">
<input type="tel" id="tel" name="tel" value="">
<label for="tel">電話番号</label>
</div>
css
cssは下記のようになっています。
.floating-box {
position: relative;
width: 300px;
margin-bottom: 20px;
border: 1px solid #ccc;
}
input {
width: 300px;
padding: 15px 10px 10px;
font-size: 16px;
border: none;
outline: none;
box-sizing: border-box;
}
label {
position: absolute;
top: 50%;
left: 10px;
font-size: 13px;
color: #666;
transform: translate(0, -50%);
}
input:focus + label {
top: 0;
left: 10px;
font-size: 12px;
transition: 0.5s;
background: #FFF;
}
解説1
floating-boxはラベルの相対位置とテキストフィールドの外枠のデザインを行っています。
.floating-box {
position: relative;
width: 300px;
margin-bottom: 20px;
border: 1px solid #ccc;
}
解説2
inputで各ブラウザが持っているスタイルをクリアし、テキストフィールドの基本のプロパティを記述しています。
input {
width: 300px;
padding: 15px 10px 10px;
font-size: 16px;
border: none;
outline: none;
box-sizing: border-box;
}
解説3
labelでテキストフィールドに表示するラベル位置を決めています。
label {
position: absolute;
top: 50%;
left: 10px;
font-size: 13px;
color: #666;
transform: translate(0, -50%);
}
解説4
input:focus + labelの「+」で、inputがフォーカスされた直後のlabelに対してスタイルを適用しています。
input:focus + label {
top: 0;
left: 10px;
font-size: 12px;
transition: 0.5s;
background: #FFF;
}
サンプル

カーソルがテキストフィールドにフォーカスしたときにラベルをフローティングしています。
この実装の欠点
入力がされている時に、フォーカスが外れた場合のラベルのフローティングをCSSで維持する方法が思いつきませんでした。

思いつく方法としてはJavaScriptで入力が空でない場合に、フローティング状態のクラスをinputに付与するくらいでしょうか。
まとめ
- labelでラベルの位置を決める。
- input:focus + labelの「+」で、inputがフォーカスされた直後のlabelに対してスタイルを適用する。
- CSSのみだと入力がされている時に、フォーカスが外れた場合のラベルのフローティング維持が難しい。
今回実装したフローティングラベルのメリットは、入力後もラベルは残るので、入力している内容が本当に正しいのかをユーザーが常に確認できる点にあります。CSSでフォーカスが外れた場合のフローティングラベルを維持できなかったことが残念ですが、状態の維持はJavaScriptに任せることとします。


コメント