はじめに
最近流行りのTailwind CSS
を使ってみました。
筆者は普段、Bootstrap
を主に使用して仕事してます。
Bootstrap
と比べて何が良いんだろうと比べつつ私が思うメリット、デメリットを考えてみたいと思います。
今更ながら graphql-code-generator の便利さを痛感するで作成した、TODOアプリに Tailwind CSS
を導入して、感触を確かめてみようと思います。
今回作成する内容はgraphql-code-generator
のサンプルが主ですが、GitHubに置いてあります。
このTODOアプリは、create-react-app
で作成しており、特にスタイルは変更していません。
Tailwind CSS
を入れる前は、こんな感じです。
インストール
公式通りにやりますが、私はyarn
で入れます
$ yarn add -D tailwindcss@npm:@tailwindcss/postcss7-compat postcss@^7 autoprefixer@^9
CRACOを使わないといけないらしいのでインストールする
$ yarn add @craco/craco
cracoの設定
react-scripts
を使用しているeject
以外のスクリプトをcraco
に変更します。
"scripts": {
- "start": "react-scripts start",
- "build": "react-scripts build",
- "test": "react-scripts test",
+ "start": "craco start",
+ "build": "craco build",
+ "test": "craco test",
"eject": "react-scripts eject",
}
craco
で動かすので、設定ファイルを作成します。
module.exports = {
style: {
postcss: {
plugins: [
require('tailwindcss'),
require('autoprefixer'),
],
},
},
}
この時点で、craco
の設定は完了しているので、動くようにはなりました。
tailwindの設定
$ yarn tailwindcss init
tailwind.config.js
ファイルが生成されました。
本番環境用に、このファイルのpurge
というところの設定を変更するそうです。
tailwind
はかなり多くのclass
を用意していますが、本番環境でも全てのclass
定義を読み込んでしまうと重たくなってしまいます。
この設定は、未使用のclass
は読み込まないようにする設定となります。
今回は、本番で動作させないのでスキップします。
本番環境用の設定を行いたい場合は、こちらを参照してください。
Tailwind CSS
を使う下準備は整ったので、今のスタイル(ロゴも)を全て削除してみます。
このまっさらな状態に、Tailwind CSS
のスタイルを少しずつ当てていきたいと思います。
Tailwind CSSのclassを利用できるようにする
@tailwind base;
@tailwind components;
@tailwind utilities;
この時点では、こんな感じです。
画面の真ん中辺りに表示してみる
左上に表示されてしまっているので、真ん中辺りにカードを用意し、その中にリストが並んでいる感じにしてみます。
とりあえず真ん中に表示
flex items-center justify-center
のclass
を追加して真ん中に表示します。
水平方向には中央揃えされましたが、垂直方向には中央揃え出来てません。
※位置関係がわかりにくいので、html
タグにbg-gray-500
のclass
を追加して色付けしてます。
flex
をつけた要素がそもそも小さいようです。
高さを追加してやります。
tailwindcss height
と調べてここに辿り着きました。
かなり多くのclass
が用意されていますね。
Bootstrap
にも100vh
の高さを指定する用のvh-100
がありますが、種類に関しては、tailwindcss
の方が多いと実感させられますね。
今回は、高さを目一杯広げたいので、flex
を追加した要素にh-screen
を追加します。
垂直方向にも中央に表示されました。
カード形式で表示させてみる
Bootstrap
脳なので、card
的なclass
を使いたいところですね。
中央要素の背景色を白っぽくしてみる
まずは、中央要素の背景をbg-white
を使って白くしてみました。
用意されている背景色用のclassを見てみましたが、やっぱり豊富ですね。
せっかくなのでbg-white
ではなくbg-gray-50
にしておきます。(あんまり変わりませんがなんとなく)
角に丸みをつけてパディングをつけてみる
border-radiusも多いっすね〜
rounded-lg
にしてみますか
paddingは、p-8
辺りにしてみます。
bg-gray-50
を追加した要素にrounded-lg
とp-8
を追加します。
なんか一気に雰囲気が出てきました
影もつけてみる
背景色が結構濃い色になってるので、box-shadowから、きつめのshadow-2xl
を選びました。
うん、いい感じ
カードのタイトルをいい感じにする
カードの中のスタイルをつけていきます
Bootstrap
脳だとcard-title
とかつけるとこですね
タイトルがcreate-react-app
で作った時のままになってるので、文言を変えます
文字サイズと文字色を変更
font-sizeから探して、text-3xl
くらいにしてみます。
せっかくなので文字色もtext-colorから探して、text-red-800
にしてみます。
入力欄をいい感じにする
Todoの名称を入力する入力フィールドにスタイルをつけていきます
上下の要素と距離感が近いので余白をあけます
marginから探してmy-4
をつけてみます。
あとは、枠線、影、角の丸み、paddingあたりをつけてみます。
-
borderから
border
-
box-shadowから
shadow
-
border-radiusから
rounded
-
paddingから縦は
py-2
、横はpx-3
いい感じになってきました
リストをいい感じにする
リストで表示している部分にスタイルをつけてきます
Todo名とボタンが近いのでこれをなんとかします
Todo名を80%くらい、ボタンを20%くらいの4/5 - 1/5って感じにしたいですね〜
widthを探すとw-1/5
とかw-4/5
ってやつがありました。
li
タグにflex
をつけて、Todo名の要素にw-4/5
、ボタン要素にw-1/5
をつけてみます。
いい感じに離れてくれました。
リスト同士にも距離感をつけてみる
リスト同士も少し距離感が近いので、li
にpy-2
をつけてみます。
マウスオーバーでリストの背景色を変えてみる
リストをホバーした際、li
要素をbg-gray-200
な背景色に変えてみます。
li
要素にhover:bg-gray-200
を追加するだけでした。
これはめっちゃ便利
Todo名の左に余裕がないのと、ホバーした際の背景色領域の角に丸みをつけてよりいい感じにします。
Todo名の要素にpx-1
を追加、li
タグにrounded
を追加しました。
削除ボタンをいい感じにする
削除ボタンにスタイルをつけていきます
付けたいスタイルは以下です。
- 枠線
-
border-widthから
border-2
-
border-widthから
- 枠線の色
-
border-colorから
border-red-400
-
border-colorから
- パディング
-
paddingから
p-2
-
paddingから
- 改行禁止
-
whitespaceから
whitespace-nowrap
-
whitespaceから
- 角の丸み
-
border-radiusから
rounded
-
border-radiusから
- 文字色
-
text-colorから
text-red-400
-
text-colorから
- ホバー時(
hover:
)- 文字色
-
text-colorから
text-white
-
text-colorから
- 背景色
-
background-colorから
bg-red-400
-
background-colorから
- 文字色
ボタンから文言がはみ出てしまってますね
カードの幅を大きくする
h-screen
を追加した要素に、p-20
を追加して、bg-gray-50
を追加したカード要素にw-full
を追加します。
Todo名とボタンの表示高さがズレているので、items-center
をli
要素に追加します。
あと、入力欄も小さいのでw-full
をつけて大きくします。
ボタンのサイズが大きくなっているのが気になりますね〜
あと、Todo名が長すぎる場合、改行されてしまうので、なんとかしたいです。
ボタンのサイズを必要最低限にして、Todo名がはみ出たら...
で表示する
Todo名のw-4/5
とボタンのw-1/5
を削除して、Todo名要素にflex-autoをつけます
Todo名がはみ出たら...
にする為に、text-overflowのtruncate
をTodo名要素につけます
ここまでくると、実は気になっていた、Todoを登録するボタンがバランス的に欲しくなってきました。
Todoの登録ボタンを追加してみる
Tailwindの話から一時的に逸れますが登録ボタンを追加しました。
削除ボタンのblue
バージョンを登録ボタンのスタイルにしました。
レスポンシブにもしてみる
今は、画面の表示領域に余裕がある前提でやっているので、これを小さくてもいい感じに見えるようにしてみます。
それほど表示している項目が多いわけではないので、違和感があると言われたらあんまりないですが、Tailwind CSS
のレスポンシブを体験してみます。
画面幅が小さければ、カードのサイズを少し広げてみる
responsive-designに用意されているように、sm
やlg
のように接頭辞をつけると画面幅の状況によって、反映させたいスタイルを変更することができるとのことです。
hover
の時とおんなじ感じですね。
h-screen
を使っている要素では、p-20
としていましたが、これをlg:p-36 md:p-28 sm:p-20 p-4
に変更します。
p-4
と接頭辞をつけていないものがある理由はこちらにも記載があるように、接頭辞がないものをモバイル(画面が小さい時)に反映させたいclass
という風にするそうです。
sm
をつけているp-20
は、画面幅が640px
以上の時に反映されます。
md
をつけているp-28
は、画面幅が768px
以上の時に反映されます。
lg
をつけているp-36
は、画面幅が1024px
以上の時に反映されます。
接頭辞をつけていないp-4
は、画面幅が640px
より小さい時に反映されます。
↑ chromeで表示できる一番小さいサイズにした時、カードの幅が広がりました。
↑ 画面幅が1024px
なので、p-36
が反映されました。
画面幅が小さいときは、Todoの追加が行いやすいように入力欄の下に大きく表示できるようにしてみる
画面幅が640px
より小さい場合を画面幅が小さい時とします。
- 入力欄とボタンを横並びにする為に、
flex
を使用しているこれを、sm:flex
にする。 - 登録ボタンの横幅を
w-full
にする- 画面幅が
640px
以上の場合、w-auto
にする為に、sm:w-auto
にする
- 画面幅が
- 登録ボタンの左のマージンに
sm:
をつける - 入力欄の下に画面幅が
640px
より小さい場合、登録ボタンとの間隔を空ける為にmb-3
をつける- 画面幅が
640px
以上の場合、mb-0
にする為に、sm:mb-0
にする
- 画面幅が
↑ 画面幅が小さい場合は、登録ボタンが入力欄の下に大きく表示されるようになりました。
画面幅が大きい場合は、これまで通り表示されます。
いい感じになったのではないでしょうか!
終わりに
実際に使ってみて感じた個人的なメリット、デメリットをあげてみます。
メリット
- 用意されている
class
が豊富で、自分でスタイルを定義する必要がなさそう- 自分でスタイルを定義すると、クラス名とか考えないといけないので大変な部分が解消
-
sm
とかmd
とか、hover
とかの接頭辞をつけるだけで、色々できるので、超簡単 - 公式サイトの
class
の説明が見やすいので調査コストが少ない?
デメリット
- 凝ったデザインにすると
class
がかなり長くなる- 今回一番長かったのは登録ボタンのこれ
sm:ml-3 border-2 p-2 whitespace-nowrap rounded text-blue-400 border-blue-400 hover:text-white hover:bg-blue-400 sm:w-auto w-full
- HTMLが汚くなりそうだけど、ReactとかVue.jsは、変数にクラス名を詰め込んでおいて、それをコンポーネントで利用するとHTMLの部分は綺麗に書くこともできそう?
- 結局変数名を考えてしまっているので、スタイルを定義する時のクラス名を考えるのと同コストかも?
- 今回一番長かったのは登録ボタンのこれ
- 同様の凝ったスタイルを別の箇所で利用する時、冗長になりそう
- ReactやVue.jsでは共通コンポーネントにしてしまうことで解消できそう?
- cssの知識がある前提
- 当たり前と言われれば当たり前
-
Bootstrap
を利用したことがあって、Bootstrap
が用意しているclass
名だけを覚えている人は大変かも
普段Bootstrap
を使って仕事している筆者は、〇〇なスタイルが含まれたクラスはないかな〜って感じで調べることもあるので、個人的には、スタイル直なクラスが用意されている方が嬉しみがあったので、使い勝手が良さそうな感触でした。
参考文献
https://tailwindcss.com/docs/guides/create-react-app
https://reffect.co.jp/react/react-tailwind