この記事は「口コミサイトの星(★★★☆☆)をCSSだけで実装してみた - Qiita」を見て、その中で使われているテクニックを一部解読したもの
(本文に Slim を使いたかったけど Syntax Highlight 対応して無くて見辛くてツライので、 HTML で書いた)
導入
<input/>
を用いる時は、 <label/>
と併用することでこの2つの要素を関連付けられる
関連付けによってラベルのクリックによる入力可能状態への移行を機能させられる
<input/>
をただ単体で使用するのではなく、ラベルと併用することで、ラベルとインプットの関連性...ユーザは何を入力すべきか...の明示ができて、使い勝手の良さにつながる
<!-- ラベルはインプットのID 値と関連付けられて、 「Memo」をクリックすると入力可能状態へ移行する --> <label for="my-input">Memo</label> <input id="my-input" type="text" name="memo" id="my-input">
今回はこれを応用する
ゴール
この、「ラベルをクリックすると <input/>
を選択できる」を利用することで、あたかも「ラベルに表示させた文字や画像を選択可能にする」、といった動作にできる
これが動作するまでを書いていく
手順
ここからは、非表示化した <input/>
と、それと関連付けた <label/>
の連携方法について書く
大まかな手順として:
ラジオボタンを見えなくしても、なぜかラベルとの関連付けは失われないので、ボタンは問題なく選択可能なままになる
なにもない状態
実際に作っていく上で、次のようなHTML をベースとして用いる
<div class="selection-group"> <input id="a" type="radio" name="rate" value="a"> <input id="b" type="radio" name="rate" value="b"> <input id="c" type="radio" name="rate" value="c"> </div>
ラジオボタンが表示された
ラベルと関連付ける
<div class="selection-group"> <input id="a" type="radio" name="rate" value="a"> <label for="a"></label> <input id="b" type="radio" name="rate" value="b"> <label for="b"></label> <input id="c" type="radio" name="rate" value="c"> <label for="c"></label> </div>
ラベルの内容は空なので、見た目の変化もなし
ラベルに画像を追加
<div class="selection-group"> <input id="a" type="radio" name="rate" value="a"> <label for="a"> <img src="//placehold.it/90x90"> </label> <input id="b" type="radio" name="rate" value="b"> <label for="b"> <img src="//placehold.it/90x90"> </label> <input id="c" type="radio" name="rate" value="c"> <label for="c"> <img src="//placehold.it/90x90"> </label> </div>
(ラベルの中にあるので、) 画像をクリックすることでラジオボタンが選択できるようになった
CSS でラジオボタンを非表示化
.selection-group input[type="radio"] { display: none; }
このままだと実際に動いてくれているのか確認しづらいので、確認用の CSS を追記する
動作確認用のCSS 追記
/* 画像部分に余白を持たせる */ label img { margin: 3px; padding: 8px; } /* 選択されたラジオボタンの画像の背景をオレンジ色に変える */ .selection-group input[type="radio"]:checked + label img { background: orange; }
画像をクリックすることでラジオボタンが選択できるようになった
完成
出来上がったものがこちら
https://codepen.io/gouf/pen/XZZXPBcodepen.io