4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-02-25

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

やること

CSSを使わずに、Tailwindで用意されている「peer」という兄弟の状態に基づいて要素のスタイルを設定できるものを使用します。

なお今回はVue.jsファイルを用いて進めたいと思います。

Tailwind CSS - peer- {modifier}について

準備

  • Tailwindの環境をご準備下さい。
    Tailwindのインストール

    ※Tailwindのバージョンは3.0以降を使用。
  • 適当なVueファイルを準備。

    ※Vue.jsのバージョンは3.2を使用。
Index.vue
<template>
  <label>
    <input type="checkbox" id="checkbox"/>
  </label>
</template>

チェックボックスのみが表示されている状態
スクリーンショット-2022-02-21-16.59.39.png

実際にやってみる

早速スイッチボタンをTailwindを用いて作成していきます。

ON・OFFを判別するための変数を作成

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

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

Tailwindでスイッチボタンのデザインを作成

Tailwindの「peer」を使って、兄弟要素の状態がchecked(チェックされたとき)にデザインが切り替わるようにクラスを指定します。

  • 「sr-only」ではinputを視覚的に非表示にするクラスがTailwindで用意されております。
  • 「after」では、疑似要素を用いて、ボタンの切り替えに使用する球体を作成しています。
  • 「peer」をinput(兄要素)に設定してspan(弟要素)に「peer-checked」を指定することで、チェック(ON)されたときに疑似要素のafterに対して色を変えたり、丸い球体の位置をずらしたりしています。
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

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?