<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>スタイル – AichiLog</title>
	<atom:link href="https://aichi.blog/category/programming/%E3%82%B9%E3%82%BF%E3%82%A4%E3%83%AB/feed/" rel="self" type="application/rss+xml" />
	<link>https://aichi.blog</link>
	<description>学びて富み　富みて学ぶ</description>
	<lastBuildDate>Thu, 06 Feb 2025 15:29:33 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://aichi.blog/wp-content/uploads/2021/12/cropped-915AB649-D1E9-4810-9658-CB8CE1B605FD.JPEG-2-32x32.jpeg</url>
	<title>スタイル – AichiLog</title>
	<link>https://aichi.blog</link>
	<width>32</width>
	<height>32</height>
</image> 
<atom:link rel="hub" href="https://pubsubhubbub.appspot.com"/>
<atom:link rel="hub" href="https://pubsubhubbub.superfeedr.com"/>
<atom:link rel="hub" href="https://websubhub.com/hub"/>
<atom:link rel="self" href="https://aichi.blog/category/programming/%E3%82%B9%E3%82%BF%E3%82%A4%E3%83%AB/feed/"/>
	<item>
		<title>最新のCSSスコーピング技術でTailwind CSSの限界を超える！</title>
		<link>https://aichi.blog/latest-css-scoping-techniques-beyond-tailwind/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=latest-css-scoping-techniques-beyond-tailwind</link>
		
		<dc:creator><![CDATA[愛知郎]]></dc:creator>
		<pubDate>Sat, 04 Nov 2023 14:18:53 +0000</pubDate>
				<category><![CDATA[スタイル]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[tailwind]]></category>
		<category><![CDATA[文法]]></category>
		<guid isPermaLink="false">https://aichi.blog/?p=3342</guid>

					<description><![CDATA[<p>Web開発の世界では、スタイリングのためのツールとしてCSSフレームワークが長らく重宝されてきました。 その中でも、Tailwind CSSはその直感的なインラインクラスと効率的なデザインパターンで、多くの開発者から支持 [&#8230;]</p>
<p>The post <a href="https://aichi.blog/latest-css-scoping-techniques-beyond-tailwind/">最新のCSSスコーピング技術でTailwind CSSの限界を超える！</a> first appeared on <a href="https://aichi.blog">AichiLog</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>Web開発の世界では、スタイリングのためのツールとしてCSSフレームワークが長らく重宝されてきました。</p>



<p>その中でも、Tailwind CSSはその直感的なインラインクラスと効率的なデザインパターンで、多くの開発者から支持を受けています。しかし、技術は常に進化しており、今日ではネイティブCSSの新機能が、私たちのCSSに対するアプローチを根本から変えようとしています。</p>



<p>この記事では、Tailwind CSSのインラインクラスの利点とその限界、そしてそれを超えるネイティブCSSのスコーピング技術について、具体的なコード例を交えながら詳しく解説します。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2" checked><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">インラインクラスの魔法とその裏側</a><ol><li><a href="#toc2" tabindex="0">インラインクラスの魔法:</a></li><li><a href="#toc3" tabindex="0">しかし、問題も&#8230;</a></li></ol></li><li><a href="#toc4" tabindex="0">ネイティブCSSのスコーピングでスマートなスタイリング</a><ol><li><a href="#toc5" tabindex="0">カスケードレイヤーで整理整頓</a></li><li><a href="#toc6" tabindex="0">ネスティングで直感的な構造</a></li></ol></li><li><a href="#toc7" tabindex="0">結論: モダンCSSの力で開発を加速</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">インラインクラスの魔法とその裏側</span></h2>



<h3 class="wp-block-heading"><span id="toc2">インラインクラスの魔法:</span></h3>



<p>Tailwind CSSを使うと、HTML内でクラスを直接指定することで、迅速にスタイルを適用できます。</p>



<p>これにより、開発者はCSSファイルを別に管理することなく、一つのファイルで完結することが可能です。</p>



<pre class="wp-block-code"><code>&lt;!-- Tailwindのインラインクラスを使用したボタンの例 --&gt;
&lt;button class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded"&gt;
  Click me!
&lt;/button&gt;

</code></pre>



<h3 class="wp-block-heading"><span id="toc3">しかし、問題も&#8230;</span></h3>



<p>しかし、この便利さには代償があります。インラインクラスが多用されると、HTMLファイルのサイズが肥大化し、結果としてページのパフォーマンスに悪影響を及ぼす可能性があります。</p>



<p>また、多くのクラスが並ぶことで、コードの可読性が低下し、デバッグが難しくなることもあります。</p>



<pre class="wp-block-code"><code>&lt;!-- インラインクラスが多くなりがちなHTMLの例 --&gt;
&lt;div class="p-4 max-w-sm mx-auto bg-white rounded-xl shadow-md flex items-center space-x-4"&gt;
  &lt;div class="flex-shrink-0"&gt;
    &lt;!-- ... --&gt;
  &lt;/div&gt;
  &lt;div&gt;
    &lt;div class="text-xl font-medium text-black"&gt;
      &lt;!-- ... --&gt;
    &lt;/div&gt;
    &lt;p class="text-gray-500"&gt;
      &lt;!-- ... --&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

</code></pre>



<h2 class="wp-block-heading"><span id="toc4">ネイティブCSSのスコーピングでスマートなスタイリング</span></h2>



<h3 class="wp-block-heading"><span id="toc5">カスケードレイヤーで整理整頓</span></h3>



<p>ネイティブCSSのカスケードレイヤーを使うことで、スタイルシート内でのスコープを明確に定義し、管理を容易にすることができます。</p>



<p>これにより、スタイルの重複を避け、より効率的なコードを書くことが可能になります。</p>



<pre class="wp-block-code"><code>@layer base {
  .btn {
    /* ベースとなるボタンスタイル */
  }
}

@layer components {
  .btn-primary {
    /* プライマリーボタンのスタイル */
  }
}

</code></pre>



<h3 class="wp-block-heading"><span id="toc6">ネスティングで直感的な構造</span></h3>



<p>CSSのネスティングを利用すると、関連するスタイルを一つのブロック内でグループ化できます。</p>



<p>これにより、コードの構造が直感的になり、メンテナンスがしやすくなります。</p>



<pre class="wp-block-code"><code>.navbar {
  &amp;__item {
    /* ナビゲーションアイテムのスタイル */
  }
  &amp;__item--active {
    /* アクティブなアイテムのスタイル */
  }
}

</code></pre>



<h2 class="wp-block-heading"><span id="toc7">結論: モダンCSSの力で開発を加速</span></h2>



<p>Tailwind CSSは依然として強力なツールですが、ネイティブCSSの新機能を活用することで、より洗練された、パフォーマンスに優れたコードを書くことができます。</p>



<p>カスケードレイヤーやネスティングなどの技術は、私たちのCSSの書き方をより効率的で、管理しやすいものに変えてくれます。</p>



<p>Tailwind CSSのインラインクラスの利点を活かしつつ、ネイティブCSSのスコーピング技術でその限界を超えてみませんか？</p><p>The post <a href="https://aichi.blog/latest-css-scoping-techniques-beyond-tailwind/">最新のCSSスコーピング技術でTailwind CSSの限界を超える！</a> first appeared on <a href="https://aichi.blog">AichiLog</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Next.jsにおける、globals.cssのデフォルトコードを解説</title>
		<link>https://aichi.blog/nextjs-globals-css-default-code-explanation/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=nextjs-globals-css-default-code-explanation</link>
		
		<dc:creator><![CDATA[愛知郎]]></dc:creator>
		<pubDate>Sat, 04 Nov 2023 15:24:45 +0000</pubDate>
				<category><![CDATA[スタイル]]></category>
		<category><![CDATA[next.js]]></category>
		<category><![CDATA[tailwind]]></category>
		<guid isPermaLink="false">https://aichi.blog/?p=3346</guid>

					<description><![CDATA[<p>npx create-next-appで新しくプロジェクトを作成したい際、**globals.css**ファイルは下記のようなコードになっています。 今回の記事では、このコードをについて解説します。 目次 Tailwin [&#8230;]</p>
<p>The post <a href="https://aichi.blog/nextjs-globals-css-default-code-explanation/">Next.jsにおける、globals.cssのデフォルトコードを解説</a> first appeared on <a href="https://aichi.blog">AichiLog</a>.</p>]]></description>
										<content:encoded><![CDATA[<p><code>npx create-next-app</code>で新しくプロジェクトを作成したい際、<code>**globals.css**</code>ファイルは下記のようなコードになっています。</p>



<pre class="wp-block-code"><code>@tailwind base;
@tailwind components;
@tailwind utilities;

:root {
  --foreground-rgb: 0, 0, 0;
  --background-start-rgb: 214, 219, 220;
  --background-end-rgb: 255, 255, 255;
}

@media (prefers-color-scheme: dark) {
  :root {
    --foreground-rgb: 255, 255, 255;
    --background-start-rgb: 0, 0, 0;
    --background-end-rgb: 0, 0, 0;
  }
}

body {
  color: rgb(var(--foreground-rgb));
  background: linear-gradient(
      to bottom,
      transparent,
      rgb(var(--background-end-rgb))
    )
    rgb(var(--background-start-rgb));
}
</code></pre>



<p>今回の記事では、このコードをについて解説します。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-4" checked><label class="toc-title" for="toc-checkbox-4">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">Tailwind CSSの基本</a></li><li><a href="#toc2" tabindex="0">カスタムプロパティの定義</a></li><li><a href="#toc3" tabindex="0">ダークモードのスタイル適用</a></li><li><a href="#toc4" tabindex="0">body 要素のスタイリング</a></li><li><a href="#toc5" tabindex="0">まとめ</a></li><li><a href="#toc6" tabindex="0">おまけ</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">Tailwind CSSの基本</span></h2>



<p>Tailwind CSSは、ユーティリティファーストのCSSフレームワークで、クラス名を組み合わせることで迅速にスタイルを適用できます。</p>



<p>以下のコードは、Tailwind CSSの基本的な構成を示しています。</p>



<pre class="wp-block-code"><code>@tailwind base; /* 基本的なスタイルをインポート */
@tailwind components; /* コンポーネントレベルのスタイルをインポート */
@tailwind utilities; /* ユーティリティクラスをインポート */</code></pre>



<p>これらのディレクティブにより、Tailwindの全てのスタイリング機能が利用可能になります。</p>



<h2 class="wp-block-heading"><span id="toc2">カスタムプロパティの定義</span></h2>



<p>CSSのカスタムプロパティ（変数）を使用することで、テーマの色を一元管理できます。<code>:root</code> セレクタを使用して、ライトモードのデフォルトカラーを定義します。</p>



<pre class="wp-block-code"><code>:root {
  --foreground-rgb: 0, 0, 0; /* テキスト色：黒 */
  --background-start-rgb: 214, 219, 220; /* 背景グラデーション開始色：明るいグレー */
  --background-end-rgb: 255, 255, 255; /* 背景グラデーション終了色：白 */
}</code></pre>



<h2 class="wp-block-heading"><span id="toc3">ダークモードのスタイル適用</span></h2>



<p>ユーザーがダークモードを好む場合に適用されるスタイルを、メディアクエリを使って定義します。</p>



<pre class="wp-block-code"><code>@media (prefers-color-scheme: dark) {
  :root {
    --foreground-rgb: 255, 255, 255; /* テキスト色：白 */
    --background-start-rgb: 0, 0, 0; /* 背景グラデーション開始色：黒 */
    --background-end-rgb: 0, 0, 0; /* 背景グラデーション終了色：黒 */
  }
}</code></pre>



<p>このメディアクエリは、システムの設定に基づいて自動的にダークモードのスタイルを適用します。</p>



<h2 class="wp-block-heading"><span id="toc4">body 要素のスタイリング</span></h2>



<p>最後に、<code>body</code> 要素に対して、定義したカスタムプロパティを使用してスタイリングを適用します。</p>



<pre class="wp-block-code"><code>body {
  color: rgb(var(--foreground-rgb)); /* カスタムプロパティを使用してテキスト色を設定 */
  background: linear-gradient(
      to bottom,
      transparent,
      rgb(var(--background-end-rgb))
    )
    rgb(var(--background-start-rgb)); /* カスタムプロパティを使用して背景グラデーションを設定 */
}</code></pre>



<p>このスタイルにより、<code>body</code> 要素のテキスト色と背景色が、ライトモードとダークモードで適切に切り替わります。</p>



<h2 class="wp-block-heading"><span id="toc5">まとめ</span></h2>



<pre class="wp-block-code"><code>/* Tailwind CSSの基本スタイルをインポートします */
@tailwind base;

/* Tailwind CSSのコンポーネントスタイルをインポートします */
@tailwind components;

/* Tailwind CSSのユーティリティクラスをインポートします */
@tailwind utilities;

/* ルート要素（:root）に対して、ライトモード時のカラースキームを定義します */
:root {
  --foreground-rgb: 0, 0, 0; /* テキストの色（黒） */
  --background-start-rgb: 214, 219, 220; /* 背景グラデーションの開始色（明るいグレー） */
  --background-end-rgb: 255, 255, 255; /* 背景グラデーションの終了色（白） */
}

/* ユーザーがダークモードを好む場合に適用されるカラースキームを定義します */
@media (prefers-color-scheme: dark) {
  :root {
    --foreground-rgb: 255, 255, 255; /* テキストの色（白） */
    --background-start-rgb: 0, 0, 0; /* 背景グラデーションの開始色（黒） */
    --background-end-rgb: 0, 0, 0; /* 背景グラデーションの終了色（黒） */
  }
}

/* body要素にスタイルを適用します */
body {
  color: rgb(var(--foreground-rgb)); /* テキストの色をカスタムプロパティから設定 */
  background: linear-gradient(
      to bottom,
      transparent,
      rgb(var(--background-end-rgb))
    )
    rgb(var(--background-start-rgb)); /* 背景に線形グラデーションを適用 */
}
</code></pre>



<p>このコードは、ユーザーのシステム設定に応じて自動的にテーマが切り替わるため、ユーザーエクスペリエンスを向上させることができます。</p>



<p>上記のコードを参考に、あなたのプロジェクトにも実装してみてください。</p>



<h2 class="wp-block-heading"><span id="toc6">おまけ</span></h2>



<p>Next.jsにおけるpage.tsxの初期コードをHello Worldだけ残すと、下記のような画面になると思います。</p>



<figure class="wp-block-image size-full"><img fetchpriority="high" decoding="async" width="780" height="589" src="https://aichi.blog/wp-content/uploads/2023/11/FireShot-Capture-001-Create-Next-App-localhost.png" alt="" class="wp-image-3347" srcset="https://aichi.blog/wp-content/uploads/2023/11/FireShot-Capture-001-Create-Next-App-localhost.png 780w, https://aichi.blog/wp-content/uploads/2023/11/FireShot-Capture-001-Create-Next-App-localhost-300x227.png 300w, https://aichi.blog/wp-content/uploads/2023/11/FireShot-Capture-001-Create-Next-App-localhost-768x580.png 768w" sizes="(max-width: 780px) 100vw, 780px" /></figure>



<p>このデフォルトスタイルをなくし、綺麗な真っ白の画面を表示するためのコードでは下記のようにするのがおすすめです。</p>



<pre class="wp-block-code"><code>@tailwind base;
@tailwind components;
@tailwind utilities;

:root {
  --foreground-rgb: 0, 0, 0;
  --background-start-rgb: 214, 219, 220;
  --background-end-rgb: 255, 255, 255;
}

@media (prefers-color-scheme: dark) {
  :root {
    --foreground-rgb: 255, 255, 255;
  }
}

body {
  color: rgb(var(--foreground-rgb));
}
</code></pre>



<p>開発の参考になれば幸いです。</p><p>The post <a href="https://aichi.blog/nextjs-globals-css-default-code-explanation/">Next.jsにおける、globals.cssのデフォルトコードを解説</a> first appeared on <a href="https://aichi.blog">AichiLog</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【React】Tailwind CSSで動的なスタイリングを設定できない！</title>
		<link>https://aichi.blog/react-tailwind-css-dynamic-styling-issue/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=react-tailwind-css-dynamic-styling-issue</link>
		
		<dc:creator><![CDATA[愛知郎]]></dc:creator>
		<pubDate>Mon, 20 Nov 2023 02:25:49 +0000</pubDate>
				<category><![CDATA[スタイル]]></category>
		<category><![CDATA[next.js]]></category>
		<category><![CDATA[React]]></category>
		<category><![CDATA[tailwind]]></category>
		<category><![CDATA[文法]]></category>
		<guid isPermaLink="false">https://aichi.blog/?p=3369</guid>

					<description><![CDATA[<p>目次 導入問題の概要具体例解決策関数を使用してスタイルを管理：コンポーネントの改善：なぜこの方法が効果的なのか別の解決方法CSSカスタムプロパティ（変数）の使用CSS-in-JSライブラリの利用クラス名のマッピングまとめ [&#8230;]</p>
<p>The post <a href="https://aichi.blog/react-tailwind-css-dynamic-styling-issue/">【React】Tailwind CSSで動的なスタイリングを設定できない！</a> first appeared on <a href="https://aichi.blog">AichiLog</a>.</p>]]></description>
										<content:encoded><![CDATA[<div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-6" checked><label class="toc-title" for="toc-checkbox-6">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">導入</a></li><li><a href="#toc2" tabindex="0">問題の概要</a><ol><li><a href="#toc3" tabindex="0">具体例</a></li></ol></li><li><a href="#toc4" tabindex="0">解決策</a><ol><li><a href="#toc5" tabindex="0">関数を使用してスタイルを管理：</a></li><li><a href="#toc6" tabindex="0">コンポーネントの改善：</a></li></ol></li><li><a href="#toc7" tabindex="0">なぜこの方法が効果的なのか</a></li><li><a href="#toc8" tabindex="0">別の解決方法</a><ol><li><a href="#toc9" tabindex="0">CSSカスタムプロパティ（変数）の使用</a></li><li><a href="#toc10" tabindex="0">CSS-in-JSライブラリの利用</a></li><li><a href="#toc11" tabindex="0">クラス名のマッピング</a></li></ol></li><li><a href="#toc12" tabindex="0">まとめ</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">導入</span></h2>



<p>Tailwind CSSはその柔軟性と効率性で人気を博していますが、動的なスタイルの適用には少し工夫が必要です。</p>



<p>特に、Reactと組み合わせて使用する場合、静的なクラス名の解析が挑戦となります。</p>



<p>今回は、Reactのコンポーネントに対して、Tailwind CSSを用いて動的にスタイルを適用する方法について具体例を交えて解説します。</p>



<h2 class="wp-block-heading"><span id="toc2">問題の概要</span></h2>



<p>Tailwind CSSはビルド時に使用されるクラスを静的に解析し、未使用のスタイルを削除します。</p>



<p>これは通常、パフォーマンスを向上させるために有効ですが、動的にクラス名を生成したい場合に問題となります。</p>



<p>たとえば、ユーザーの操作に応じて背景色を変更するボタンコンポーネントを作成する場合を考えてみましょう。</p>



<h3 class="wp-block-heading"><span id="toc3">具体例</span></h3>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="const DynamicButton: React.FC<{isActive: boolean}&gt; = ({ isActive }) =&gt; {
  const bgColorClass = isActive ? 'bg-green-500' : 'bg-red-500';

  return <button className={`p-2 text-white ${bgColorClass}`}&gt;Click Me</button&gt;;
};

" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">DynamicButton</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">React</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">FC</span><span style="color: #D4D4D4">&lt;{isActive: boolean}&gt; = ({ isActive }) =&gt; {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> bgColorClass = isActive ? </span><span style="color: #CE9178">&#39;bg-green-500&#39;</span><span style="color: #D4D4D4"> : </span><span style="color: #CE9178">&#39;bg-red-500&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> &lt;button className={`p-</span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4"> text-white ${bgColorClass}`}&gt;</span><span style="color: #4EC9B0">Click</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Me</span><span style="color: #D4D4D4">&lt;/button&gt;;</span></span>
<span class="line"><span style="color: #D4D4D4">};</span></span>
<span class="line"></span>
<span class="line"></span></code></pre></div>



<p>このコードでは、<code>isActive</code> プロパティに基づいて、ボタンの背景色を動的に変更しています。</p>



<p>しかし、この方法ではTailwind CSSのビルドプロセスでスタイルが削除される可能性があります。</p>



<h2 class="wp-block-heading"><span id="toc4">解決策</span></h2>



<p>この問題を解決するためには、以下のようなアプローチを取ります。</p>



<h3 class="wp-block-heading"><span id="toc5">関数を使用してスタイルを管理：</span></h3>



<p><code>getColorClass</code> という関数を作成し、カラーの名前に基づいて適切な Tailwind CSS のクラス名を返します。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="const getColorClass = (isActive: boolean) =&gt; {
  return isActive ? 'bg-green-500' : 'bg-red-500';
};
" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> getColorClass = (isActive: boolean) =&gt; {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> isActive ? </span><span style="color: #CE9178">&#39;bg-green-500&#39;</span><span style="color: #D4D4D4"> : </span><span style="color: #CE9178">&#39;bg-red-500&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">};</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading"><span id="toc6">コンポーネントの改善：</span></h3>



<p><code>DynamicButton</code> コンポーネントをこの関数を用いて改善します。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="const DynamicButton: React.FC<{isActive: boolean}&gt; = ({ isActive }) =&gt; {
  return <button className={`p-2 text-white ${getColorClass(isActive)}`}&gt;Click Me</button&gt;;
};
" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">DynamicButton</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">React</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">FC</span><span style="color: #D4D4D4">&lt;{isActive: boolean}&gt; = ({ isActive }) =&gt; {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> &lt;button className={`p-</span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4"> text-white ${</span><span style="color: #DCDCAA">getColorClass</span><span style="color: #D4D4D4">(isActive)}`}&gt;</span><span style="color: #4EC9B0">Click</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Me</span><span style="color: #D4D4D4">&lt;/button&gt;;</span></span>
<span class="line"><span style="color: #D4D4D4">};</span></span>
<span class="line"></span></code></pre></div>



<h2 class="wp-block-heading"><span id="toc7">なぜこの方法が効果的なのか</span></h2>



<p>この方法では、クラス名の生成が単一の関数内で行われるため、Tailwind CSSのビルドプロセス中にクラスが削除されることはありません。</p>



<p>また、このアプローチにより、スタイルのロジックをコンポーネントから分離し、再利用性を高めることができます。</p>



<h2 class="wp-block-heading"><span id="toc8">別の解決方法</span></h2>



<p>Tailwind CSSで動的なスタイリングを実現する別の解決方法を提案します。前述の方法は関数を使ってクラス名を決定するものでしたが、他にもいくつかの方法があります。</p>



<h3 class="wp-block-heading"><span id="toc9">CSSカスタムプロパティ（変数）の使用</span></h3>



<p>Tailwind CSSでは、CSSカスタムプロパティ（変数）を使用して動的なスタイリングを行うことができます。</p>



<p>この方法では、Reactコンポーネントのスタイル属性で直接変数を操作します。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="const DynamicButton: React.FC<{isActive: boolean}&gt; = ({ isActive }) =&gt; {
  const bgColor = isActive ? '#10B981' : '#EF4444'; // Tailwindのgreen-500とred-500

  return <button style={{ backgroundColor: bgColor }} className=&quot;p-2 text-white&quot;&gt;
    Click Me
  </button&gt;;
};

" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">DynamicButton</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">React</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">FC</span><span style="color: #D4D4D4">&lt;{isActive: boolean}&gt; = ({ isActive }) =&gt; {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> bgColor = isActive ? </span><span style="color: #CE9178">&#39;#10B981&#39;</span><span style="color: #D4D4D4"> : </span><span style="color: #CE9178">&#39;#EF4444&#39;</span><span style="color: #D4D4D4">; </span><span style="color: #6A9955">// Tailwindのgreen-500とred-500</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> &lt;button style={{ backgroundColor: bgColor }} className=</span><span style="color: #CE9178">&quot;p-2 text-white&quot;</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #4EC9B0">Click</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Me</span></span>
<span class="line"><span style="color: #D4D4D4">  &lt;/button&gt;;</span></span>
<span class="line"><span style="color: #D4D4D4">};</span></span>
<span class="line"></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading"><span id="toc10">CSS-in-JSライブラリの利用</span></h3>



<p>CSS-in-JSライブラリ（例：styled-components、emotionなど）を使用して、スタイルを動的に適用する方法もあります。</p>



<p>このアプローチでは、コンポーネントのスタイルをJavaScriptで直接定義できます。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="import styled from 'styled-components';

const StyledButton = styled.button`
  padding: 0.5rem;
  color: white;
  background-color: ${({ isActive }) =&gt; isActive ? '#10B981' : '#EF4444'};
`;

const DynamicButton: React.FC<{isActive: boolean}&gt; = ({ isActive }) =&gt; {
  return <StyledButton isActive={isActive}&gt;Click Me</StyledButton&gt;;
};

" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">import</span><span style="color: #D4D4D4"> styled from </span><span style="color: #CE9178">&#39;styled-components&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">StyledButton</span><span style="color: #D4D4D4"> = styled.button`</span></span>
<span class="line"><span style="color: #D4D4D4">  padding: </span><span style="color: #B5CEA8">0.</span><span style="color: #D4D4D4">5rem;</span></span>
<span class="line"><span style="color: #D4D4D4">  color: white;</span></span>
<span class="line"><span style="color: #D4D4D4">  background-color: ${({ isActive }) =&gt; isActive ? </span><span style="color: #CE9178">&#39;#10B981&#39;</span><span style="color: #D4D4D4"> : </span><span style="color: #CE9178">&#39;#EF4444&#39;</span><span style="color: #D4D4D4">};</span></span>
<span class="line"><span style="color: #D4D4D4">`;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">DynamicButton</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">React</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">FC</span><span style="color: #D4D4D4">&lt;{isActive: boolean}&gt; = ({ isActive }) =&gt; {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> &lt;</span><span style="color: #4EC9B0">StyledButton</span><span style="color: #D4D4D4"> isActive={isActive}&gt;</span><span style="color: #4EC9B0">Click</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Me</span><span style="color: #D4D4D4">&lt;/</span><span style="color: #4EC9B0">StyledButton</span><span style="color: #D4D4D4">&gt;;</span></span>
<span class="line"><span style="color: #D4D4D4">};</span></span>
<span class="line"></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading"><span id="toc11">クラス名のマッピング</span></h3>



<p>事前にクラス名のマッピングを定義して、そのマッピングを使用してクラス名を決定する方法もあります。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="const colorClasses = {
  active: 'bg-green-500',
  inactive: 'bg-red-500'
};

const DynamicButton: React.FC<{isActive: boolean}&gt; = ({ isActive }) =&gt; {
  const className = isActive ? colorClasses.active : colorClasses.inactive;

  return <button className={`p-2 text-white ${className}`}&gt;Click Me</button&gt;;
};

" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> colorClasses = {</span></span>
<span class="line"><span style="color: #D4D4D4">  active: </span><span style="color: #CE9178">&#39;bg-green-500&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">  inactive: </span><span style="color: #CE9178">&#39;bg-red-500&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">};</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">DynamicButton</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">React</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">FC</span><span style="color: #D4D4D4">&lt;{isActive: boolean}&gt; = ({ isActive }) =&gt; {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> className = isActive ? colorClasses.active : colorClasses.inactive;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> &lt;button className={`p-</span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4"> text-white ${className}`}&gt;</span><span style="color: #4EC9B0">Click</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Me</span><span style="color: #D4D4D4">&lt;/button&gt;;</span></span>
<span class="line"><span style="color: #D4D4D4">};</span></span>
<span class="line"></span>
<span class="line"></span></code></pre></div>



<h2 class="wp-block-heading"><span id="toc12">まとめ</span></h2>



<p>Tailwind CSSを使用した動的なスタイリングは、特にReactと組み合わせる場合には少し注意が必要です。</p>



<p>上記のような方法で、この問題を効果的に解決し、柔軟かつ効率的なコンポーネント設計を実現できます。</p><p>The post <a href="https://aichi.blog/react-tailwind-css-dynamic-styling-issue/">【React】Tailwind CSSで動的なスタイリングを設定できない！</a> first appeared on <a href="https://aichi.blog">AichiLog</a>.</p>]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
