css+jQueryでチェックボックス&ラジオボックスをオリジナルデザインのボタンにする

Posted: 2012.04.10 / Category: javascript / Tag: jQuery
ブラウザ標準のチェックボックス&ラジオボタンのデザインだと俺のクールなサイトには合わん。
といったときの為にボタン風なオリジナルデザインにする方法をご紹介します。
Sponsored Link
cssオンリーの場合
まずはcssのみでやってみます。
隣接セレクターやcheckedセレクターを使用している関係でieでは動きません。
<div class="check-group clearfix"> <div> <input id="checkbox1" type="checkbox" name="check[]" value="c1" /> <label for="checkbox1">Checkbox 1</label> </div> <div> <input id="checkbox2" type="checkbox" name="check[]" value="c2" /> <label for="checkbox2">Checkbox 2</label> </div> <div> <input id="checkbox3" type="checkbox" name="check[]" value="c3" /> <label for="checkbox3">Checkbox 3</label> </div> </div>
css
div.check-group input { display: none; } div.check-group label { cursor: pointer; padding: 5px 10px; float: left; border: solid 1px #aaa; margin-left: -1px; background: #eee; } div.check-group input:checked+label { color: #fff; background: #C3C3C3; }
「input」を「display: none」にすればチェックボックスを非表示にできますので、あとは「input:checked+label」でチェック時のスタイルを設定するだけです。
ラジオボタンも基本的にはcheckboxをradioに変更するだけで動きます。
jQueryを使用した場合
ieに対応するためにcssハックなどでieだったらチェックボックスを表示などしてもいいと思います。
ここではjQueryを使用してクラスを割り当てることで、ボタンのON/OFFを再現する方法をご紹介します。
チェックボックス
先ほどのcssの場合は「:checked」の疑似クラスでしたが、今回は「.checked」普通のクラスにします。
css
div.check-group label.checked { color: #fff; background: #C3C3C3; }
toggleイベントを使用すると通常のチェックが機能しなくなるっぽいので、「attr(‘checked’,’checked’)」でjsの方でチェックします。
javascript
$(function(){ //checkedだったら最初からチェックする $('div.check-group input').each(function(){ if ($(this).attr('checked') == 'checked') { $(this).next().addClass('checked'); } }); //クリックした要素にクラス割り当てる $('div.check-group label').click(function(){ if ($(this).hasClass('checked')) { $(this) .removeClass('checked') .prev('input').removeAttr('checked'); } else { $(this) .addClass('checked') .prev('input').attr('checked','checked'); } }); });
ラジオボタン
ラジオボタンはinput要素を「display: none」とするとieでは動作しないようです。
なので、透明度を0(opacity: 0)にすることで擬似的に非表示にします。
cssで設定してもいいですが、ここではjQueryで設定します。
html
<div class="radio-group clearfix"> <div> <input id="Radio1" type="radio" class="radio" name="radio" value="r1" /> <label for="Radio1">Radio 1</label> </div> <div> <input id="Radio2" type="radio" class="radio" name="radio" value="r2" /> <label for="Radio2">Radio 2</label> </div> <div> <input id="Radio3" type="radio" class="radio" name="radio" value="r3" /> <label for="Radio3">Radio 3</label> </div> </div>
opacity は要素が透明になっているだけなので、ボタンを横並びにする場合 position を使用してうまいことやりましょう。
css
div.radio-group div { position: relative; } div.radio-group input { position: absolute; left: 0px; outline:none; }
jQueryではボタンをクリックすると、全てのラベルを removeClass してから、クリックしたボタンに addClass でクラスを割り当ててます。
javascript
$(function(){ var radio = $('div.radio-group'); $('input', radio).css({'opacity': '0'}) //checkedだったら最初からチェックする .each(function(){ if ($(this).attr('checked') == 'checked') { $(this).next().addClass('checked'); } }); //クリックした要素にクラス割り当てる $('label', radio).click(function() { $(this).parent().parent().each(function() { $('label',this).removeClass('checked'); }); $(this).addClass('checked'); }); });
COMMENTS
FL 2012-08-19 23:40
勉強中のためとても参考になりました!
ラジオボタンを最初から選択済みにしておくにはどこをどうしたらよいでしょうか・・・?
webOpixel 2012-08-21 13:25
css3のバージョンはinputのところに「checked=”check”」とするだけでできます。
jQueryのバージョンをラジオボタンだけ修正しました。
きゃー素敵! 2012-09-20 05:54
いつも探しモノしてググると、
webOpixelさんのサイトに辿りつきます。
ステキです。すごく助かります。
いつもありがとうございます。
webOpixel 2012-09-24 10:44
コメントありがとうございます。
すごく励みになります!
HTMLコーダー 2013-03-06 15:28
いつも困ったときに活用させて頂いております。
今回jquerymobileを使わずにフォームのカスタマイズを行いたくて
こちらに辿り着きました。
横ではなく、縦に並べたいので、横幅をそろえたいのですが、
文字量に合わせて幅が広がる点が調整できず困っています。。。
どうすればよいでしょうか??
webOpixel 2013-03-07 11:06
スマホなら「width:100%;」でもいいと思うのですが、だめならJSを使用して一番大きいwidthを取得して設定という流れになると思います。
chmod 2013-04-19 10:06
大変参考になりました。
ラジオボタンをチェックした状態でリロードすると実際はチェックされたままなのにそれが反映されないようです(IE,Firefoxのみ。safariとchromeはリロードでチェックが外れる)
これはどのように対応したらよろしいでしょうか
webOpixel 2013-04-22 15:00
修正したものに差し替えてみてましたが、どうでしょうか。
helpme 2014-05-07 17:31
はじめまして!
大変参考になるサンプル&解説ありがとうございます。
質問がございます。
チェックボックスにchecked=”check”とした場合、「jQueryを使用した場合」ではチェックを解除するにはリロード後、2度クリックしないとチェックを解除できません。
(※1度解除してしまえば、次回から1度のクリックでON・OFF出来ます。)
リロード後、1度のクリックでチェックを解除できるようにするにはどうしたら良いでしょうか。
webOpixel 2014-05-10 16:29
ご指摘ありがとうございます。
修正してみたのでご確認ください。
helpme 2014-05-12 09:22
早速のご回答ありがとうございます。
また、わざわざ修正版をアップし直して頂きましてありがとうございます。
大変参考になりました。
更新を毎回楽しみにしていますので、これからもサイト運営頑張って下さい。
tomotomo 2014-05-16 13:52
はじめまして、とても参考になりました。ありがとうございます。
ただ、ラジオボタンが2組以上、つまり、
「name」が2つ以上ある場合、思う動きをしません。
いいアイデアがありますか?
webOpixel 2014-05-22 11:20
基本的には動くはずなんですが、、なんでしょうね。
同じ「name」を2組ということでしょうか?
keizo0211 2015-02-27 12:22
チェックボックスは、
クリックイベントの後に
return false;
をいれておくと確実かもです。
$(function(){
//checkedだったら最初からチェックする
$(‘.check-group input’).each(function(){
if ($(this).attr(‘checked’) == ‘checked’) {
$(this).next().addClass(‘checked’);
}
});
//クリックした要素にクラス割り当てる
$(‘.check-group label’).click(function(){
if ($(this).hasClass(‘checked’)) {
$(this)
.removeClass(‘checked’)
.prev(‘input’).removeAttr(‘checked’);
return false;
} else {
$(this)
.addClass(‘checked’)
.prev(‘input’).attr(‘checked’,’checked’);
return false;
}
});
});
webOpixel 2015-03-02 14:17
keizo0211さん
ありがとうございます。
勉強になります。