ワイ「Tailwind CSSで選択したラジオボタンの背景色を変えたいんやけど」

:::note warn
この記事はワイ記法です。やめ太郎@Yametaro氏にリスペクトをこめて。
:::

# ある日の我が家

ワイ「[去年趣味でアプリ作っていた](https://battingordermaker.web.app/)んやが」
ワイ「この頃はあまり見た目に拘ってなかったなぁ」
ワイ「ヤクルトも日本一になったし、この際セルフリメイクしてみよか！」[^1]

[^1]: ちなヤクちなハム

# Tailwind CSSを使ってみた

ワイ「はぇーBootstrapだけじゃなくて」
ワイ「[Tailwind CSS](https://tailwindcss.com/)ってのもあるんか」
ワイ「前回はBootstrapやったし、Tailwind CSSを使ってみるか」

# ラジオボタンをどうにかしたい

ワイ「ラジオボタンそのまま表示するのもなんか味気ないな・・・」
ワイ「どれどれ・・・ラジオボタンをボタン風に表示させることもできるんか」[^2]
ワイ「これをTailwind CSSでいっちょやってみっか！」

[^2]: これ自体はCSSのみで可能です

# まず通常通りラジオボタンを配置する

ワイ「まずは普通にラジオボタンを配置してみよか」

```radiobutton.html
<body>
  <div>
    <input type="radio" name="central" id="swallows" value="東京ヤクルトスワローズ">
    <label for="swallows">東京ヤクルトスワローズ</label>
  </div>
  <div>
    <input type="radio" name="central" id="tigers" value="阪神タイガース">
    <label for="tigers">阪神タイガース</label>
  </div>
  <div>
    <input type="radio" name="central" id="giants" value="読売ジャイアンツ">
    <label for="giants">読売ジャイアンツ</label>
  </div>
  <div>
    <input type="radio" name="central" id="carp" value="広島東洋カープ">
    <label for="carp">広島東洋カープ</label>
  </div>
  <div>
    <input type="radio" name="central" id="dragons" value="中日ドラゴンズ">
    <label for="dragons">中日ドラゴンズ</label>
  </div>
  <div>
    <input type="radio" name="central" id="baystars" value="横浜DeNAベイスターズ">
    <label for="baystars">横浜DeNAベイスターズ</label>
  </div>
</body>
```

![スクリーンショット 2021-11-28 0.55.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181775/6bad157c-6c05-51ae-d9f9-2440d348ecc9.png)

ワイ「まずはこんなもんか」
ワイ「Tailwind CSSを導入して」
ワイ「ラジオボタンのclassにhiddenをつけると○が非表示になるんやな」

```hidden_radiobutton.html
〜略〜
  <div>
    <input type="radio" name="central" id="swallows" value="東京ヤクルトスワローズ" class="hidden">
    <label for="swallows">東京ヤクルトスワローズ</label>
  </div>
〜略〜
```

![スクリーンショット 2021-11-28 1.02.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181775/359c4fed-a866-b66e-56e2-f84ed30a2809.png)

ワイ「お！いけるやん！」
ワイ「じゃあボタンっぽい表示にしよか」

〜〜試行錯誤中〜〜

ワイ「これでどやろか」
ワイ「labelのclassに色々追加してみたで」

```radiobutton.html
〜〜略〜〜
  <div>
    <input type="radio" name="central" id="swallows" value="東京ヤクルトスワローズ" class="hidden">
    <label for="swallows" class="flex flex-col w-full max-w-lg mx-auto text-center border-2 rounded-2xl border-gray-900 p-2 my-4 text-3xl">東京ヤクルトスワローズ</label>
  </div>
〜〜略〜〜
```

![スクリーンショット 2021-11-28 1.08.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181775/12ceecb7-3fa3-b355-c2ba-f9ff3f7fedff.png)

ワイ「おっええやん」
ワイ「ボタンっぽくなったね（ニッコリ）」

# もうちょい映えさせたい
ワイ「このままだとちょっと寂しいのは変わらんなぁ」
ワイ「[ドキュメント](https://tailwindcss.com/docs)眺めてみよか」
ワイ「hoverってのがあるんか」
ワイ「カーソル乗せてる時に色変わったら見やすいんちゃうか？」

```radiobutton.html
〜〜略〜〜
  <div>
    <input type="radio" name="central" id="swallows" value="東京ヤクルトスワローズ" class="hidden">
    <label for="swallows" class="flex flex-col w-full max-w-lg mx-auto text-center border-2 rounded-2xl border-gray-900 p-2 my-4 text-3xl hover:bg-yellow-200">東京ヤクルトスワローズ</label>
  </div>
〜〜略〜〜
```

![hover.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181775/74581e2d-db6a-db4e-c27e-0117e0042ea8.gif)

ワイ「これなら今何を選ぼうとしてるかはっきりわかんだね」

# 本題：クリックした項目の背景色を変える

ワイ「これはええんやけど」
ワイ「このままだとどれを選択したかはわからないんやな」
ワイ「ということは」
ワイ「今度は選択したら背景色を変えるようにすればええんやな」
ワイ「[このcheckedみたいにしたらええんかな？](https://tailwindcss.com/docs/hover-focus-and-other-states#checked)」
ワイ「`checked:bg-green-200`を追加してみたで」

```button.html
〜〜略〜〜
  <div>
    <input type="radio" name="central" id="swallows" value="東京ヤクルトスワローズ" class="hidden">
    <label for="swallows" class="flex flex-col w-full max-w-lg mx-auto text-center border-2 rounded-2xl border-gray-900 p-2 my-4 text-3xl hover:bg-yellow-200 checked:bg-green-200">東京ヤクルトスワローズ</label>
  </div>
〜〜略〜〜
```

:::note
確認のため、選択した項目を下に表示しています。
:::
![checked.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181775/dc89501e-f319-a46e-c33f-77aad1e2462c.gif)

ワイ「あれれ〜？」
ワイ「確実にクリックされてるはずなのに」
ワイ「背景色が変わらん・・・」

娘(**４歳**)[^3]「パパー」
娘「そのcheckedはcheckboxの時に使えるやつなの」
娘「ラジオボタンでは使えないのよ」


[^3]: 実在するで


ワイ「なんやて！」
ワイ「（4歳なのに既にワイよりTailwind CSSを理解している・・・！？」

ワイ「娘ちゃん、どこでそんなの知ったんや」
娘「先生がよく読み聞かせをしてくれるの」

ワイ「（今時の保育園はドキュメントの読み聞かせをしてるんか・・・？）」
ワイ「（ワイは幼稚園通いだったからぐりとぐらばっか読んでたわ・・・）」

ワイ「で、でも娘ちゃん。そしたらクリックした箇所の背景色を変えるのはできないってことなんか？」

娘「ググっても日本語の記事が出ないからって諦めちゃダメよ」
娘「それに、ちゃんと[Stack Overflowに同じ質問があったよ](https://stackoverflow.com/questions/65784357/tailwindcss-change-label-when-radio-button-checked)」
娘「その回答によると」
娘「Tailwind CSS v2.1以上で使えるJust-in-Timeモードにした上で」
娘「inputの方のclassに`peer`を追加して」
娘「labelの方のclassに`peer-checked`を追加すると」
娘「チェックした時にどうするか指定できるみたいね」

```radiobutton.html
〜〜略〜〜
  <div>
    <input type="radio" name="central" id="swallows" value="東京ヤクルトスワローズ" class="hidden peer">
    <label for="swallows" class="flex flex-col w-full max-w-lg mx-auto text-center border-2 rounded-2xl border-gray-900 p-2 my-4 text-3xl hover:bg-yellow-200 peer-checked:bg-green-200">東京ヤクルトスワローズ</label>
  </div>
〜〜略〜〜
```

![peer-checked.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181775/39d82dca-f33a-7ca8-59c5-1ae888b9ef11.gif)

娘「今回は`peer-checked:bg-green-200`にして、緑になるようにしてみたの」
娘「ほらできたでしょ（ﾄﾞﾔｯ）」
ワイ「はぇ〜すっごい・・・」

娘「ちなみにJust-in-Timeモードについては「[こ↑こ↓](https://tailwindcss.com/docs/just-in-time-mode)」をみてね」
娘「CDNで試してみたい場合は、`<script src="https://unpkg.com/tailwindcss-jit-cdn"></script>`を使うといいみたい」

ワイ「サンキュームッスメ」
ワイ「ちょっとこれでやってみるわ！」

# 数日後
ワイ「いやー娘ちゃんのおかげでなんとかいい感じにできたわ」
ワイ「根を詰めたから22時には寝てもうたわ！」
ヨッメ「（一体いつ作業していたのかしら・・・）」

ワイ「ひとまず現状のスキルとしては十分やな彡(^)(^)」
ワイ「良かったら使ってみてくれやで〜彡(^)(^)」

https://npb-battingorder-maker.netlify.app/


# 参考
+ [CSSだけでボタン風のラジオボタン](http://blog.mwsoft.jp/article/115379493.html)
+ [TailwindCSS - Change Label When Radio Button Checked](https://stackoverflow.com/questions/65784357/tailwindcss-change-label-when-radio-button-checked)
+ [Tailwind CSS v2.2](https://blog.tailwindcss.com/tailwindcss-2-2)
+ [説明用に作成したコードはこちら](https://github.com/shimayu22/expert-fiesta)
+ [Qiitaにアップする画面動画をgifアニメで簡単に作ろう](https://qiita.com/bohebohechan/items/f8bf6d4bbe0f14497a7b)

# おまけ
https://note.com/shimayu22/n/nd65fbd7ebe03