فارسی

با تسلط بر انباشت اصلاح‌کننده‌ها، مهارت خود در Tailwind CSS را ارتقا دهید. ترکیب اصلاح‌کننده‌های واکنش‌گرا، حالتی و گروهی را برای ساخت UIهای پیچیده و پویا بیاموزید.

آزاد کردن قدرت Tailwind: هنر انباشت اصلاح‌کننده‌ها برای ترکیب‌های پیچیده ابزاری

Tailwind CSS به طور اساسی نحوه رویکرد بسیاری از توسعه‌دهندگان به استایل‌دهی وب را تغییر داده است. فلسفه ابزار-محور آن امکان نمونه‌سازی سریع و ساخت طرح‌های سفارشی را بدون خروج از HTML فراهم می‌کند. در حالی که اعمال ابزارهای تکی مانند p-4 یا text-blue-500 ساده است، قدرت واقعی Tailwind زمانی آزاد می‌شود که شروع به ایجاد رابط‌های کاربری پیچیده، حالتمند و واکنش‌گرا می‌کنید. راز این کار در یک مفهوم قدرتمند و در عین حال ساده نهفته است: انباشت اصلاح‌کننده‌ها (modifier stacking).

بسیاری از توسعه‌دهندگان با اصلاح‌کننده‌های تکی مانند hover:bg-blue-500 یا md:grid-cols-3 راحت هستند. اما چه اتفاقی می‌افتد وقتی نیاز دارید یک استایل را فقط در حالت هاور، روی صفحه نمایش بزرگ، و زمانی که حالت تاریک فعال است اعمال کنید؟ اینجاست که انباشت اصلاح‌کننده‌ها وارد عمل می‌شود. این تکنیک زنجیره‌ای کردن چندین اصلاح‌کننده به یکدیگر برای ایجاد قوانین استایل‌دهی بسیار خاص است که به ترکیبی از شرایط پاسخ می‌دهند.

این راهنمای جامع شما را به یک غواصی عمیق در دنیای انباشت اصلاح‌کننده‌ها می‌برد. ما با اصول اولیه شروع کرده و به تدریج به ترکیب‌های پیشرفته شامل حالت‌ها، نقاط شکست، `group`، `peer` و حتی واریانت‌های دلخواه خواهیم پرداخت. در پایان، شما مجهز خواهید شد تا تقریباً هر جزء UI که تصور می‌کنید را با ظرافت اعلانی Tailwind CSS بسازید.

پایه و اساس: درک اصلاح‌کننده‌های تکی

قبل از اینکه بتوانیم انباشت کنیم، باید بلوک‌های سازنده را درک کنیم. در Tailwind، یک اصلاح‌کننده پیشوندی است که به یک کلاس ابزاری اضافه می‌شود و دیکته می‌کند که آن ابزار چه زمانی باید اعمال شود. آنها اساساً یک پیاده‌سازی ابزار-محور از شبه‌کلاس‌های CSS، مدیا کوئری‌ها و سایر قوانین شرطی هستند.

اصلاح‌کننده‌ها را می‌توان به طور کلی دسته‌بندی کرد:

به عنوان مثال، یک دکمه ساده ممکن است از یک اصلاح‌کننده حالت مانند این استفاده کند:

<button class="bg-sky-500 hover:bg-sky-600 ...">Click me</button>

در اینجا، hover:bg-sky-600 یک رنگ پس‌زمینه تیره‌تر را فقط زمانی که مکان‌نمای کاربر روی دکمه قرار دارد اعمال می‌کند. این مفهوم اساسی است که ما بر پایه آن بنا خواهیم کرد.

جادوی انباشت: ترکیب اصلاح‌کننده‌ها برای UIهای پویا

انباشت اصلاح‌کننده‌ها فرآیند زنجیره‌ای کردن این پیشوندها به یکدیگر برای ایجاد یک شرط خاص‌تر است. سینتکس آن ساده و قابل فهم است: شما فقط آنها را یکی پس از دیگری و با دو نقطه از هم جدا می‌کنید.

سینتکس: modifier1:modifier2:utility-class

ترتیب مهم است. Tailwind اصلاح‌کننده‌ها را از چپ به راست اعمال می‌کند. به عنوان مثال، کلاس md:hover:text-red-500 تقریباً به کد CSS زیر ترجمه می‌شود:

@media (min-width: 768px) {
.md\:hover\:text-red-500:hover {
color: red;
}
}

این قانون به این معنی است: «در نقطه شکست medium و بالاتر، زمانی که این عنصر هاور می‌شود، رنگ متن آن را قرمز کن.» بیایید چند نمونه عملی و واقعی را بررسی کنیم.

مثال ۱: ترکیب نقاط شکست و حالت‌ها

یک نیاز رایج این است که عناصر تعاملی در دستگاه‌های لمسی نسبت به دستگاه‌های مبتنی بر مکان‌نما رفتار متفاوتی داشته باشند. ما می‌توانیم با تغییر افکت‌های هاور در نقاط شکست مختلف این موضوع را شبیه‌سازی کنیم.

