質問編集履歴

3

解決コードの共有

2017/05/27 13:45

投稿

wonda
wonda

スコア69

test CHANGED
File without changes
test CHANGED
@@ -357,3 +357,165 @@
357
357
  }
358
358
 
359
359
  ```
360
+
361
+
362
+
363
+ ###kei344さんからの助言を基に施したほぼ解決したコード
364
+
365
+ radioの場合はname属性を同一とし、idを分ける形です。
366
+
367
+ checkboxの場合は先にhidden要素を配置しておく形で解決となりました。
368
+
369
+ 回答頂いた方々、お忙しい中、有難うございました。
370
+
371
+ 非常に勉強になりました。
372
+
373
+
374
+
375
+ ```html
376
+
377
+ <h2>Toggle it!</h2>
378
+
379
+ <ul class='tg-list'>
380
+
381
+ <li class='tg-list-item'>
382
+
383
+ <h4>Light (checkbox)</h4>
384
+
385
+ <input type='hidden' name='cb_light' value='0' />
386
+
387
+ <input class='tgl tgl-light' id='cb-light' type='checkbox' name='cb_light' value='1' />
388
+
389
+ <label class='tgl-btn' for='cb-light'></label>
390
+
391
+ </li>
392
+
393
+ <li class='tg-list-item'>
394
+
395
+ <h4>Light (radio)</h4>
396
+
397
+ <input class='tgl tgl-light' id='radio-light_on' type='radio' name='radio_light' value='1' />
398
+
399
+ <label class='tgl-btn' for='radio-light_on' data-tg-off='OFF' data-tg-on='ON'></label>
400
+
401
+ <input class='tgl tgl-light' id='radio-light_off' type='radio' name='radio_light' value='0' checked='checked' />
402
+
403
+ <label class='tgl-btn' for='radio-light_off' data-tg-off='OFF' data-tg-on='ON'></label>
404
+
405
+ </li>
406
+
407
+
408
+
409
+ <li class='tg-list-item'>
410
+
411
+ <h4>iOS 7 (checkbox)</h4>
412
+
413
+ <input type='hidden' name='cb_ios' value='0' />
414
+
415
+ <input class='tgl tgl-ios' id='cb-ios' type='checkbox' name='cb_ios' value='1' />
416
+
417
+ <label class='tgl-btn' for='cb-ios'></label>
418
+
419
+ </li>
420
+
421
+ <li class='tg-list-item'>
422
+
423
+ <h4>iOS 7 (radio)</h4>
424
+
425
+ <input class='tgl tgl-ios' id='radio-ios_on' type='radio' name='radio_ios' value='1' />
426
+
427
+ <label class='tgl-btn' for='radio-ios_on' data-tg-off='OFF' data-tg-on='ON'></label>
428
+
429
+ <input class='tgl tgl-ios' id='radio-ios_off' type='radio' name='radio_ios' value='0' checked='checked' />
430
+
431
+ <label class='tgl-btn' for='radio-ios_off' data-tg-off='OFF' data-tg-on='ON'></label>
432
+
433
+ </li>
434
+
435
+
436
+
437
+ <li class='tg-list-item'>
438
+
439
+ <h4>Skewed (checkbox)</h4>
440
+
441
+ <input type='hidden' name='cb_skewed' value='0' />
442
+
443
+ <input class='tgl tgl-skewed' id='cb-skewed' type='checkbox' name='cb_skewed' value='1' />
444
+
445
+ <label class='tgl-btn' data-tg-off='OFF' data-tg-on='ON' for='cb-skewed'></label>
446
+
447
+ </li>
448
+
449
+ <li class='tg-list-item'>
450
+
451
+ <h4>Skewed (radio)</h4>
452
+
453
+ <input class='tgl tgl-skewed' id='radio-skewed_on' type='radio' name='radio_skewed' value='1' />
454
+
455
+ <label class='tgl-btn' for='radio-skewed_on' data-tg-off='OFF' data-tg-on='ON'></label>
456
+
457
+ <input class='tgl tgl-skewed' id='radio-skewed_off' type='radio' name='radio_skewed' value='0' checked='checked' />
458
+
459
+ <label class='tgl-btn' for='radio-skewed_off' data-tg-off='OFF' data-tg-on='ON'></label>
460
+
461
+ </li>
462
+
463
+
464
+
465
+ <li class='tg-list-item'>
466
+
467
+ <h4>Flat (checkbox)</h4>
468
+
469
+ <input type='hidden' name='cb_flat' value='0' />
470
+
471
+ <input class='tgl tgl-flat' id='cb-flat' type='checkbox' name='cb_flat' value='1' />
472
+
473
+ <label class='tgl-btn' for='cb-flat'></label>
474
+
475
+ </li>
476
+
477
+ <li class='tg-list-item'>
478
+
479
+ <h4>Flat (radio)</h4>
480
+
481
+ <input class='tgl tgl-flat' id='radio-flat_on' type='radio' name='radio_flat' value='1' />
482
+
483
+ <label class='tgl-btn' for='radio-flat_on'></label>
484
+
485
+ <input class='tgl tgl-flat' id='radio-flat_off' type='radio' name='radio_flat' value='0' checked='checked' />
486
+
487
+ <label class='tgl-btn' for='radio-flat_off'></label>
488
+
489
+ </li>
490
+
491
+
492
+
493
+ <li class='tg-list-item'>
494
+
495
+ <h4>Flip (checkbox)</h4>
496
+
497
+ <input type='hidden' name='cb_flip' value='0' />
498
+
499
+ <input class='tgl tgl-flip' id='cb-flip' type='checkbox' name='cb_flip' value='1' />
500
+
501
+ <label class='tgl-btn' data-tg-off='OFF' data-tg-on='ON' for='cb-flip'></label>
502
+
503
+ </li>
504
+
505
+ <li class='tg-list-item'>
506
+
507
+ <h4>Flat (radio)</h4>
508
+
509
+ <input class='tgl tgl-flip' id='radio-flip_on' type='radio' name='radio_flip' value='1' />
510
+
511
+ <label class='tgl-btn' for='radio-flip_on' data-tg-off='OFF' data-tg-on='ON'></label>
512
+
513
+ <input class='tgl tgl-flip' id='radio-flip_off' type='radio' name='radio_flip' value='0' checked='checked' />
514
+
515
+ <label class='tgl-btn' for='radio-flip_off' data-tg-off='OFF' data-tg-on='ON'></label>
516
+
517
+ </li>
518
+
519
+ </ul>
520
+
521
+ ```

2

検証コードの追記

2017/05/27 13:45

投稿

wonda
wonda

スコア69

test CHANGED
File without changes
test CHANGED
@@ -1,12 +1,8 @@
1
- 初めて投稿させていただきます。
1
+ ###初めて投稿させていただきます。
2
2
 
3
3
  ネット上で共有されていた下記checkbox用のCSSですが、シンプル、かつ滑らかで
4
4
 
5
- とても気に入っているのですが、これをradioボタンで実装出来ないかと思考錯誤していたのですが・・どうにもレベルが高すぎて私には厳しい・・・
5
+ とても気に入っているのですが、これをradioボタンで実装出来ないかと思考錯誤していたのですが・・
6
-
7
- どうにか実装出来ないものでしょうか。
8
-
9
-
10
6
 
11
7
  どなたかお力を貸して頂けないでしょうか。
12
8
 
@@ -14,18 +10,44 @@
14
10
 
15
11
 
16
12
 
17
- ※追記
13
+ ###※追記
18
14
 
19
15
  自身で試したコードを載せてみては?と修正依頼を頂きました。
20
16
 
17
+ 失礼致しました。
18
+
21
19
  CSSコードを眺めながら考えていたのですが、そもそもcheckboxの場合input要素一つのon/offを表現しているのですが、radioボタンだとinput要素2つ(今回は3つ以上は無いものと考えています)のname属性を同一にしつつ、on/offを表現するための根本的な手段が解りません。
22
20
 
23
21
  また、5種類のinput要素を掲載していたのですが、コード視認性を上げるため、今回実装を目指した2つ(FLAT, FLIP)以外を削除しております。
24
22
 
25
23
 
26
24
 
25
+ ###以下、現在試しているhtmlです。
26
+
27
27
  ```html
