Responsive Design و Breakpointها در Tailwind CSS
بهنام نوبخت · ۱۴۰۵/۷/۱۳
امروزه کاربران یک وبسایت را فقط با کامپیوتر مشاهده نمیکنند؛ موبایل، تبلت، لپتاپ و مانیتورهای بزرگ همگی میتوانند برای مشاهده یک صفحه وب استفاده شوند. به همین دلیل یک وبسایت حرفهای باید بتواند در اندازههای مختلف صفحه نمایش، ظاهر و چیدمان مناسبی داشته باشد. به این مفهوم Responsive Design یا طراحی واکنشگرا گفته میشود. Tailwind CSS یکی از ابزارهای بسیار مناسب برای ساخت صفحات Responsive است، زیرا میتوانیم برای هر اندازه صفحه، Utilityهای متفاوتی را به صورت مستقیم روی عناصر قرار دهیم. در این مقاله ابتدا مفهوم Responsive Design را یاد میگیریم و سپس با Breakpointهای Tailwind CSS کار میکنیم.
Responsive Design چیست؟
Responsive Design یعنی طراحی صفحه به شکلی که بتواند خودش را با اندازه صفحه نمایش کاربر تطبیق دهد.
برای مثال، یک صفحه فروشگاهی ممکن است در دسکتاپ به این شکل باشد:
+----------+----------+----------+----------+
| Product | Product | Product | Product |
+----------+----------+----------+----------+اما در موبایل بهتر است کارتها به صورت محدودتر نمایش داده شوند:
+------------------+
| Product |
+------------------+
+------------------+
| Product |
+------------------+یعنی Layout با توجه به اندازه صفحه تغییر کند.
چرا Responsive Design مهم است؟
اگر یک سایت فقط برای صفحهنمایش بزرگ طراحی شده باشد، ممکن است در موبایل مشکلاتی مانند موارد زیر ایجاد شود:
متن بیش از حد کوچک یا بزرگ باشد.
دکمهها فضای مناسبی نداشته باشند.
عناصر از صفحه خارج شوند.
جدولها یا تصاویر باعث ایجاد Scroll ناخواسته شوند.
منو فضای زیادی اشغال کند.
کارتها بیش از حد فشرده شوند.
بنابراین Responsive Design یکی از مهارتهای ضروری در طراحی رابط کاربری است.
Responsive Design در Tailwind CSS
Tailwind CSS از یک سیستم Mobile-First برای Responsive Design استفاده میکند.
این موضوع بسیار مهم است.
در Tailwind معمولاً ابتدا ظاهر پایه را برای صفحههای کوچک تعریف میکنیم و سپس با Breakpointها، ظاهر صفحه را در اندازههای بزرگتر تغییر میدهیم.
مثلاً:
<div class="text-center md:text-left">
Hello
</div>در این مثال:
text-centerحالت پایه را مشخص میکند.
و:
md:text-leftمیگوید از Breakpoint مربوط به md به بعد، متن چپچین شود.
در Tailwind، Utility بدون Prefix حالت پایه را تعیین میکند و Prefixهایی مانند
sm:،md:،lg:و ... تغییرات مربوط به اندازههای بزرگتر را مشخص میکنند.
Breakpoint چیست؟
Breakpoint یک نقطه یا محدوده در عرض صفحه است که از آن به بعد میتوانیم ظاهر یک عنصر را تغییر دهیم.
Tailwind CSS Breakpointهای استانداردی دارد که به صورت Prefix استفاده میشوند.
نمونه:
sm:
md:
lg:
xl:
2xl:هرکدام نشاندهنده یک اندازه صفحه هستند.
Breakpointهای پیشفرض Tailwind CSS
در Tailwind CSS میتوانیم از Breakpointهای استاندارد زیر استفاده کنیم:
Prefix | حداقل عرض |
|---|---|
| 640px |
| 768px |
| 1024px |
| 1280px |
| 1536px |
این مقادیر به صورت حداقل عرض عمل میکنند.
یعنی مثلاً:
md:text-leftیعنی از عرض 768px به بالا، این Utility اعمال شود.
Mobile-First یعنی چه؟
فرض کنید میخواهیم متن در موبایل وسطچین باشد و در دسکتاپ چپچین شود.
روش Mobile-First:
<h1 class="text-center md:text-left">
Welcome
</h1>در موبایل:
Welcomeو در اندازه md و بزرگتر:
Welcomeابتدا حالت کوچک را تعریف کردهایم و سپس حالت بزرگتر را اضافه کردهایم.
تغییر اندازه متن در Breakpointهای مختلف
یکی از رایجترین کاربردهای Responsive Utilityها، تغییر اندازه Typography است.
مثلاً:
<h1 class="text-2xl md:text-4xl lg:text-5xl">
Welcome
</h1>در این مثال:
Mobile → text-2xl
Tablet → text-4xl
Desktop → text-5xlبنابراین یک عنوان میتواند با توجه به اندازه صفحه بزرگتر شود.
تغییر Padding به صورت Responsive
میتوانیم Spacing را نیز Responsive کنیم.
مثال:
<div class="p-4 md:p-8 lg:p-12">
Content
</div>یعنی:
در صفحه کوچک →
p-4از
md→p-8از
lg→p-12
این روش برای بخشهای مختلف صفحه بسیار کاربردی است.
تغییر فاصله بین عناصر
مثلاً:
<div class="flex gap-2 md:gap-4 lg:gap-8">
...
</div>در اندازههای مختلف، فاصله بین آیتمها تغییر میکند.
Responsive Grid
یکی از مهمترین کاربردهای Breakpointها، تغییر تعداد ستونهای Grid است.
فرض کنید میخواهیم:
موبایل → یک ستون
تبلت → دو ستون
دسکتاپ → سه ستون
داشته باشیم.
کد:
<div class="grid grid-cols-1 gap-6 md:grid-cols-2 lg:grid-cols-3">
<div class="rounded-xl border p-5">
Product 1
</div>
<div class="rounded-xl border p-5">
Product 2
</div>
<div class="rounded-xl border p-5">
Product 3
</div>
<div class="rounded-xl border p-5">
Product 4
</div>
</div>ساختار:
Mobile
+----------+
| Product |
+----------+
| Product |
+----------+
| Product |
+----------+
Tablet
+----------+----------+
| Product | Product |
+----------+----------+
| Product | Product |
+----------+----------+
Desktop
+----------+----------+----------+
| Product | Product | Product |
+----------+----------+----------+
| Product | Product | |
+----------+----------+----------+این یکی از مهمترین الگوهای Responsive در پروژههای واقعی است.
Responsive Flexbox
میتوانیم جهت Flexbox را نیز تغییر دهیم.
مثلاً در موبایل:
Image
Contentو در دسکتاپ:
Image Contentکد:
<div class="flex flex-col gap-6 md:flex-row">
<div>
<img
src="product.jpg"
alt="Product"
class="h-64 w-full rounded-xl object-cover"
>
</div>
<div>
<h2 class="text-2xl font-bold">
Product Name
</h2>
<p class="mt-3 text-gray-600">
Product description.
</p>
</div>
</div>در اینجا:
flex-colحالت پایه را مشخص میکند.
و:
md:flex-rowاز md به بعد جهت را به Row تغییر میدهد.
تغییر Display با Breakpoint
حتی میتوانیم نمایش یک عنصر را در اندازههای مختلف تغییر دهیم.
مثلاً:
<div class="block md:hidden">
Mobile Menu
</div>در این مثال:
blockدر حالت پایه عنصر را نمایش میدهد.
و:
md:hiddenاز md به بعد آن را مخفی میکند.
بنابراین:
Mobile
→ Mobile Menu visible
Desktop
→ Mobile Menu hiddenنمایش عنصر فقط در اندازههای بزرگتر
برعکس، میتوانیم عنصری داشته باشیم که در موبایل مخفی باشد و در دسکتاپ نمایش داده شود.
<div class="hidden md:block">
Desktop Content
</div>در موبایل:
Hiddenو از md به بعد:
Visibleاین الگو در Navigationها بسیار کاربردی است.
Responsive Width
میتوانیم عرض عناصر را نیز در Breakpointهای مختلف تغییر دهیم.
مثال:
<div class="w-full md:w-1/2 lg:w-1/3">
Content
</div>یعنی:
Mobile → 100%
Tablet → 50%
Desktop → حدود 33%این روش برای ساخت Layoutهای چندبخشی بسیار کاربردی است.
Responsive Height
Height نیز میتواند Responsive باشد.
<div class="h-48 md:h-64 lg:h-96">
Content
</div>در این مثال ارتفاع عنصر در اندازههای مختلف تغییر میکند.
Responsive Position
حتی Position را نیز میتوان با Breakpointها تغییر داد.
مثال:
<div class="absolute right-2 top-2 md:right-6 md:top-6">
Badge
</div>در صفحه کوچک Badge نزدیکتر به گوشه قرار میگیرد و در صفحه بزرگتر فاصله آن بیشتر میشود.
ترکیب چند Breakpoint
میتوانیم چند Breakpoint را همزمان استفاده کنیم.
مثال:
<h1 class="text-xl sm:text-2xl md:text-3xl lg:text-5xl">
Tailwind CSS
</h1>یعنی:
Base → text-xl
sm → text-2xl
md → text-3xl
lg → text-5xlاین روش امکان کنترل دقیقتر ظاهر صفحه را فراهم میکند.
Breakpoint فقط برای یک Property نیست
یکی از نکات مهم این است که Breakpointها را میتوان برای Utilityهای مختلف استفاده کرد.
برای مثال:
<div class="
grid
grid-cols-1
gap-4
p-4
md:grid-cols-2
md:gap-6
md:p-8
lg:grid-cols-3
">در اینجا همزمان:
تعداد ستونها
فاصله
Padding
در اندازههای مختلف تغییر میکنند.
ساخت یک کارت Responsive
حالا یک مثال کاربردی ایجاد کنیم.
<div class="flex flex-col overflow-hidden rounded-xl border bg-white shadow md:flex-row">
<img
src="product.jpg"
alt="Product"
class="h-56 w-full object-cover md:h-auto md:w-64"
>
<div class="flex flex-1 flex-col p-5">
<h2 class="text-xl font-bold md:text-2xl">
لپتاپ حرفهای
</h2>
<p class="mt-2 text-gray-600">
یک لپتاپ مناسب برای برنامهنویسی و کارهای حرفهای.
</p>
<div class="mt-5 flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between">
<span class="font-bold">
۵۰,۰۰۰,۰۰۰ تومان
</span>
<button class="rounded-lg bg-blue-600 px-5 py-3 text-white">
خرید محصول
</button>
</div>
</div>
</div>این کارت در موبایل به شکل عمودی است:
+------------------+
| Image |
+------------------+
| Title |
| Description |
| Price |
| Button |
+------------------+اما در اندازه بزرگتر:
+----------+----------------------+
| | Title |
| Image | Description |
| | Price Button |
+----------+----------------------+این دقیقاً یکی از کاربردهای واقعی Responsive Design است.
ساخت Responsive Header
Header یکی از بخشهایی است که معمولاً به Responsive Design نیاز دارد.
یک نمونه ساده:
<header class="border-b bg-white">
<div class="mx-auto flex max-w-7xl items-center justify-between px-4 py-4">
<div class="text-xl font-bold">
My Website
</div>
<nav class="hidden items-center gap-6 md:flex">
<a href="#">Home</a>
<a href="#">Products</a>
<a href="#">About</a>
<a href="#">Contact</a>
</nav>
<button class="rounded-lg border px-4 py-2 md:hidden">
Menu
</button>
</div>
</header>در این مثال:
hidden md:flexباعث میشود Navigation در صفحههای کوچک مخفی باشد و از md به بعد نمایش داده شود.
و:
md:hiddenباعث میشود Button مربوط به Menu در صفحههای بزرگ مخفی شود.
ساختار مفهومی:
Mobile
Logo Menu
Desktop
Logo Navigationالبته در یک پروژه واقعی، Button مربوط به Menu باید با JavaScript یا یک Framework به منوی موبایل متصل شود.
Mobile-First یک مثال کامل
فرض کنید میخواهیم یک بخش معرفی داشته باشیم.
در موبایل:
Title
Description
Image
Buttonدر دسکتاپ:
Title + Description + Button Imageکد:
<section class="mx-auto max-w-6xl px-6 py-12">
<div class="flex flex-col gap-8 md:flex-row md:items-center">
<div class="flex-1">
<h1 class="text-3xl font-bold md:text-5xl">
ساخت وبسایت مدرن
</h1>
<p class="mt-4 text-gray-600 md:text-lg">
با Tailwind CSS میتوانید رابطهای کاربری
مدرن و Responsive ایجاد کنید.
</p>
<button class="mt-6 rounded-lg bg-blue-600 px-6 py-3 text-white">
شروع کنید
</button>
</div>
<div class="flex-1">
<img
src="hero.jpg"
alt="Modern Website"
class="w-full rounded-2xl object-cover"
>
</div>
</div>
</section>در اینجا Layout از ابتدا برای صفحه کوچک طراحی شده و سپس از md به بعد به حالت دو ستونه تغییر میکند.
ترتیب فکری مناسب برای Responsive Design
هنگام ساخت یک صفحه Responsive بهتر است ابتدا از خودمان بپرسیم:
مرحله اول: موبایل چه شکلی باشد؟
مثلاً:
One Columnمرحله دوم: در تبلت چه تغییری لازم است؟
مثلاً:
Two Columnsمرحله سوم: در دسکتاپ چه تغییری لازم است؟
مثلاً:
Three Columnsسپس Utilityها را به شکل Mobile-First مینویسیم:
grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3این روش باعث میشود ساختار Responsive صفحه منظمتر باشد.
اشتباهات رایج در Responsive Design
اشتباه اول: طراحی فقط برای Desktop
گاهی ابتدا تمام صفحه برای Desktop طراحی میشود و بعد تلاش میکنیم آن را برای موبایل اصلاح کنیم.
در Tailwind بهتر است از ابتدا با رویکرد Mobile-First کار کنیم.
اشتباه دوم: استفاده بیش از حد از Breakpointها
مثلاً چنین کدی:
text-xl sm:text-2xl md:text-3xl lg:text-4xl xl:text-5xl 2xl:text-6xlهمیشه لازم نیست.
اگر طراحی شما با دو یا سه حالت به خوبی کار میکند، نیازی نیست برای تمام Breakpointها مقدار متفاوت تعیین کنید.
اشتباه سوم: ایجاد Horizontal Scroll ناخواسته
اگر یک عنصر عرض زیادی داشته باشد، ممکن است صفحه در موبایل به صورت افقی Scroll شود.
باید همیشه Layout را در اندازههای کوچک بررسی کنیم.
اشتباه چهارم: مخفی کردن محتوای مهم
استفاده از:
hidden md:blockباید با دقت انجام شود.
اگر محتوایی برای کاربر ضروری است، نباید صرفاً برای سادهتر شدن Layout موبایل آن را بدون جایگزین مخفی کنیم.
چگونه Responsive بودن صفحه را تست کنیم؟
هنگام توسعه وبسایت، صفحه را فقط روی کامپیوتر بررسی نکنید.
میتوانید در مرورگر:
Developer Tools را باز کنید.
حالت Device یا Responsive را فعال کنید.
عرض صفحه را تغییر دهید.
Layout را در اندازههای مختلف بررسی کنید.
باید بررسی کنید:
متنها خوانا هستند؟
دکمهها قابل استفاده هستند؟
تصاویر از صفحه خارج نشدهاند؟
Grid درست تغییر میکند؟
Navigation مناسب است؟
Horizontal Scroll ناخواسته وجود ندارد؟
تمرین عملی
یک صفحه فروشگاهی Responsive بسازید که شامل موارد زیر باشد:
Header
در موبایل:
Logo Menuدر Desktop:
Logo NavigationProduct Grid
در موبایل:
1 columnدر Tablet:
2 columnsدر Desktop:
3 columnsبرای این بخش از:
grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3استفاده کنید.
Product Card
داخل هر کارت:
تصویر
عنوان
توضیح
قیمت
Button
قرار دهید.
Hero Section
در موبایل:
Content
Imageدر Desktop:
Content Imageبرای این بخش از:
flex flex-col md:flex-rowاستفاده کنید.
جمعبندی
در این مقاله با Responsive Design و Breakpointهای Tailwind CSS آشنا شدیم.
یاد گرفتیم که Responsive Design یعنی طراحی صفحه به شکلی که در اندازههای مختلف نمایشگر عملکرد و ظاهر مناسبی داشته باشد.
با Breakpointهای اصلی Tailwind آشنا شدیم:
sm: → 640px
md: → 768px
lg: → 1024px
xl: → 1280px
2xl: → 1536pxهمچنین یاد گرفتیم:
Tailwind از رویکرد Mobile-First استفاده میکند.
Utility بدون Prefix حالت پایه را مشخص میکند.
md:،lg:و سایر Prefixها تغییرات مربوط به عرضهای بزرگتر را مشخص میکنند.میتوان تعداد ستونهای Grid را Responsive کرد.
میتوان جهت Flexbox را در Breakpointهای مختلف تغییر داد.
میتوان اندازه متن، فاصله، Padding، Width و Height را Responsive کرد.
میتوان عناصر را در اندازههای مختلف نمایش یا مخفی کرد.
Responsive Design باید از ابتدا بخشی از طراحی صفحه باشد.
نظرات
هنوز نظری ثبت نشده است.