بررسی تغییرات نسخه ۴ Tailwind CSS

Tailwind CSS یک فریم‌ورک utility-first است که به ما این امکان را می‌دهد تا بتوانیم وب‌سایت‌های مدرن را به سرعت و بدون ترک فایل HTML خود بسازیم. این فریم‌ورک از زمان انتشارش در سال ۲۰۱۹ تا به امروز، محبوبیت قابل توجهی را به دست آورده است.

امروزه اگر به دنبال «برترین فریمورک‌های CSS» باشیم، احتمالاً Tailwind CSS را در کنار نام‌های بزرگی مانند Bootstrap و Bulma خواهیم یافت.

در این مقاله، تغییرات نسخه ۴ از Tailwind CSS را بررسی می‌کنیم، سپس استراتژی‌های انتقال پروژه‌های موجود به این نسخه را توضیح می‌دهیم. همچنین، با ارائه مثال‌هایی، ویژگی‌های جدید آن را معرفی کرده و در نهایت، این نسخه را با سایر فریم‌ورک‌های CSS مقایسه می‌کنیم تا مزایا و محدودیت‌های آن را بهتر بشناسیم.

موتور عملکردی جدید

تیم Tailwind CSS در مارس ۲۰۲۴ از موتور عملکردی جدید خود با نام Tailwind Oxide رونمایی کرد. این موتور مزایای متعددی دارد، از جمله زنجیره ابزار یکپارچه و پیکربندی ساده‌تر برای سرعت بخشیدن به فرایند build.

پیکربندی CSS-first

در نسخه ۳ Tailwind CSS، فایل

tailwind.config.js
tailwind.config.js به ما این امکان را می‌دهد که توکن‌های طراحی پیش‌فرض را تغییر دهیم. این فایل در واقع مرکز شخصی‌سازی است که می‌توانیم در آن:

  • کلاس‌های utility سفارشی اضافه کنیم
  • تم‌های اختصاصی تعریف کنیم
  • پلاگین‌ها را غیرفعال کنیم
  • و …

یکی از مهم‌ترین وظایف این فایل، مشخص‌کردن منابع محتوایی پروژه است تا tailwind بتواند کلاس‌های مورد نیاز را اسکن و خروجی صحیح تولید کند.

در نسخه ۳ Tailwind CSS، هنگام راه‌اندازی یک پروژه جدید، کد پیش‌فرض

tailwind.config.js
tailwind.config.js به این شکل بود:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
/** @type {import('tailwindcss').Config} */
export default {
content: [
"./index.html",
"./src/**/*.{js,ts,jsx,tsx}",
],
theme: {
extend: {},
},
plugins: [],
}
/** @type {import('tailwindcss').Config} */ export default { content: [ "./index.html", "./src/**/*.{js,ts,jsx,tsx}", ], theme: { extend: {}, }, plugins: [], }
/** @type {import('tailwindcss').Config} */
export default {
  content: [
    "./index.html",
    "./src/**/*.{js,ts,jsx,tsx}",
  ],
  theme: {
    extend: {},
  },
  plugins: [],
}

Directiveهای حذف شده

بعد از پیکربندی فایل config، گام بعدی اضافه‌کردن دستورهای tailwind به فایل

index.css
index.css است.

در نسخه ۳ Tailwind CSS، این دستورها شامل موارد زیر بودند:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
@tailwind base;
@tailwind components;
@tailwind utilities;
@tailwind base; @tailwind components; @tailwind utilities;
@tailwind base;
@tailwind components;
@tailwind utilities;

اما در نسخه ۴ Tailwind CSS، دیگر نیازی به فایل

tailwind.config.js
tailwind.config.js و دستورهای
@tailwind
@tailwind نخواهیم داشت.

فقط کافی است

"tailwindcss"
"tailwindcss" را در فایل CSS اصلی خود import کنیم:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
@import "tailwindcss";
@import "tailwindcss";
@import "tailwindcss";

با انجام این کار، مراحل راه‌اندازی یک پروژه جدید کم‌تر شده و تعداد فایل‌های مورد نیاز نیز کاهش پیدا می‌کند.

با این حال، اگر یک پروژه قدیمی با نسخه ۳ داریم و همچنان به فایل JS برای پیکربندی نیاز داریم، می‌توانیم از دستور جدید

@config
@config در فایل CSS استفاده کنید تا تنظیمات قبلی را بارگذاری نماییم:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
@import "tailwindcss";
@config "../../tailwind.config.js";
@import "tailwindcss"; @config "../../tailwind.config.js";
@import "tailwindcss";

@config "../../tailwind.config.js";

البته، همه قابلیت‌های نسخه‌های قبلی در نسخه ۴ نهایی پشتیبانی نخواهند شد. برای مثال، ویژگی‌هایی مثل

corePlugins
corePlugins،
important
important و
separator
separator ممکن است حذف شوند. همچنین، برخی گزینه‌ها مانند
safelist
safelist نیز احتمالاً با تغییراتی در نحوه عملکردشان مجددا مورد استفاده قرار بگیرند.

Source Detection

اگر فایل‌هایی وجود دارند که نمی‌خواهیم آن‌ها را شامل شوند، می‌توانیم هنگام import کردن tailwind از تابع

source()
source() استفاده کنیم تا تشخیص خودکار را محدود نماییم:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
@import "tailwindcss" source("../src");
@import "tailwindcss" source("../src");
@import "tailwindcss" source("../src");