یک کامپوننت کارت را در نظر بگیرید که در دسکتاپ با هاور شدن به آرامی بلند می‌شود، اما در موبایل هیچ افکت هاوری ندارد تا از حالت‌های هاور چسبنده در لمس جلوگیری شود.

<div class="... transition-transform duration-300 md:hover:scale-105 md:hover:-translate-y-1">...</div>

تجزیه و تحلیل:

در صفحه‌های کوچکتر از 768px، اصلاح‌کننده md: از اعمال افکت‌های هاور جلوگیری می‌کند و تجربه بهتری را برای کاربران موبایل فراهم می‌کند.

مثال ۲: لایه‌بندی حالت تاریک با تعامل‌پذیری

حالت تاریک دیگر یک ویژگی خاص نیست؛ بلکه یک انتظار از سوی کاربر است. انباشت به شما این امکان را می‌دهد که استایل‌های تعاملی را تعریف کنید که برای هر طرح رنگی خاص هستند.

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

<a href="#" class="text-blue-600 underline hover:text-blue-800 dark:text-cyan-400 dark:hover:text-cyan-200">Read more</a>

تجزیه و تحلیل:

این نشان می‌دهد که چگونه می‌توانید مجموعه‌ای کامل از استایل‌های آگاه از تم را برای یک عنصر در یک خط واحد ایجاد کنید.

مثال ۳: سه‌گانه - انباشت اصلاح‌کننده‌های واکنش‌گرا، حالت تاریک و حالت

حالا، بیایید هر سه مفهوم را در یک قانون قدرتمند ترکیب کنیم. یک فیلد ورودی را تصور کنید که باید نشان دهد که در حالت focus است. بازخورد بصری باید در دسکتاپ و موبایل متفاوت باشد و باید با حالت تاریک سازگار شود.

<input type="text" class="border-gray-300 dark:border-gray-600 dark:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-blue-500 md:dark:focus:ring-yellow-400" />

بیایید روی پیچیده‌ترین کلاس اینجا تمرکز کنیم: md:dark:focus:ring-yellow-400.

تجزیه و تحلیل:

  1. md:: این قانون فقط در نقطه شکست medium (768px) و بالاتر اعمال می‌شود.
  2. dark:: در آن نقطه شکست، فقط در صورتی اعمال می‌شود که کاربر حالت تاریک را فعال کرده باشد.
  3. focus:: در آن نقطه شکست و حالت رنگی، فقط زمانی اعمال می‌شود که عنصر ورودی در حالت focus باشد.
  4. ring-yellow-400: هنگامی که هر سه شرط برآورده شوند، یک حلقه فوکوس زرد اعمال کن.

این کلاس ابزاری واحد به ما یک رفتار فوق‌العاده خاص می‌دهد: «در صفحه‌های بزرگ، در حالت تاریک، این ورودیِ در حال فوکوس را با یک حلقه زرد برجسته کن.» در همین حال، کلاس ساده‌تر focus:ring-blue-500 به عنوان استایل فوکوس پیش‌فرض برای همه سناریوهای دیگر (حالت روشن/تاریک موبایل و حالت روشن دسکتاپ) عمل می‌کند.

فراتر از اصول اولیه: انباشت پیشرفته با `group` و `peer`

انباشت زمانی قدرتمندتر می‌شود که اصلاح‌کننده‌هایی را معرفی کنید که بین عناصر ارتباط ایجاد می‌کنند. اصلاح‌کننده‌های group و peer به شما امکان می‌دهند یک عنصر را بر اساس وضعیت یک والد یا یک عنصر هم‌سطح (sibling) استایل‌دهی کنید.

افکت‌های هماهنگ با `group-*`

اصلاح‌کننده group برای زمانی عالی است که تعامل با یک عنصر والد باید بر یک یا چند فرزند آن تأثیر بگذارد. با افزودن کلاس group به والد، می‌توانید از group-hover:، group-focus: و غیره بر روی هر عنصر فرزند استفاده کنید.

بیایید یک کارت ایجاد کنیم که با هاور کردن روی هر قسمتی از آن، رنگ عنوانش تغییر کرده و یک آیکون پیکان حرکت کند. این کار باید با حالت تاریک نیز سازگار باشد.

<a href="#" class="group block p-6 bg-white dark:bg-slate-800 rounded-lg shadow-md"> <h3 class="text-slate-900 group-hover:text-blue-600 dark:text-white dark:group-hover:text-blue-400">Card Title</h3> <p class="text-slate-500 dark:text-slate-400">Card content goes here.</p> <span class="inline-block transition-transform group-hover:translate-x-1 motion-reduce:transform-none">→</span> </a>

تجزیه و تحلیل اصلاح‌کننده انباشته:

تعاملات پویا بین هم‌سطح‌ها با `peer-*`

اصلاح‌کننده peer برای استایل‌دهی به عناصر هم‌سطح (sibling) طراحی شده است. وقتی یک عنصر را با کلاس peer علامت‌گذاری می‌کنید، می‌توانید از اصلاح‌کننده‌هایی مانند peer-focus:، peer-invalid: یا peer-checked: روی یک عنصر هم‌سطح *بعدی* استفاده کنید تا آن را بر اساس وضعیت peer استایل‌دهی کنید.

