###初めて投稿させていただきます。
ネット上で共有されていた下記checkbox用のCSSですが、シンプル、かつ滑らかで
とても気に入っているのですが、これをradioボタンで実装出来ないかと思考錯誤していたのですが・・
どなたかお力を貸して頂けないでしょうか。
すみませんが、宜しくお願いします。
###※追記
自身で試したコードを載せてみては?と修正依頼を頂きました。
失礼致しました。
CSSコードを眺めながら考えていたのですが、そもそもcheckboxの場合input要素一つのon/offを表現しているのですが、radioボタンだとinput要素2つ(今回は3つ以上は無いものと考えています)のname属性を同一にしつつ、on/offを表現するための根本的な手段が解りません。
また、5種類のinput要素を掲載していたのですが、コード視認性を上げるため、今回実装を目指した2つ(FLAT, FLIP)以外を削除しております。
###以下、現在試しているhtmlです。
html
1<li class='tg-list-item'> 2 <h4>Flat</h4> 3 <input class='tgl tgl-flat-radio' id='radio_on' type='radio' name='radio' value='on' />ON 4 <label class='tgl-btn' for='radio_on'></label> 5 <input class='tgl tgl-flat-radio' id='radio_off' type='radio' name='radio' value='off' />OFF 6 <label class='tgl-btn' for='radio_off'></label> 7</li>
###以下、加工元のソースになります。
html
1<h2>Toggle Button</h2> 2<ul class='tg-list'> 3 <li class='tg-list-item'> 4 <h4>Flat</h4> 5 <input class='tgl tgl-flat' id='cb4' type='checkbox'> 6 <label class='tgl-btn' for='cb4'></label> 7 </li> 8 <li class='tg-list-item'> 9 <h4>Flip</h4> 10 <input class='tgl tgl-flip' id='cb5' type='checkbox'> 11 <label class='tgl-btn' data-tg-off='Nope' data-tg-on='Yeah!' for='cb5'></label> 12 </li> 13</ul>
css
1.tg-list { 2 text-align: center; 3 display: -webkit-box; 4 display: -webkit-flex; 5 display: -ms-flexbox; 6 display: flex; 7 -webkit-box-align: center; 8 -webkit-align-items: center; 9 -ms-flex-align: center; 10 align-items: center; 11} 12 13.tg-list-item { 14 margin: 0 2em; 15} 16 17.tgl { 18 display: none; 19} 20.tgl, .tgl:after, .tgl:before, .tgl *, .tgl *:after, .tgl *:before, .tgl + .tgl-btn { 21 -webkit-box-sizing: border-box; 22 -moz-box-sizing: border-box; 23 box-sizing: border-box; 24} 25.tgl::-moz-selection, .tgl:after::-moz-selection, .tgl:before::-moz-selection, .tgl *::-moz-selection, .tgl *:after::-moz-selection, .tgl *:before::-moz-selection, .tgl + .tgl-btn::-moz-selection { 26 background: none; 27} 28.tgl::selection, .tgl:after::selection, .tgl:before::selection, .tgl *::selection, .tgl *:after::selection, .tgl *:before::selection, .tgl + .tgl-btn::selection { 29 background: none; 30} 31.tgl + .tgl-btn { 32 outline: 0; 33 display: block; 34 width: 4em; 35 height: 2em; 36 position: relative; 37 cursor: pointer; 38} 39.tgl + .tgl-btn:after, .tgl + .tgl-btn:before { 40 position: relative; 41 display: block; 42 content: ""; 43 width: 50%; 44 height: 100%; 45} 46.tgl + .tgl-btn:after { 47 left: 0; 48} 49.tgl + .tgl-btn:before { 50 display: none; 51} 52.tgl:checked + .tgl-btn:after { 53 left: 50%; 54} 55 56.tgl-flat + .tgl-btn { 57 padding: 2px; 58 -webkit-transition: all .2s ease; 59 transition: all .2s ease; 60 background: #fff; 61 border: 4px solid #f2f2f2; 62 border-radius: 2em; 63} 64.tgl-flat + .tgl-btn:after { 65 -webkit-transition: all .2s ease; 66 transition: all .2s ease; 67 background: #f2f2f2; 68 content: ""; 69 border-radius: 1em; 70} 71.tgl-flat:checked + .tgl-btn { 72 border: 4px solid #7FC6A6; 73} 74.tgl-flat:checked + .tgl-btn:after { 75 left: 50%; 76 background: #7FC6A6; 77} 78 79.tgl-flip + .tgl-btn { 80 padding: 2px; 81 -webkit-transition: all .2s ease; 82 transition: all .2s ease; 83 font-family: sans-serif; 84 -webkit-perspective: 100px; 85 -ms-perspective: 100px; 86 perspective: 100px; 87} 88.tgl-flip + .tgl-btn:after, .tgl-flip + .tgl-btn:before { 89 display: inline-block; 90 -webkit-transition: all .4s ease; 91 transition: all .4s ease; 92 width: 100%; 93 text-align: center; 94 position: absolute; 95 line-height: 2em; 96 font-weight: bold; 97 color: #fff; 98 position: absolute; 99 top: 0; 100 left: 0; 101 -webkit-backface-visibility: hidden; 102 -ms-backface-visibility: hidden; 103 backface-visibility: hidden; 104 border-radius: 4px; 105} 106.tgl-flip + .tgl-btn:after { 107 content: attr(data-tg-on); 108 background: #02C66F; 109 -webkit-transform: rotateY(-180deg); 110 -ms-transform: rotateY(-180deg); 111 transform: rotateY(-180deg); 112} 113.tgl-flip + .tgl-btn:before { 114 background: #FF3A19; 115 content: attr(data-tg-off); 116} 117.tgl-flip + .tgl-btn:active:before { 118 -webkit-transform: rotateY(-20deg); 119 -ms-transform: rotateY(-20deg); 120 transform: rotateY(-20deg); 121} 122.tgl-flip:checked + .tgl-btn:before { 123 -webkit-transform: rotateY(180deg); 124 -ms-transform: rotateY(180deg); 125 transform: rotateY(180deg); 126} 127.tgl-flip:checked + .tgl-btn:after { 128 -webkit-transform: rotateY(0); 129 -ms-transform: rotateY(0); 130 transform: rotateY(0); 131 left: 0; 132 background: #7FC6A6; 133} 134.tgl-flip:checked + .tgl-btn:active:after { 135 -webkit-transform: rotateY(20deg); 136 -ms-transform: rotateY(20deg); 137 transform: rotateY(20deg); 138}
###kei344さんからの助言を基に施したほぼ解決したコード
radioの場合はname属性を同一とし、idを分ける形です。
checkboxの場合は先にhidden要素を配置しておく形で解決となりました。
回答頂いた方々、お忙しい中、有難うございました。
非常に勉強になりました。
html
1<h2>Toggle it!</h2> 2<ul class='tg-list'> 3 <li class='tg-list-item'> 4 <h4>Light (checkbox)</h4> 5 <input type='hidden' name='cb_light' value='0' /> 6 <input class='tgl tgl-light' id='cb-light' type='checkbox' name='cb_light' value='1' /> 7 <label class='tgl-btn' for='cb-light'></label> 8 </li> 9 <li class='tg-list-item'> 10 <h4>Light (radio)</h4> 11 <input class='tgl tgl-light' id='radio-light_on' type='radio' name='radio_light' value='1' /> 12 <label class='tgl-btn' for='radio-light_on' data-tg-off='OFF' data-tg-on='ON'></label> 13 <input class='tgl tgl-light' id='radio-light_off' type='radio' name='radio_light' value='0' checked='checked' /> 14 <label class='tgl-btn' for='radio-light_off' data-tg-off='OFF' data-tg-on='ON'></label> 15 </li> 16 17 <li class='tg-list-item'> 18 <h4>iOS 7 (checkbox)</h4> 19 <input type='hidden' name='cb_ios' value='0' /> 20 <input class='tgl tgl-ios' id='cb-ios' type='checkbox' name='cb_ios' value='1' /> 21 <label class='tgl-btn' for='cb-ios'></label> 22 </li> 23 <li class='tg-list-item'> 24 <h4>iOS 7 (radio)</h4> 25 <input class='tgl tgl-ios' id='radio-ios_on' type='radio' name='radio_ios' value='1' /> 26 <label class='tgl-btn' for='radio-ios_on' data-tg-off='OFF' data-tg-on='ON'></label> 27 <input class='tgl tgl-ios' id='radio-ios_off' type='radio' name='radio_ios' value='0' checked='checked' /> 28 <label class='tgl-btn' for='radio-ios_off' data-tg-off='OFF' data-tg-on='ON'></label> 29 </li> 30 31 <li class='tg-list-item'> 32 <h4>Skewed (checkbox)</h4> 33 <input type='hidden' name='cb_skewed' value='0' /> 34 <input class='tgl tgl-skewed' id='cb-skewed' type='checkbox' name='cb_skewed' value='1' /> 35 <label class='tgl-btn' data-tg-off='OFF' data-tg-on='ON' for='cb-skewed'></label> 36 </li> 37 <li class='tg-list-item'> 38 <h4>Skewed (radio)</h4> 39 <input class='tgl tgl-skewed' id='radio-skewed_on' type='radio' name='radio_skewed' value='1' /> 40 <label class='tgl-btn' for='radio-skewed_on' data-tg-off='OFF' data-tg-on='ON'></label> 41 <input class='tgl tgl-skewed' id='radio-skewed_off' type='radio' name='radio_skewed' value='0' checked='checked' /> 42 <label class='tgl-btn' for='radio-skewed_off' data-tg-off='OFF' data-tg-on='ON'></label> 43 </li> 44 45 <li class='tg-list-item'> 46 <h4>Flat (checkbox)</h4> 47 <input type='hidden' name='cb_flat' value='0' /> 48 <input class='tgl tgl-flat' id='cb-flat' type='checkbox' name='cb_flat' value='1' /> 49 <label class='tgl-btn' for='cb-flat'></label> 50 </li> 51 <li class='tg-list-item'> 52 <h4>Flat (radio)</h4> 53 <input class='tgl tgl-flat' id='radio-flat_on' type='radio' name='radio_flat' value='1' /> 54 <label class='tgl-btn' for='radio-flat_on'></label> 55 <input class='tgl tgl-flat' id='radio-flat_off' type='radio' name='radio_flat' value='0' checked='checked' /> 56 <label class='tgl-btn' for='radio-flat_off'></label> 57 </li> 58 59 <li class='tg-list-item'> 60 <h4>Flip (checkbox)</h4> 61 <input type='hidden' name='cb_flip' value='0' /> 62 <input class='tgl tgl-flip' id='cb-flip' type='checkbox' name='cb_flip' value='1' /> 63 <label class='tgl-btn' data-tg-off='OFF' data-tg-on='ON' for='cb-flip'></label> 64 </li> 65 <li class='tg-list-item'> 66 <h4>Flat (radio)</h4> 67 <input class='tgl tgl-flip' id='radio-flip_on' type='radio' name='radio_flip' value='1' /> 68 <label class='tgl-btn' for='radio-flip_on' data-tg-off='OFF' data-tg-on='ON'></label> 69 <input class='tgl tgl-flip' id='radio-flip_off' type='radio' name='radio_flip' value='0' checked='checked' /> 70 <label class='tgl-btn' for='radio-flip_off' data-tg-off='OFF' data-tg-on='ON'></label> 71 </li> 72</ul>
回答2件
あなたの回答
tips
プレビュー