Tailwind CSS の JIT モードを使って素早く開発しよう!

TwitterFacebookHatena
  • 公開:2023-09-19
  • 更新:2023-10-26
  • 文章量:3930
  • CSSTailwind

TL;DR

この記事では、Tailwind Just-in-Time(JIT)モードの実装について説明します。JIT モードを使用すると、[] ブラケット内に任意の値を直接指定できます。このモードにより、スタイルの柔軟性が増し、ページの読み込み速度も向上します。

Tailwind JIT モードは、実際にプロジェクトで使用されるクラスだけを生成するため、最終的な CSS ファイルサイズが小さくなります。

後述しますが、アコーディオンメニューも JavaScript を使わずに簡単に実装できます。

開発環境 バージョン
Next.js 13.4.4
TypeScript 5.0.4
Tailwind 3.3.3
Emotion 11.11.0
React 18.2.0

設定

設定が必要な場合は、tailwind.config.js に以下のように記述します。

// tailwind.config.js
module.exports = {
  mode: "jit",
  purge: ["./src/**/*.{js,ts,jsx,tsx}"],
};
  • mode: 'jit' この行で JIT モードを有効にします。
  • purge: ['./src/**/*.{js,ts,jsx,tsx}'] この行では、どのファイルをスキャンするかを指定しています。

詳細は、Just-in-Time Mode - Tailwind CSSを参照してください。

html に記述する

html に記述する場合は、このようになります。直接数値を記述できるので、分かりやすいですね。

<!-- 任意のマージンを設定 -->
<div class="mt-[40px]"></div>

<!-- 任意の幅を設定 -->
<div class="w-[60%] sm:w-[100%]"></div>

<!-- var関数 -->
<div class="text-[var(--black)]"></div>

<!-- 自動マージンを設定 -->
<div class="m-auto"></div>

tsx に記述する

tsx に記述する場合は、このようになります。html と同じ記述です。

<div className="mt-[80px]">
  <p>このテキストは上に80ピクセルのマージンがあります。</p>
</div>

複数のプロパティを指定する場合

改行しても反映されます。

<h4
  className="
  font-normal
  text-[#333]
  text-[1.4rem]"
>
  XXXX
</h4>

border を指定します。

<div className="border-t-[1px] border-b-[1px] border-[var(--mid-gray)]"></div>

画像のアスペクト比を指定する

画像にアスペクト比やオブジェクトの位置を指定する場合は、このようになります。

<Image
  src="/image/company/staff.jpg"
  alt=""
  width={800}
  height={800}
  className="
  aspect-[1/1]
  object-cover"
/>

Grid レイアウト

このコンポーネントは、子要素を 3 列のグリッドに配置する汎用的なレイアウトです。画面が小さい(smブレークポイント以下)場合は、1 列になります。グリッドの各アイテム間には 60 ピクセルのギャップが設定されています。全体の配置は中央になります。

type Props = {
  children: React.ReactNode;
};

const MyGrid = ({ children }: Props) => {
  return (
    <div
      className="
      mt-[40px]
      grid
      grid-cols-3
      sm:grid-cols-1
      gap-[60px]
      place-content-center"
    >
      {children}
    </div>
  );
};

export default MyGrid;

calc 関数を使う

自動計算も簡単です。

html

<!-- 幅を計算して設定 -->
<div class="w-[calc(100% - 16px)]"></div>

tsx

type Props = {
  someValue: number;
};

const MyComponent = ({ someValue }: Props) => {
  return (
    <div className={`w-[calc(100% - ${someValue}px)]`}>{/* コンテンツ */}</div>
  );
};

export default MyComponent;

疑似要素を使う

疑似要素を使う場合は、before:after: を使います。before:content-['XXXX'] というように、content の値を指定します。

<li key={index} className="before:content-['-'] before:text-[1.2rem]">
  {item}
</li>

var 関数を使う

CSS 変数を使用する場合、text-[var(--white)] のように指定することもできます。

<h3 className="text-center text-[var(--black)]">XXXX</h3>

アコーディオンメニュー

アコーディオンメニューを作成する際に、HTML の<summary>および<details>タグを使用すると、JavaScript なしで簡単に実装できます。以下はその一例です。

type AccordionProps = {
  title: string;
  content: string;
};

const Accordion = ({ title, content }: AccordionProps) => {
  return (
    <details className="border rounded overflow-hidden mb-4">
      <summary className="bg-gray-200 p-4 cursor-pointer">{title}</summary>
      <div className="p-4">{content}</div>
    </details>
  );
};

export default Accordion;

このAccordionコンポーネントはtitlecontentというプロパティを受け取り、それぞれが<summary><div>タグの中に表示されます。<details>タグによってアコーディオンの開閉機能が自動で備わります。

このコンポーネントを使用するには以下のようにします。

const App = () => {
  return (
    <div>
      <Accordion
        title="Section 1"
        content="This is the content for section 1"
      />
      <Accordion
        title="Section 2"
        content="This is the content for section 2"
      />
      {/* 他のコンポーネントや内容 */}
    </div>
  );
};

export default App;

動的なクラスの生成

動的にクラスを生成することができます。これは、React で UI を動的に制御する際に非常に有用です。

type ButtonProps = {
  isActive: boolean;
};

const Button = ({ isActive }: ButtonProps) => {
  const buttonClass = isActive ? "bg-blue-500" : "bg-gray-300";
  return <button className={buttonClass}>Click Me</button>;
};

Tailwind CSS の JIT モードを使って素早く開発しよう!