یک مورد استفاده کلاسیک، یک ورودی فرم و برچسب آن است. ما می‌خواهیم وقتی ورودی فوکوس می‌شود، رنگ برچسب تغییر کند و همچنین اگر ورودی نامعتبر بود، یک پیام خطا ظاهر شود. این باید در تمام نقاط شکست و طرح‌های رنگی کار کند.

<div> <label for="email" class="text-sm font-medium text-gray-700 dark:text-gray-300 peer-focus:text-violet-600 dark:peer-focus:text-violet-400">Email</label> <input type="email" id="email" class="peer mt-1 block w-full border-gray-300 invalid:border-red-500 focus:border-violet-500 ..." required /> <p class="mt-2 invisible text-sm text-red-600 peer-invalid:visible">Please provide a valid email address.</p> </div>

تجزیه و تحلیل اصلاح‌کننده انباشته:

مرز نهایی: انباشت با واریانت‌های دلخواه

گاهی اوقات، شما نیاز دارید یک استایل را بر اساس شرطی اعمال کنید که Tailwind به طور پیش‌فرض اصلاح‌کننده‌ای برای آن ارائه نمی‌دهد. اینجاست که واریانت‌های دلخواه (arbitrary variants) وارد می‌شوند. آنها به شما اجازه می‌دهند یک انتخابگر سفارشی را درست در نام کلاس خود بنویسید، و بله، آنها قابل انباشت هستند!

سینتکس از براکت استفاده می‌کند: `[&_selector]:utility`.

مثال ۱: هدف قرار دادن فرزندان خاص در حالت هاور

تصور کنید یک کانتینر دارید و می‌خواهید تمام تگ‌های <strong> درون آن هنگام هاور شدن کانتینر سبز شوند، اما فقط در صفحه‌های بزرگ.

<div class="p-4 border lg:hover:[&_strong]:text-green-500">

This is a paragraph with important text that will change color.

This is another paragraph with another bolded part.

</div>

تجزیه و تحلیل:

کلاس lg:hover:[&_strong]:text-green-500 یک اصلاح‌کننده واکنش‌گرا (lg:)، یک اصلاح‌کننده حالت (hover:) و یک واریانت دلخواه ([&_strong]:) را برای ایجاد یک قانون بسیار خاص ترکیب می‌کند: «در صفحه‌های بزرگ و بالاتر، زمانی که این div هاور می‌شود، تمام عناصر <strong> فرزند را پیدا کن و متن آنها را سبز کن.»

مثال ۲: انباشت با انتخابگرهای صفت (Attribute)

این تکنیک برای ادغام با فریم‌ورک‌های جاوا اسکریپت که ممکن است از صفات `data-*` برای مدیریت حالت استفاده کنید (مانند آکاردئون‌ها، تب‌ها یا منوهای کشویی) فوق‌العاده مفید است.

بیایید ناحیه محتوای یک آیتم آکاردئون را طوری استایل‌دهی کنیم که به طور پیش‌فرض پنهان باشد اما زمانی که والد آن `data-state="open"` را دارد، قابل مشاهده باشد. ما همچنین می‌خواهیم وقتی در حالت تاریک باز است، رنگ پس‌زمینه متفاوتی داشته باشد.

<div data-state="closed" class="border rounded"> <h3>... Accordion Trigger ...</h3> <div class="overflow-hidden h-0 [data-state=open]:h-auto dark:[data-state=open]:bg-gray-800"> Accordion Content... </div> </div>

جاوا اسکریپت شما صفت `data-state` را در والد بین `open` و `closed` تغییر می‌دهد.

تجزیه و تحلیل اصلاح‌کننده انباشته:

کلاس dark:[data-state=open]:bg-gray-800 روی `div` محتوا یک مثال عالی است. این می‌گوید: «هنگامی که حالت تاریک فعال است و عنصر دارای صفت `data-state="open"` است، یک پس‌زمینه خاکستری تیره اعمال کن.» این با قانون پایه [data-state=open]:h-auto که visibility آن را در همه حالت‌ها کنترل می‌کند، انباشته می‌شود.

بهترین شیوه‌ها و ملاحظات عملکردی

در حالی که انباشت اصلاح‌کننده‌ها قدرتمند است، استفاده هوشمندانه از آن برای حفظ یک کدبیس تمیز و قابل مدیریت ضروری است.

نتیجه‌گیری: هر چیزی را که تصور می‌کنید بسازید

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

نکته کلیدی این است که شما دیگر به استایل‌های تک‌شرطی محدود نیستید. اکنون می‌توانید به صورت اعلانی تعریف کنید که یک عنصر تحت ترکیبی دقیق از شرایط چگونه باید به نظر برسد و رفتار کند. چه یک دکمه ساده باشد که با حالت تاریک سازگار است یا یک کامپوننت فرم پیچیده و آگاه از حالت، انباشت اصلاح‌کننده‌ها ابزارهایی را که برای ساختن آن به صورت زیبا و کارآمد نیاز دارید، فراهم می‌کند، همه اینها بدون اینکه هرگز از راحتی مارک‌آپ خود خارج شوید.