برای فایل‌هایی که tailwind به صورت پیش‌فرض آن‌ها را شناسایی نمی‌کند، مثل فایل‌های داخل

.gitignore
.gitignore، می‌توانیم از دستور
@source
@source استفاده کنیم:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
@import "tailwindcss";
@source "../node_modules/@my-company/ui-lib/src/components";
@import "tailwindcss"; @source "../node_modules/@my-company/ui-lib/src/components";
@import "tailwindcss";
@source "../node_modules/@my-company/ui-lib/src/components";

همچنین، اگر بخواهیم تشخیص منبع را کاملاً غیرفعال کنیم، می‌توانیم این کار را انجام دهیم:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
@import "tailwindcss" source(none);
@import "tailwindcss" source(none);
@import "tailwindcss" source(none);

غیرفعال کردن Preflight

اگر نمی‌خواهیم استایل‌های پیش‌فرض Tailwind را استفاده کنیم، می‌توانیم لایه‌های مورد نیاز را مستقیماً import کرده و بقیه را حذف نماییم:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
@layer theme, base, components, utilities;
@import "tailwindcss/theme" layer(theme);
@import "tailwindcss/utilities" layer(utilities);
@layer theme, base, components, utilities; @import "tailwindcss/theme" layer(theme); @import "tailwindcss/utilities" layer(utilities);
@layer theme, base, components, utilities;
@import "tailwindcss/theme" layer(theme);
@import "tailwindcss/utilities" layer(utilities);

این کار به ما کمک می‌کند تا فقط استایل‌های ضروری را در پروژه خود داشته باشیم.

شخصی‌سازی تم‌ها

رویکرد جدید CSS-first در نسخه ۴ Tailwind CSS، شخصی‌سازی استایل‌ها را بسیار ساده‌تر کرده است. در این نسخه، تمام سفارشی‌سازی‌ها را به جای این که در فایل پیکربندی جاوااسکریپت انجام دهیم، مستقیماً در فایل اصلی CSS اعمال می‌کنیم.

در نسخه ۳، اگر بخواهیم رنگ‌های جدید را به یک تم سفارشی اضافه کنیم، باید آن‌ها را در بخش

theme
theme فایل
tailwind.config.js
tailwind.config.js تعریف نماییم:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
/** @type {import('tailwindcss').Config} */
export default {
content: [
"./index.html",
"./src/**/*.{js,ts,jsx,tsx}",
],
theme: {
extend: {
colors: {
background:'#764abc',
lilac: '#eabad2',
light: '#eae3f5'
}
},
},
plugins: [],
}
/** @type {import('tailwindcss').Config} */ export default { content: [ "./index.html", "./src/**/*.{js,ts,jsx,tsx}", ], theme: { extend: { colors: { background:'#764abc', lilac: '#eabad2', light: '#eae3f5' } }, }, plugins: [], }
/** @type {import('tailwindcss').Config} */
export default {
  content: [
    "./index.html",
    "./src/**/*.{js,ts,jsx,tsx}",
  ],
  theme: {
    extend: {
      colors: {
        background:'#764abc',
        lilac: '#eabad2',
        light: '#eae3f5'
      }
    },
  },
  plugins: [],
}

و سپس این کلاس‌های utility را در HTML استفاده کنیم:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<div className="bg-background">
<header className="flex justify-between py-4 px-8">
<a href="/" className="text-light">LogRocket - Oscar</a>
<ul className="text-lilac">
<li><a href="#">Home</a></li>
<li><a href="#">About</a></li>
<li><a href="#">Contact</a></li>
</ul>
</header>
<div className="bg-background"> <header className="flex justify-between py-4 px-8"> <a href="/" className="text-light">LogRocket - Oscar</a> <ul className="text-lilac"> <li><a href="#">Home</a></li> <li><a href="#">About</a></li> <li><a href="#">Contact</a></li> </ul> </header>
<div className="bg-background">
    <header className="flex justify-between py-4 px-8">
      <a href="/" className="text-light">LogRocket - Oscar</a>

      <ul className="text-lilac">
        <li><a href="#">Home</a></li>
        <li><a href="#">About</a></li>
        <li><a href="#">Contact</a></li>
      </ul>
    </header>

در این مثال، کلاس‌های

bg-background
bg-background،
text-light
text-light و
text-lilac
text-lilac به المنت‌های HTML اضافه شده‌اند.

در نسخه ۴، تمام شخصی‌سازی‌ها را با دستور

