【Tailwind CSS】でスイッチ(トグル)ボタン作ってみた

最近はTailwind CSSを使用していて、とても快適だなと感じておりましてその流れで今回はよく使用されるであろうON・OFF切り替えできるスイッチボタンを生のCSSを使わずにTaliwind CSSのみで作成してみました！

<!-- wp:heading -->
<h2>やること</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>CSSを使わずに、Tailwindで用意されている<strong>「peer」</strong>という兄弟の状態に基づいて要素のスタイルを設定できるものを使用します。<br><br>なお今回はVue.jsファイルを用いて進めたいと思います。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><a href="https://tailwindcss.com/docs/hover-focus-and-other-states#styling-based-on-sibling-state" data-type="URL" data-id="https://tailwindcss.com/docs/hover-focus-and-other-states#styling-based-on-sibling-state" target="_blank" rel="noreferrer noopener">Tailwind CSS - peer- {modifier}について</a></p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2>準備</h2>
<!-- /wp:heading -->

<!-- wp:list -->
<ul><li>Tailwindの環境をご準備下さい。<br><a rel="noreferrer noopener" href="https://tailwindcss.com/docs/installation" data-type="URL" data-id="https://tailwindcss.com/docs/installation" target="_blank">Tailwindのインストール</a><br><br>※Tailwindのバージョンは3.0以降を使用。</li><li>適当なVueファイルを準備。<br><br>※Vue.jsのバージョンは3.2を使用。</li></ul>
<!-- /wp:list -->

```vuejs:Index.vue
<template>
  <label>
    <input type="checkbox" id="checkbox"/>
  </label>
</template>
```

チェックボックスのみが表示されている状態
![スクリーンショット-2022-02-21-16.59.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1040483/9081ea11-07ce-d272-2852-b20fdf5ef415.png)

<!-- wp:heading -->
<h2>実際にやってみる</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>早速スイッチボタンをTailwindを用いて作成していきます。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3>ON・OFFを判別するための変数を作成</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>スイッチボタンを押したときに、ON・OFFのフラグを変数で準備します。<br>Vue3では、変数をリアクティブな状態にするためにrefを使用します。</p>
<!-- /wp:paragraph -->

```diff_vue:Index.vue
<template>
  <label>
+    <input class="m-5" v-model="isCheck" type="checkbox"/>
+    {{ isCheck }}
  </label>
</template>

+ <script setup lang="ts">
+ import { ref } from "vue";
+ 
+ const isCheck = ref(false);
+ </script>
```

ON・OFFで変数の値（true・false）が切り替わっていることを確認。
![0f0f174d7ddf5a67188197ddf6f56ad8.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1040483/d647f4a8-46de-2ee2-8db0-b96bc091a9be.gif)

<!-- wp:heading {"level":3} -->
<h3>Tailwindでスイッチボタンのデザインを作成</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Tailwindの<meta charset="utf-8"><strong>「peer」</strong>を使って、兄弟要素の状態がchecked（チェックされたとき）にデザインが切り替わるようにクラスを指定します。</p>
<!-- /wp:paragraph -->

<!-- wp:list -->
<ul><li><strong>「sr-only」</strong>ではinputを視覚的に非表示にするクラスがTailwindで用意されております。</li></ul>
<!-- /wp:list -->

<!-- wp:list -->
<ul><li><strong>「after」</strong>では、疑似要素を用いて、ボタンの切り替えに使用する球体を作成しています。</li></ul>
<!-- /wp:list -->

<!-- wp:list -->
<ul><li><strong>「peer」</strong>をinput(兄要素)に設定してspan(弟要素)に「peer-checked」を指定することで、チェック(ON)されたときに疑似要素のafterに対して色を変えたり、丸い球体の位置をずらしたりしています。</li></ul>
<!-- /wp:list -->

```diff_vue:Index.vue
<template>
  <label>
    <input
       v-model="isCheck"
       type="checkbox"
+      class="peer sr-only"
    />
+    <span
+      class="block w-[2em] cursor-pointer bg-gray-500 rounded-full 
+      p-[1px] after:block after:h-[1em] after:w-[1em] after:rounded-full 
+      after:bg-white after:transition peer-checked:bg-blue-500 
+      peer-checked:after:translate-x-[calc(100%-2px)]"
+    >
+    </span>
    {{ isCheck }}
  </label>
</template>

<script setup lang="ts">
import { ref } from "vue";

const isCheck = ref(false);
</script>
```

スイッチボタン(トグル)が完成
![6d5ad904c79ba97cf0d4037cb533c46c.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1040483/bb11381e-092d-1a20-26b1-d0fd40e0a2b8.gif)