28
28
 
29
+ <li class='tg-list-item'>
30
+
31
+ <h4>Flat</h4>
32
+
33
+ <input class='tgl tgl-flat-radio' id='radio_on' type='radio' name='radio' value='on' />ON
34
+
35
+ <label class='tgl-btn' for='radio_on'></label>
36
+
37
+ <input class='tgl tgl-flat-radio' id='radio_off' type='radio' name='radio' value='off' />OFF
38
+
39
+ <label class='tgl-btn' for='radio_off'></label>
40
+
41
+ </li>
42
+
43
+ ```
44
+
45
+
46
+
47
+ ###以下、加工元のソースになります。
48
+
49
+ ```html
50
+
29
51
  <h2>Toggle Button</h2>
30
52
 
31
53
  <ul class='tg-list'>

1

根本原因の解決方法を訴求、一部コードの削除

2017/05/27 11:22

投稿

wonda
wonda

スコア69

test CHANGED
File without changes
test CHANGED
@@ -14,6 +14,16 @@
14
14
 
15
15
 
16
16
 
17
+ ※追記
18
+
19
+ 自身で試したコードを載せてみては?と修正依頼を頂きました。
20
+
21
+ CSSコードを眺めながら考えていたのですが、そもそもcheckboxの場合input要素一つのon/offを表現しているのですが、radioボタンだとinput要素2つ(今回は3つ以上は無いものと考えています)のname属性を同一にしつつ、on/offを表現するための根本的な手段が解りません。
22
+
23
+ また、5種類のinput要素を掲載していたのですが、コード視認性を上げるため、今回実装を目指した2つ(FLAT, FLIP)以外を削除しております。
24
+
25
+
26
+
17
27
  ```html
18
28
 
19
29
  <h2>Toggle Button</h2>
@@ -22,54 +32,24 @@
22
32
 
23
33
  <li class='tg-list-item'>
24
34
 
25
- <h4>Light</h4>
35
+ <h4>Flat</h4>
26
-
36
+
27
- <input class='tgl tgl-light' id='cb1' type='checkbox'>
37
+ <input class='tgl tgl-flat' id='cb4' type='checkbox'>
28
-
38
+
29
- <label class='tgl-btn' for='cb1'></label>
39
+ <label class='tgl-btn' for='cb4'></label>
30
40
 
31
41
  </li>
32
42
 
33
43
  <li class='tg-list-item'>
34
44
 
35
- <h4>iOS 7</h4>
45
+ <h4>Flip</h4>
36
-
46
+
37
- <input class='tgl tgl-ios' id='cb2' type='checkbox'>
47
+ <input class='tgl tgl-flip' id='cb5' type='checkbox'>
38
-
48
+
39
- <label class='tgl-btn' for='cb2'></label>
49
+ <label class='tgl-btn' data-tg-off='Nope' data-tg-on='Yeah!' for='cb5'></label>
40
50
 
41
51
  </li>
42
52
 
43
- <li class='tg-list-item'>
44
-
45
- <h4>Skewed</h4>
46
-
47
- <input class='tgl tgl-skewed' id='cb3' type='checkbox'>
48
-
49
- <label class='tgl-btn' data-tg-off='OFF' data-tg-on='ON' for='cb3'></label>
50
-
51
- </li>
52
-
53
- <li class='tg-list-item'>
54
-
55
- <h4>Flat</h4>
56
-
57
- <input class='tgl tgl-flat' id='cb4' type='checkbox'>
58
-
59
- <label class='tgl-btn' for='cb4'></label>
60
-
61
- </li>
62
-
63
- <li class='tg-list-item'>
64
-
65
- <h4>Flip</h4>
66
-
67
- <input class='tgl tgl-flip' id='cb5' type='checkbox'>
68
-
69
- <label class='tgl-btn' data-tg-off='Nope' data-tg-on='Yeah!' for='cb5'></label>
70
-
71
- </li>
72
-
73
53
  </ul>
74
54
 
75
55
  ```
