
2024/10/23 今日のリサーチ【Tailwind CSS初心者が絶対ハマる落とし穴】
TailwindCSSを学習中のため、情報収集をしていると私が求めていた動画を見つけました✨️
初心者の私がわかるように、アプトプットも含めてなるべく簡単にまとめてみました💡
1.クラス名を動的に組み立てる場合の問題
クラス名を動的に組み立てるとTailwind CSSが正しくスタイルを適用できなくなる理由を説明します。
私はこれを聞いて、そもそも「クラス名を動的に組み立てないとはどういう意味?」とまず疑問に思いました。
「クラス名を動的に組み立てない」とは?:
プログラム内でクラス名をその場で作ることを「動的に組み立てる」といいます。例えば、エラー時に背景を赤に、正常時には青にしたい場合、以下のように書くことがあります。
let color = "red";
let className = `bg-${color}-500`; // bg-red-500 が作られる
これはプログラムが動いてからクラス名が決まる方法です。しかし、TailwindCSSはあらかじめ決まっているクラス名でないと動きません。
対処法:
クラス名を動的に生成せずに、あらかじめ定義されたクラス名を使い分けるようにします。具体的に、エラーが発生した場合に背景を赤に、発生していない場合に青にするには、以下のように書きます。
let className = isError ? 'bg-red-500' : 'bg-blue-500';
これでTailwindCSSがクラス名を認識でき、スタイルが正しく適用されます。
2.クラス名のコンフリクトの問題
次に、クラス名が競合した場合の問題についてです。例えば、背景色をデフォルトで黄色に設定し、後から赤に変更をしたいとします。
<div class="bg-yellow-500 bg-red-500"></div>
この場合、TailwindCSSのルールで後から追加したクラス名(bg-red-500)が適用されると思うかもしれません。しかし、実際は"bg-yellow-500"が適用される場合があります。
理由:
Tailwind CSSはクラス名をアルファベット順に処理します。クラスを指定した順番に関係なく、"bg-red-500"よりも"bg-yellow-500"のスタイル優先されてしまうことがあります。これは、TailwindCSSが自動で生成される方法が原因です。
対処法:
クラス名の競合を防ぐために、「Tailwind Merge」というライブラリを使うと、最後に指定したクラスが正しく適用されるされます。
import { twMerge } from 'tailwind-merge';
let className = twMerge('bg-yellow-500', 'bg-red-500');
// 結果: className は 'bg-red-500' になる
このように、"twMerge"を使用すると競合するクラスを整理して、スタイルが正しく適用されるようになります。
まとめ
クラスを動的に組み立てない。あらかじめ決められたクラス名を使い、プログラムの状態に応じて適切なクラス名を選んで使う。
クラス名の競合を解決するには、「Tailwind Merge」ライブラリを使う。これにより、適切なクラスが優先されて、正しくスタイルが適用される。