@theme
@theme در CSS انجام می‌دهیم:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
@import "tailwindcss";
@theme {
--color-background-100: #764abc;
--color-lilac-100: #eabad2;
--color-light-100: #eae3f5;
}
@import "tailwindcss"; @theme { --color-background-100: #764abc; --color-lilac-100: #eabad2; --color-light-100: #eae3f5; }
@import "tailwindcss";

@theme {
  --color-background-100: #764abc;
  --color-lilac-100: #eabad2;
  --color-light-100: #eae3f5;
}

و سپس مانند همیشه، این کلاس‌ها را در HTML مورد استفاده قرار می‌دهیم:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<div className="bg-background-100">
<header className="flex justify-between py-4 px-8">
<a href="/" className="text-light-100">LogRocket - Oscar</a>
<ul className="text-lilac-100">
<li><a href="#">Home</a></li>
<li><a href="#">About</a></li>
<li><a href="#">Contact</a></li>
</ul>
</header>
<div className="bg-background-100"> <header className="flex justify-between py-4 px-8"> <a href="/" className="text-light-100">LogRocket - Oscar</a> <ul className="text-lilac-100"> <li><a href="#">Home</a></li> <li><a href="#">About</a></li> <li><a href="#">Contact</a></li> </ul> </header>
<div className="bg-background-100">
    <header className="flex justify-between py-4 px-8">
      <a href="/" className="text-light-100">LogRocket - Oscar</a>

      <ul className="text-lilac-100">
        <li><a href="#">Home</a></li>
        <li><a href="#">About</a></li>
        <li><a href="#">Contact</a></li>
      </ul>
    </header>

نکته‌ای که باید به آن توجه داشته باشیم این است که اگر از VS Code استفاده می‌کنیم، ممکن است دستور

@import
@import به عنوان خطا نمایش داده شود، اما جای نگرانی وجود ندارد، و همه چیز به درستی کار خواهد کرد.

همچنین، مثال‌های بالا در React و Tailwind CSS ایجاد شده‌اند، به همین دلیل به‌جای

class
class از
className
className در آن‌ها استفاده کرده‌ایم. اما فارغ از فریم‌ورک، کلاس‌های utility همیشه یکسان خواهند بود.

متغیرهای تم در نسخه ۴ Tailwind CSS

همان‌طور که در مثال قبلی دیدیم، در نسخه ۴، متغیرهای CSS تمام استایل‌های مربوط به تم را کنترل می‌کنند:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
@theme {
--font-display: "Poppins", "sans-serif";
--ease-fluid: cubic-bezier(0.3,0,0,1);
--color-background-100: #764abc;
}
@theme { --font-display: "Poppins", "sans-serif"; --ease-fluid: cubic-bezier(0.3,0,0,1); --color-background-100: #764abc; }
@theme {
  --font-display: "Poppins", "sans-serif";

  --ease-fluid: cubic-bezier(0.3,0,0,1);

  --color-background-100: #764abc;
}

در نسخه جدید، می‌توانیم یک namespace خاص از تم را بازنویسی کنیم، مانند رنگ‌ها، فونت‌ها، متن و غیره؛ یا حتی کل تم Tailwind را سفارشی‌سازی نماییم. این کار به راحتی در فایل اصلی CSS انجام می‌شود.

اگر بخواهیم کل تم پیش‌فرض را بازنویسی کنیم، می‌توانیم از

--*: initial
--*: initial استفاده نماییم. مثلاً برای بازنویسی فونت پیش‌فرض و تعریف فونت سفارشی خودمان می‌توانیم به روش زیر پیش برویم:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
@import "tailwindcss";
@theme {
--font-*: initial
--font-display: "Poppins", "sans-serif";
}
@import "tailwindcss"; @theme { --font-*: initial --font-display: "Poppins", "sans-serif"; }
@import "tailwindcss";

@theme {
  --font-*: initial
  --font-display: "Poppins", "sans-serif";
}

در این حالت،

font-display
font-display تنها
font-family
font-family خواهد بود که در پروژه در دسترس است.

همچنین می‌توانیم برای هر ویژگی یک مقدار پیش‌فرض با استفاده از double-dashها تعیین کنیم. مثلاً برای تنظیم فونت و استایل متن در Tailwind CSS، می‌توانیم کد زیر را داشته باشیم:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
@import "tailwindcss";
@import url('https://fonts.googleapis.com/css2?family=Poppins:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap');
@theme {
--font-display : "Poppins", sans-serif;
--font-logo: "Roboto", sans-serif;
--text-logo: 1.5rem;
--text-logo--font-weight: 700;
--text-big: 6rem;
--text-big--font-weight: 700;
--text-big--letter-spacing: -0.025em;
--color-background-100: #764abc;
--color-lilac-100: #eabad2;
--color-light-100: #eae3f5;
}
@import "tailwindcss"; @import url('https://fonts.googleapis.com/css2?family=Poppins:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap'); @theme { --font-display : "Poppins", sans-serif; --font-logo: "Roboto", sans-serif; --text-logo: 1.5rem; --text-logo--font-weight: 700; --text-big: 6rem; --text-big--font-weight: 700; --text-big--letter-spacing: -0.025em; --color-background-100: #764abc; --color-lilac-100: #eabad2; --color-light-100: #eae3f5; }
@import "tailwindcss";
@import url('https://fonts.googleapis.com/css2?family=Poppins:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap');

@theme {  
  --font-display : "Poppins", sans-serif;  
  --font-logo: "Roboto", sans-serif;

  --text-logo: 1.5rem;
  --text-logo--font-weight: 700;

  --text-big: 6rem;
  --text-big--font-weight: 700;
  --text-big--letter-spacing: -0.025em;

  --color-background-100: #764abc;
  --color-lilac-100: #eabad2;
  --color-light-100: #eae3f5;
}

در این مثال، دو فونت مختلف را تعریف کرده‌ایم:

  • --font-display
    --font-display برای متن‌های معمولی
  • --font-logo
    --font-logo برای لوگو

همچنین چندین کلاس جدید برای size و weight متن نیز اضافه کرده‌ایم.

بنابراین، وقتی کلاس utility مانند

text-logo
text-logo را در HTML خود اضافه کنیم، آن المنت به طور پیش‌فرض دارای
font-size
font-size برابر با
۱٫۵rem
۱٫۵rem و
font-weight
font-weight برابر با
۷۰۰
۷۰۰ خواهد بود. به طور مشابه، هر المنت با نام کلاس
text-big
text-big، به طور پیش‌فرض دارای
font-size
font-size برابر با
۶rem
۶rem، و
font-weight
font-weight برابر با
۷۰۰
۷۰۰ و
letter-spacing
letter-spacing برابر با
-۰٫۰۲۵em
-۰٫۰۲۵em خواهد بود.

اکنون می‌توانیم از این کلاس‌ها در کد HTML خود استفاده کنیم:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<div className="bg-background-100 h-screen">
<header className="flex justify-between py-4 px-8">
<a href="/" className="font-logo text-logo text-light-100">LogRocket - Oscar</a>
<ul className="hidden md:flex flex items-center align-middle gap-4 font-display text-lilac-100">
<li>
<a href="#" className="py-2 px-4 rounded-md">Home</a>
</li>
<li><a href="#" className="">About</a></li>
<li><a href="#" className="">Contact</a></li>
</ul>
</header>
<div className="container px-32 py-32 font-display">
<div className="flex">
<div>
<h1 className="text-lilac-100 text-big">Tailwind CSS</h1>
<br />
<h3 className="text-3xl text-light-100">
Build websites with utility classes from the comfort of your HTML
</h3>
<br />
<p className="text-2xl text-light">
Lorem ipsum dolor sit amet consectetur adipisicing elit. Fu gi at veniet atque unde laudantium. Ipsa nam quisquam quod non fficiis porro? Lorem ipsum dolor, sit amet consectetur adipisicing elit. Eos iure nemo a hic sunt incidunt?
</p>
</div>
</div>
</div>
</div>
<div className="bg-background-100 h-screen"> <header className="flex justify-between py-4 px-8"> <a href="/" className="font-logo text-logo text-light-100">LogRocket - Oscar</a> <ul className="hidden md:flex flex items-center align-middle gap-4 font-display text-lilac-100"> <li> <a href="#" className="py-2 px-4 rounded-md">Home</a> </li> <li><a href="#" className="">About</a></li> <li><a href="#" className="">Contact</a></li> </ul> </header> <div className="container px-32 py-32 font-display"> <div className="flex"> <div> <h1 className="text-lilac-100 text-big">Tailwind CSS</h1> <br /> <h3 className="text-3xl text-light-100"> Build websites with utility classes from the comfort of your HTML </h3> <br /> <p className="text-2xl text-light"> Lorem ipsum dolor sit amet consectetur adipisicing elit. Fu gi at veniet atque unde laudantium. Ipsa nam quisquam quod non fficiis porro? Lorem ipsum dolor, sit amet consectetur adipisicing elit. Eos iure nemo a hic sunt incidunt? </p> </div> </div> </div> </div>
<div className="bg-background-100  h-screen">
    <header className="flex justify-between py-4 px-8">
      <a href="/" className="font-logo text-logo text-light-100">LogRocket - Oscar</a>

      <ul className="hidden md:flex flex items-center align-middle gap-4 font-display text-lilac-100">
        <li>
          <a href="#" className="py-2 px-4 rounded-md">Home</a>
        </li>
        <li><a href="#" className="">About</a></li>
        <li><a href="#" className="">Contact</a></li>
      </ul>
    </header>
    <div className="container px-32 py-32 font-display">
      <div className="flex">
        <div>
          <h1 className="text-lilac-100 text-big">Tailwind CSS</h1>
          <br />
          <h3 className="text-3xl text-light-100">
            Build websites with utility classes from the comfort of your             HTML
          </h3>
          <br />
          <p className="text-2xl text-light">
              Lorem ipsum dolor sit amet consectetur adipisicing elit. Fu               gi at veniet atque unde laudantium. Ipsa nam quisquam quod               non fficiis porro? Lorem ipsum dolor, sit amet consectetur               adipisicing elit. Eos iure nemo a hic sunt incidunt?
          </p>
        </div>
      </div>
    </div>
  </div>

در نسخه ۴ Tailwind CSS، وابستگی به مقادیر پیش‌فرض کاهش یافته و می‌توانیم چندین کلاس را با یک کلاس سفارشی جایگزین نماییم. برای مثال، در اینجا کلاس

text-big
text-big جایگزین
text-5xl
text-5xl و
text-bold
text-bold برای کلاس‌های مربوط به هدر
h1
h1 شده است.

همچنین می‌توانیم این روش را برای تمام utilityهای دیگر در Tailwind نیز به کار ببریم.

پیکربندی ساده‌تر تم

برخی از utilityها، دیگر وابسته به تنظیمات تم در نسخه ۴ Tailwind CSS نیستند. حال می‌توانیم مستقیماً در فایل HTML خود، بدون پیکربندی اضافی، مقدار دلخواهمان را مشخص کنیم.

در نسخه ۳ Tailwind CSS، برای تعیین تعداد ستون‌ها باید مقدار آن را در فایل

tailwind.config.js
tailwind.config.js تعریف می‌کردیم، اما در نسخه ۴ می‌توانیم از هر عددی بین
grid-cols-5
grid-cols-5 تا
grid-cols-73
grid-cols-73 استفاده کنیم. این موضوع برای utilityهای z-index (مانند
z-40
z-40) و  
opacity-*
opacity-*  نیز صدق می‌کند.

نسخه ۴ Tailwind CSS همچنین از variantها مثل

data-*
data-* به صورت پیش‌فرض پشتیبانی می‌کند و نیازی به arbitrary valueها نخواهیم داشت.

مزیت اصلی این تغییرات این است که توسعه‌دهندگان زمان کم‌تری را برای پیکربندی توکن‌های طراحی غیرضروری یا غیراصلی صرف می‌کنند.

مقیاس فاصله‌گذاری داینامیک

Utilityهای فاصله‌گذاری مثل

m-*
m-*,
w-*
w-*,
mt-*
mt-*,
px-*
px-* و غیره، در نسخه ۴ Tailwind CSS به صورت داینامیک و بر اساس مقدار پایه
۰٫۲۵rem
۰٫۲۵rem که در تم پیش‌فرض تعریف شده است، ایجاد می‌شوند.

هر مقدار در این مقیاس، ضریبی از مقدار پایه خواهد بود. به‌عنوان مثال:

  • mt-1
    mt-1 برابر با
    ۰٫۲۵rem
    ۰٫۲۵rem است.
  • mt-2
    mt-2 برابر با
    ۰٫۵rem
    ۰٫۵rem (
    ۰٫۲۵rem
    ۰٫۲۵rem*
    2
    2) است.
  • mt-21
    mt-21 برابر با
    ۵٫۲۵rem
    ۵٫۲۵rem خواهد بود.

قابلیت جدیدی که در نسخه ۴ اضافه شده است این است که می‌توانیم از مقادیر فاصله‌گذاری که به طور صریح تعریف نشده‌اند، استفاده کنیم. در نسخه ۳ Tailwind CSS، مجبور بودیم مقادیری مانند

mt-[5.25rem]
mt-[5.25rem] را به صورت arbitrary value بنویسیم یا یک تم سفارشی ایجاد کنیم. اما در نسخه ۴، دیگر نیازی به این کار نیست و می‌توانیم طراحی‌های منسجم‌تری ایجاد نماییم.

محدود کردن مقادیر فاصله‌گذاری

اگر بخواهیم مقادیر پیش‌فرض فاصله‌گذاری را غیرفعال کرده و مقیاس سفارشی خودمان را تعریف کنیم، می‌توانیم به این صورت عمل کنیم:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
@theme {
--spacing: initial
--spacing-1: 0.25rem
--spacing-2: 0.5rem
--spacing-4: 1rem
--spacing-8: 2rem
--spacing-12: 3rem
}
@theme { --spacing: initial --spacing-1: 0.25rem --spacing-2: 0.5rem --spacing-4: 1rem --spacing-8: 2rem --spacing-12: 3rem }
@theme {
  --spacing: initial
  --spacing-1: 0.25rem
  --spacing-2: 0.5rem
  --spacing-4: 1rem
  --spacing-8: 2rem
  --spacing-12: 3rem
}

با این تنظیمات، تمامی utilityهای فاصله‌گذاری در Tailwind CSS فقط از مقادیر مشخص شده استفاده خواهند کرد.

پالت رنگ جدید

نسخه ۴ Tailwind CSS به جای استفاده از پالت رنگ

rgb
rgb، از
oklch
oklch
استفاده می‌کند. این تغییر باعث می‌شود تا رنگ‌ها زنده‌تر و پویا‌تر باشند و دیگر محدودیت‌های
rgb
rgb را نداشته باشیم.

پشتیبانی از Container Queryها

نسخه ۴ Tailwind CSS، از Container Queryها به صورت پیش‌فرض پشتیبانی می‌کند و دیگر نیازی به استفاده از پلاگین

@tailwindcss/container-queries
@tailwindcss/container-queries برای ایجاد Containerهای ریسپانسیو نداریم.

Container Query چیست؟
این ویژگی به ما این امکان را می‌دهد که استایل یک المان را بر اساس اندازه parent آن تنظیم کنیم، نه کل viewport. به این ترتیب، چیدمان سایت ما بر اساس اندازه هر کامپوننت تطبیق پیدا می‌کند.

برای ایجاد Container Queryها در نسخه ۴ Tailwind CSS، کافی است کلاس

@container
@container را به المنت parent اضافه کنیم. سپس برای المنت‌های child، می‌توانیم ازutilityهای ریسپانسیو مانند
@sm
@sm و
@lg
@lg استفاده کنیم تا استایل‌ها را بر اساس اندازه parent تنظیم نماییم:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<div className="@container">
<header className="flex justify-between @sm:grid-cols-2 @lg:grid-cols-4">
<!-- child content -->
</header>
</div>
<div className="@container"> <header className="flex justify-between @sm:grid-cols-2 @lg:grid-cols-4"> <!-- child content --> </header> </div>
<div className="@container">
   <header className="flex justify-between @sm:grid-cols-2 @lg:grid-cols-4">
     <!-- child content -->
   </header>
</div>

در نسخه ۴ Tailwind CSS، یک variant جدید به نام

@max-*
@max-* اضافه شده که به ما اجازه می‌دهد استایل‌ها را، زمانی که عرض container کم‌تر از مقدار مشخصی شد، تغییر دهیم. می‌توانیم
@min-*
@min-* و
@max-*
@max-* را ترکیب کنیم تا یک بازه خاص را تعریف نماییم:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<div className="@container">
<div className="flex @min-md:@max-xl:hidden">
<!-- child content -->
</div>
</div>
<div className="@container"> <div className="flex @min-md:@max-xl:hidden"> <!-- child content --> </div> </div>
<div className="@container">
   <div className="flex @min-md:@max-xl:hidden">
     <!-- child content -->
   </div>
</div>

در این کد،

div
div داخلی زمانی مخفی خواهد شد که عرض container بین
md
md و
xl
xl (یعنی بین
۷۶۸px
۷۶۸px و
۱۲۸۰px
۱۲۸۰px) باشد.

موارد استفاده از Container Queryها:

  • طراحی navigation
  • Sidebarها
  • Cardها
  • گالری‌های تصاویر
  • متن‌های ریسپانسیو

این قابلیت انعطاف‌پذیری بیشتری ایجاد می‌کند و با اکثر مرورگرها سازگار است، بنابراین می‌توانیم از همین حالا در پروژه‌های نسخه ۴ Tailwind CSS خود از آن استفاده کنیم.

ارتقا از نسخه ۳ به ۴  Tailwind CSS

اگر قصد داریم پروژه‌ای که از نسخه ۳ استفاده می‌کند را به نسخه ۴ ارتقا دهیم، Tailwind CSS یک ابزار مخصوص برای این کار ارائه کرده است که بیشتر مراحل را به صورت خودکار انجام می‌دهد.

برای ارتقای پروژه، دستور زیر را اجرا می‌کنیم:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
npx @tailwindcss/upgrade@next
npx @tailwindcss/upgrade@next
npx @tailwindcss/upgrade@next

این ابزار وظایفی مانند به‌روزرسانی وابستگی‌ها، انتقال فایل پیکربندی جاوااسکریپت به CSS و مدیریت تغییرات در فایل‌های قالب را به طور خودکار انجام می‌دهد.

مراحل پیشنهادی قبل از ارتقا:

  • بهتراست ابتدا یک branch جدید برای ارتقا ایجاد کنیم تا تغییرات روی branch اصلی اعمال نشوند.
  • پس از اجرای ابزار ارتقا، از
    git diff
    git diff برای بررسی تغییرات استفاده کنیم.
  • پروژه را در مرورگر تست کنیم تا مطمئن شویم همه چیز به درستی کار می‌کند.

ممکن است در پروژه‌های پیچیده نیاز به انجام تغییرات دستی داشته باشیم. Tailwind CSS فهرستی از تغییرات کلیدی و نحوه سازگاری با آن‌ها را ارائه کرده است که آن‌ها در ادامه بررسی می‌کنیم.

تغییرات در وابستگی‌ها

افزونه  PostCSS:
در نسخه ۴، افزونه PostCSS اکنون در قالب یک پکیج اختصاصی با نام

@tailwindcss/postcss
@tailwindcss/postcss ارائه شده است. می‌توانیم
postcss-import
postcss-import و
auto-prefixer
auto-prefixer را از فایل
postcss.config.mjs
postcss.config.mjs پروژه خود حذف نماییم:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
export default {
plugins: {
'@tailwindcss/postcss': {},
},
};
export default { plugins: { '@tailwindcss/postcss': {}, }, };
export default {
  plugins: {
    '@tailwindcss/postcss': {},
  },
};

اگر قصد داریم پروژه جدیدی راه‌اندازی کنیم، می‌توانیم Tailwind را همراه با افزونه PostCSS به صورت زیر نصب نماییم:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
npm install tailwindcss@next @tailwindcss/postcss@next
npm install tailwindcss@next @tailwindcss/postcss@next
npm install tailwindcss@next @tailwindcss/postcss@next

افزونه Vite:
در نسخه ۴ Tailwind CSS، یک افزونه اختصاصی برای Vite ارائه شده است که توصیه می‌شود از آن به جای افزونه PostCSS استفاده کنیم:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
import { defineConfig } from 'vite';
import tailwindcss from '@tailwindcss/vite';
export default defineConfig({
plugins: [
tailwindcss()
],
});
import { defineConfig } from 'vite'; import tailwindcss from '@tailwindcss/vite'; export default defineConfig({ plugins: [ tailwindcss() ], });
import { defineConfig } from 'vite';
import tailwindcss from '@tailwindcss/vite';

export default defineConfig({
  plugins: [
    tailwindcss()
  ],
});

برای نصب Tailwind همراه با این افزونه در پروژه جدید، می‌توانیم از دستور زیر استفاده کنیم:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
npm install tailwindcss@next @tailwindcss/vite@next
npm install tailwindcss@next @tailwindcss/vite@next
npm install tailwindcss@next @tailwindcss/vite@next

Tailwind CLI:

ابزار CLI اکنون در یک پکیج اختصاصی با نام

@tailwind/cli
@tailwind/cli ارائه شده است. بنابراین، باید دستورات build را مطابق زیر تغییر دهیم:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
npx @tailwindcss/cli -i input.css -o output.css
npx @tailwindcss/cli -i input.css -o output.css
npx @tailwindcss/cli -i input.css -o output.css

utilityهای منسوخ شده

برخی از کلاس‌های قدیمی در نسخه ۴ دیگر پشتیبانی نمی‌شوند و باید از جایگزین‌های جدید آن‌ها استفاده کنیم، که عبارتند از:

  • bg-opacity-*
    bg-opacity-*: به جای آن باید از اصلاح‌کننده‌های شفافیت مانند
    bg-black/50
    bg-black/50 استفاده کنیم.
  • text-opacity-*
    text-opacity-*: به جای آن باید از
    text-black/50
    text-black/50 استفاده کنیم.
  • border-opacity-*
    border-opacity-*: به جای آن باید از
    border-black/50
    border-black/50 استفاده کنیم.
  • divide-opacity-*
    divide-opacity-*: به جای آن باید از
    divide-black/50
    divide-black/50 استفاده کنیم.
  • ring-opacity-*
    ring-opacity-*: به جای آن باید از
    ring-black/50
    ring-black/50 استفاده کنیم.
  • placeholder-opacity-*
    placeholder-opacity-*: به جای آن باید از
    placeholder-black/50
    placeholder-black/50 استفاده کنیم.
  • flex-shrink-*
    flex-shrink-*: اکنون باید از
    shrink-*
    shrink-* استفاده کنیم.
  • flex-grow-*
    flex-grow-*: جایگزین آن
    grow-*
    grow-* است.
  • overflow-ellipsis
    overflow-ellipsis: اکنون باید از
    text-ellipsis
    text-ellipsis استفاده کنیم.
  • decoration-slice
    decoration-slice: به جای آن باید از
    box-decoration-slice
    box-decoration-slice استفاده کنیم.
  • decoration-clone
    decoration-clone: جایگزین آن
    box-decoration-clone
    box-decoration-clone است.

تغییرات در نسخه ۴  Tailwind CSS

پیکربندی utility container

در نسخه ۴، utility

container
container باید با
@utility
@utility پیکربندی شود:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
@import "tailwindcss";
@utility container {
margin-inline: auto;
padding-inline: 2rem;
}
@import "tailwindcss"; @utility container { margin-inline: auto; padding-inline: 2rem; }
@import "tailwindcss";

@utility container {
  margin-inline: auto;
  padding-inline: 2rem;
}

گزینه‌های پیکربندی مانند

center
center و
padding
padding دیگر در نسخه ۴ وجود ندارند.

تغییرات مقیاس پیش‌فرض

در این نسخه، مقادیر پیش‌فرض برای utilityهای

shadow
shadow،
blur
blur و
border-radius
border-radius تنظیم شده‌اند تا نام‌گذاری واضح‌تری داشته باشند. بنابراین، باید هر یک از این برای utilityها را در پروژه خود جایگزین کنیم تا ظاهر پروژه تغییر نکند.

تغییر رنگ پیش‌فرض border

در نسخه ۳ Tailwind CSS، رنگ پیش‌فرض border مقدار

gray-200
gray-200 بود و نیازی به تنظیم دستی آن نداشتیم:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<header className="flex justify-between border-b-2 py-4 px-8">
<--! content -->
</header>
<header className="flex justify-between border-b-2 py-4 px-8"> <--! content --> </header>
<header className="flex justify-between border-b-2 py-4 px-8">
      <--! content --> 
  </header>

اما در نسخه ۴، رنگ border مقدار

currentColor
currentColor را دریافت می‌کند و در صورت مشخص نکردن رنگ، ممکن است تغییرات ظاهری ایجاد شود.

اگر می‌خواهیم رفتار نسخه ۳ را حفظ نماییم، باید این کد را به پروژه خود اضافه کنیم:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
the v3 behavior:
@import "tailwindcss";
@layer base {
*,
::after,
::before,
::backdrop,
::file-selector-button {
border-color: var(--color-gray-200, currentColor);
}
}
the v3 behavior: @import "tailwindcss"; @layer base { *, ::after, ::before, ::backdrop, ::file-selector-button { border-color: var(--color-gray-200, currentColor); } }
the v3 behavior:
@import "tailwindcss";

@layer base {
  *,
  ::after,
  ::before,
  ::backdrop,
  ::file-selector-button {
    border-color: var(--color-gray-200, currentColor);
  }
}

تغییر ring پیش‌فرض

در نسخه ۳، utility

ring
ring مقدار
۳px
۳px داشت، اما در نسخه ۴ مقدار آن به
۱px
۱px کاهش یافته است. برای حفظ ظاهر پروژه، باید
ring-3
ring-3 را جایگزین
ring
ring کنیم.

تغییر placeholder پیش‌فرض

در نسخه ۴ Tailwind CSS، متن placeholder به طور پیش‌فرض رنگ متن جاری را با ۵۰٪ شفافیت دریافت می‌کند. در نسخه ۳، این مقدار

gray-400
gray-400 بود. برای حفظ این رفتار، می‌توانیم این کد را به CSS پروژه خود اضافه کنیم:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
@layer base {
input::placeholder,
textarea::placeholder {
color: theme(--color-gray-400);
}
}
@layer base { input::placeholder, textarea::placeholder { color: theme(--color-gray-400); } }
@layer base {
  input::placeholder,
  textarea::placeholder {
    color: theme(--color-gray-400);
  }
}

تغییرات outline

در نسخه ۴، utility

outline-none
outline-none دیگر یک outline شفاف با ضخامت
۲px
۲px اضافه نمی‌کند، در حالی که در نسخه ۳ این کار را انجام می‌داد. به جای آن، utility جدید
outline-hidden
outline-hidden معرفی شده است که مانند
outline-none
outline-none در نسخه ۳ عمل می‌کند.

برای حفظ ظاهر پروژه هنگام به‌روزرسانی، باید

outline-none
outline-none را با
outline-hidden
outline-hidden جایگزین کنیم، مگر اینکه بخواهیم outline را کاملاً حذف نماییم.

اضافه کردن utility های سفارشی

در نسخه ۴، utilityهای سفارشی دیگر با utility

@layer
@layer تعریف نمی‌شوند و باید از
@utility
@utility API استفاده کنیم که سازگاری بیشتری با cascade layers دارد:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
@utility tab-4 {
tab-size: 4;
}
@utility tab-4 { tab-size: 4; }
@utility tab-4 {
  tab-size: 4;
}

ترتیب اولویت در variants

در نسخه ۴، variantهایی مانند

first
first و
last
last به ترتیب از چپ به راست قرار می‌گیرند. بنابراین، هنگام به‌روزرسانی پروژه، باید ترتیب variantها را در کد خود تنظیم کنیم.

تغییر در مقداردهی متغیرهای CSS

در این نسخه، برای مقداردهی متغیرهای CSS در مقدارهای دلخواه، از

()
() به جای
[]
[] استفاده می‌شود. برای مثال:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<div class="bg-(--brand-color)">
<!-- ... -->
</div>
<div class="bg-(--brand-color)"> <!-- ... --> </div>
<div class="bg-(--brand-color)">
  <!-- ... -->
</div>

ما باید این مورد را نیز در پروژه خود به‌روزرسانی نماییم.

تغییرات hover در موبایل

در نسخه ۴ Tailwind CSS، استایل‌های hover فقط در دستگاه‌هایی که از تعامل hover پشتیبانی می‌کنند، اعمال می‌شود. برای حفظ سازگاری، می‌توانیم

hover
hover را به صورت دستی در فایل CSS تعریف کنیم:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
@import "tailwindcss";
@variant hover (&:hover);
@import "tailwindcss"; @variant hover (&:hover);
@import "tailwindcss";

@variant hover (&:hover);

استفاده از تابع
theme()
theme()

در نسخه ۴، Tailwind CSS برای همه مقادیر theme متغیرهای CSS تولید می‌کند، بنابراین دیگر نیازی به استفاده از

theme()
theme() نیست. توصیه می‌شود در پروژه خود،
theme()
theme() را با متغیرهای CSS جایگزین نماییم:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
@import "tailwindcss";
.my-class {
background-color: var(--color-red-500);
}
@import "tailwindcss"; .my-class { background-color: var(--color-red-500); }
@import "tailwindcss";

.my-class {
  background-color: var(--color-red-500);
}

جایگزین‌های Tailwind CSS

یکی از جایگزین‌های محبوب Tailwind CSS، فریم‌ورک Bootstrap است که مجموعه‌ای گسترده از کامپوننت‌های آماده را ارائه می‌دهد.

  • Bootstrap برای مبتدیان مناسب‌تر است، زیرا دارای کلاس‌های ساده و از پیش تعریف شده می‌باشد.
  • Bootstrap برخلاف Tailwind CSS، به طور پیش‌فرض شامل جاوااسکریپت است و به ما این امکان را می‌دهد تا قابلیت‌های سمت سرور را نیز اضافه کنیم.
  • Tailwind CSS انعطاف‌پذیری بیشتری دارد و طراحی‌های منحصربه‌فردتری ایجاد می‌کند، در حالی که بسیاری از سایت‌های ساخته‌شده با Bootstrap ظاهر مشابهی دارند.

معایب Tailwind CSS

با وجود محبوبیت زیاد، اما Tailwind CSS همچنان دارای محدودیت‌هایی نیز می‌باشد:

  • یادگیری دشوار: رویکرد utility-first و تعداد زیاد کلاس‌ها ممکن است برای مبتدیان پیچیده باشد.
  • کاهش خوانایی کد: به دلیل استفاده از تعداد زیادی کلاس در HTML، ممکن است خوانایی کد کاهش یابد.
  • عدم ثبات در طراحی: اگر مراقب نباشیم، انعطاف زیاد آن می‌تواند منجر به طراحی‌های ناسازگار در پروژه شود.
  • وابستگی به فریم‌ورک: پروژه‌های ساخته‌شده با Tailwind ممکن است به شدت به این فریمورک وابسته شوند و تغییر به یک فریم‌ورک دیگر را دشوار کنند.

ارتقا به نسخه ۴ Tailwind CSS

به‌روزرسانی پروژه‌های موجود به نسخه ۴ Tailwind CSS ممکن است در ابتدا کمی دشوار به نظر برسد، مخصوصاً اگر پروژه پیچیده‌ای داشته باشیم، اما مزایای آن ارزش این تغییر را دارد. این نسخه با حذف utilityهای اضافی و ارائه‌ی سینتکس شفاف‌تر، کار با Tailwind CSS را ساده‌تر و سریع‌تر می‌کند.

دیدگاه‌ها:

متین گرشاسبی

بهمن 22, 1403  در  8:29 ق.ظ

سلام استاد خا قوت، ممنون بابت این پست
ولی بنده هنوز مشکل دارم در اضافه کردن یک فونت جدید! میشه راهنمایی بفرمایید چطوری از فونت جدید اضافه کنی؟ (فایل فونت رو دارم)

مسعود صدری

بهمن 22, 1403  در  10:41 ب.ظ

سلام
ممنونم.
لطفا تلگرام پیام بدید تا بررسی کنیم.

khadem13359

بهمن 19, 1403  در  8:36 ق.ظ

توضیحات و مثال ها بسیار عالی بودند و کاملا واضح و قابل درک
خیلی متشکر ♥

افزودن دیدگاه جدید