@@ -188,117 +168,95 @@
188
168
 
189
169
 
190
170
 
191
- .tgl-light + .tgl-btn {
171
+ .tgl-flat + .tgl-btn {
172
+
192
-
173
+ padding: 2px;
174
+
175
+ -webkit-transition: all .2s ease;
176
+
177
+ transition: all .2s ease;
178
+
193
- background: #f0f0f0;
179
+ background: #fff;
180
+
181
+ border: 4px solid #f2f2f2;
194
182
 
195
183
  border-radius: 2em;
196
184
 
185
+ }
186
+
187
+ .tgl-flat + .tgl-btn:after {
188
+
189
+ -webkit-transition: all .2s ease;
190
+
191
+ transition: all .2s ease;
192
+
193
+ background: #f2f2f2;
194
+
195
+ content: "";
196
+
197
+ border-radius: 1em;
198
+
199
+ }
200
+
201
+ .tgl-flat:checked + .tgl-btn {
202
+
203
+ border: 4px solid #7FC6A6;
204
+
205
+ }
206
+
207
+ .tgl-flat:checked + .tgl-btn:after {
208
+
209
+ left: 50%;
210
+
211
+ background: #7FC6A6;
212
+
213
+ }
214
+
215
+
216
+
217
+ .tgl-flip + .tgl-btn {
218
+
197
219
  padding: 2px;
198
220
 
221
+ -webkit-transition: all .2s ease;
222
+
223
+ transition: all .2s ease;
224
+
225
+ font-family: sans-serif;
226
+
227
+ -webkit-perspective: 100px;
228
+
229
+ -ms-perspective: 100px;
230
+
231
+ perspective: 100px;
232
+
233
+ }
234
+
235
+ .tgl-flip + .tgl-btn:after, .tgl-flip + .tgl-btn:before {
236
+
237
+ display: inline-block;
238
+
199
239
  -webkit-transition: all .4s ease;
200
240
 
201
241
  transition: all .4s ease;
202
242
 
203
- }
204
-
205
- .tgl-light + .tgl-btn:after {
243
+ width: 100%;
206
-
244
+
207
- border-radius: 50%;
245
+ text-align: center;
208
-
209
- background: #fff;
246
+
210
-
211
- -webkit-transition: all .2s ease;
212
-
213
- transition: all .2s ease;
247
+ position: absolute;
214
-
215
- }
248
+
216
-
217
- .tgl-light:checked + .tgl-btn {
218
-
219
- background: #9FD6AE;
220
-
221
- }
222
-
223
-
224
-
225
- .tgl-ios + .tgl-btn {
226
-
227
- background: #fbfbfb;
228
-
229
- border-radius: 2em;
230
-
231
- padding: 2px;
232
-
233
- -webkit-transition: all .4s ease;
234
-
235
- transition: all .4s ease;
236
-
237
- border: 1px solid #e8eae9;
238
-
239
- }
240
-
241
- .tgl-ios + .tgl-btn:after {
242
-
243
- border-radius: 2em;
244
-
245
- background: #fbfbfb;
246
-
247
- -webkit-transition: left 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275), padding 0.3s ease, margin 0.3s ease;
248
-
249
- transition: left 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275), padding 0.3s ease, margin 0.3s ease;
250
-
251
- -webkit-box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1), 0 4px 0 rgba(0, 0, 0, 0.08);
252
-
253
- box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1), 0 4px 0 rgba(0, 0, 0, 0.08);
254
-
255
- }
256
-
257
- .tgl-ios + .tgl-btn:active {
258
-
259
- -webkit-box-shadow: inset 0 0 0 2em #e8eae9;
260
-
261
- box-shadow: inset 0 0 0 2em #e8eae9;
262
-
263
- }
264
-
265
- .tgl-ios + .tgl-btn:active:after {
266
-
267
- padding-right: .8em;
249
+ line-height: 2em;
268
-
269
- }
250
+
270
-
271
- .tgl-ios:checked + .tgl-btn {
272
-
273
- background: #86d993;
274
-
275
- }
276
-
277
- .tgl-ios:checked + .tgl-btn:active {
278
-
279
- -webkit-box-shadow: none;
280
-
281
- box-shadow: none;
251
+ font-weight: bold;
282
-
283
- }
252
+
284
-
285
- .tgl-ios:checked + .tgl-btn:active:after {
286
-
287
- margin-left: -.8em;
288
-
289
- }
290
-
291
-
292
-
293
- .tgl-skewed + .tgl-btn {
294
-
295
- overflow: hidden;
253
+ color: #fff;
296
-
297
- -webkit-transform: skew(-10deg);
254
+
298
-
299
- -ms-transform: skew(-10deg);
300
-
301
- transform: skew(-10deg);
255
+ position: absolute;
256
+
257
+ top: 0;
258
+
259
+ left: 0;
302
260
 
303
261
  -webkit-backface-visibility: hidden;
304
262
 
@@ -306,256 +264,66 @@
306
264
 
307
265
  backface-visibility: hidden;
308
266
 
309
- -webkit-transition: all .2s ease;
310
-
311
- transition: all .2s ease;
312
-
313
- font-family: sans-serif;
314
-
315
- background: #888;
267
+ border-radius: 4px;
316
-
268
+
317
- }
269
+ }
318
-
319
- .tgl-skewed + .tgl-btn:after, .tgl-skewed + .tgl-btn:before {
270
+
320
-
321
- -webkit-transform: skew(10deg);
322
-
323
- -ms-transform: skew(10deg);
324
-
325
- transform: skew(10deg);
326
-
327
- display: inline-block;
328
-
329
- -webkit-transition: all .2s ease;
330
-
331
- transition: all .2s ease;
332
-
333
- width: 100%;
334
-
335
- text-align: center;
336
-
337
- position: absolute;
338
-
339
- line-height: 2em;
340
-
341
- font-weight: bold;
342
-
343
- color: #fff;
344
-
345
- text-shadow: 0 1px 0 rgba(0, 0, 0, 0.4);
346
-
347
- }
348
-
349
- .tgl-skewed + .tgl-btn:after {
271
+ .tgl-flip + .tgl-btn:after {
350
-
351
- left: 100%;
352
272
 
353
273
  content: attr(data-tg-on);
354
274
 
275
+ background: #02C66F;
276
+
277
+ -webkit-transform: rotateY(-180deg);
278
+
279
+ -ms-transform: rotateY(-180deg);
280
+
281
+ transform: rotateY(-180deg);
282
+
355
- }
283
+ }
356
-
284
+
357
- .tgl-skewed + .tgl-btn:before {
285
+ .tgl-flip + .tgl-btn:before {
286
+
287
+ background: #FF3A19;
288
+
289
+ content: attr(data-tg-off);
290
+
291
+ }
292
+
293
+ .tgl-flip + .tgl-btn:active:before {
294
+
295
+ -webkit-transform: rotateY(-20deg);
296
+
297
+ -ms-transform: rotateY(-20deg);
298
+
299
+ transform: rotateY(-20deg);
300
+
301
+ }
302
+
303
+ .tgl-flip:checked + .tgl-btn:before {
304
+
305
+ -webkit-transform: rotateY(180deg);
306
+
307
+ -ms-transform: rotateY(180deg);
308
+
309
+ transform: rotateY(180deg);
310
+
311
+ }
312
+
313
+ .tgl-flip:checked + .tgl-btn:after {
314
+
315
+ -webkit-transform: rotateY(0);
316
+
317
+ -ms-transform: rotateY(0);
318
+
319
+ transform: rotateY(0);
358
320
 
359
321
  left: 0;
360
322
 
361
- content: attr(data-tg-off);
362
-
363
- }
364
-
365
- .tgl-skewed + .tgl-btn:active {
366
-
367
- background: #888;
368
-
369
- }
370
-
371
- .tgl-skewed + .tgl-btn:active:before {
372
-
373
- left: -10%;
374
-
375
- }
376
-
377
- .tgl-skewed:checked + .tgl-btn {
378
-
379
- background: #86d993;
380
-
381
- }
382
-
383
- .tgl-skewed:checked + .tgl-btn:before {
384
-
385
- left: -100%;
386
-
387
- }
388
-
389
- .tgl-skewed:checked + .tgl-btn:after {
390
-
391
- left: 0;
392
-
393
- }
394
-
395
- .tgl-skewed:checked + .tgl-btn:active:after {
396
-
397
- left: 10%;
398
-
399
- }
400
-
401
-
402
-
403
- .tgl-flat + .tgl-btn {
404
-
405
- padding: 2px;
406
-
407
- -webkit-transition: all .2s ease;
408
-
409
- transition: all .2s ease;
410
-
411
- background: #fff;
412
-
413
- border: 4px solid #f2f2f2;
414
-
415
- border-radius: 2em;
416
-
417
- }
418
-
419
- .tgl-flat + .tgl-btn:after {
420
-
421
- -webkit-transition: all .2s ease;
422
-
423
- transition: all .2s ease;
424
-
425
- background: #f2f2f2;
426
-
427
- content: "";
428
-
429
- border-radius: 1em;
430
-
431
- }
432
-
433
- .tgl-flat:checked + .tgl-btn {
434
-
435
- border: 4px solid #7FC6A6;
436
-
437
- }
438
-
439
- .tgl-flat:checked + .tgl-btn:after {
440
-
441
- left: 50%;
442
-
443
323
  background: #7FC6A6;
444
324
 
445
325
  }
446
326
 
447
-
448
-
449
- .tgl-flip + .tgl-btn {
450
-
451
- padding: 2px;
452
-
453
- -webkit-transition: all .2s ease;
454
-
455
- transition: all .2s ease;
456
-
457
- font-family: sans-serif;
458
-
459
- -webkit-perspective: 100px;
460
-
461
- -ms-perspective: 100px;
462
-
463
- perspective: 100px;
464
-
465
- }
466
-
467
- .tgl-flip + .tgl-btn:after, .tgl-flip + .tgl-btn:before {
468
-
469
- display: inline-block;
470
-
471
- -webkit-transition: all .4s ease;
472
-
473
- transition: all .4s ease;
474
-
475
- width: 100%;
476
-
477
- text-align: center;
478
-
479
- position: absolute;
480
-
481
- line-height: 2em;
482
-
483
- font-weight: bold;
484
-
485
- color: #fff;
486
-
487
- position: absolute;
488
-
489
- top: 0;
490
-
491
- left: 0;
492
-
493
- -webkit-backface-visibility: hidden;
494
-
495
- -ms-backface-visibility: hidden;
496
-
497
- backface-visibility: hidden;
498
-
499
- border-radius: 4px;
500
-
501
- }
502
-
503
- .tgl-flip + .tgl-btn:after {
504
-
505
- content: attr(data-tg-on);
506
-
507
- background: #02C66F;
508
-
509
- -webkit-transform: rotateY(-180deg);
510
-
511
- -ms-transform: rotateY(-180deg);
512
-
513
- transform: rotateY(-180deg);
514
-
515
- }
516
-
517
- .tgl-flip + .tgl-btn:before {
518
-
519
- background: #FF3A19;
520
-
521
- content: attr(data-tg-off);
522
-
523
- }
524
-
525
- .tgl-flip + .tgl-btn:active:before {
526
-
527
- -webkit-transform: rotateY(-20deg);
528
-
529
- -ms-transform: rotateY(-20deg);
530
-
531
- transform: rotateY(-20deg);
532
-
533
- }
534
-
535
- .tgl-flip:checked + .tgl-btn:before {
536
-
537
- -webkit-transform: rotateY(180deg);
538
-
539
- -ms-transform: rotateY(180deg);
540
-
541
- transform: rotateY(180deg);
542
-
543
- }
544
-
545
- .tgl-flip:checked + .tgl-btn:after {
546
-
547
- -webkit-transform: rotateY(0);
548
-
549
- -ms-transform: rotateY(0);
550
-
551
- transform: rotateY(0);
552
-
553
- left: 0;
554
-
555
- background: #7FC6A6;
556
-
557
- }
558
-
559
327
  .tgl-flip:checked + .tgl-btn:active:after {
560
328
 
561
329
  -webkit-transform: rotateY(20deg);