ساخت صفحات Responsive با Tailwind CSS
بهنام نوبخت · ۱۴۰۵/۷/۱۳
در مقاله قبل با Responsive Design و Breakpointهای Tailwind CSS آشنا شدیم و یاد گرفتیم چگونه ظاهر یک عنصر را در اندازههای مختلف صفحه تغییر دهیم. اما یادگیری Responsive Design فقط با شناختن sm:، md: و lg: کامل نمیشود؛ باید بتوانیم این مفاهیم را در یک صفحه واقعی به کار ببریم. در این مقاله یک صفحه وب را مرحلهبهمرحله طراحی میکنیم و از Container، Flexbox، Grid، Spacing، Typography و Breakpointها در کنار یکدیگر استفاده خواهیم کرد. هدف این مقاله این است که ببینیم چگونه یک Layout که در موبایل مناسب است، در تبلت و دسکتاپ نیز به شکل صحیح تغییر کند.
Responsive Page چیست؟
یک صفحه Responsive باید بتواند خودش را با عرض صفحه کاربر تطبیق دهد.
برای مثال، یک صفحه فروشگاهی میتواند در موبایل چنین ساختاری داشته باشد:
Header
↓
Hero
↓
Product
↓
Product
↓
Product
↓
Footerاما در دسکتاپ:
Header
↓
+-----------------------------+
| Hero |
+-----------------------------+
↓
+---------+---------+---------+
| Product | Product | Product |
+---------+---------+---------+
↓
Footerیعنی ساختار محتوا میتواند یکسان باشد، اما نحوه نمایش آن تغییر کند.
اصل مهم: Mobile-First
در Tailwind CSS بهتر است ابتدا نسخه موبایل را طراحی کنیم.
برای مثال:
<div class="flex flex-col md:flex-row">
...
</div>در حالت پایه:
flex-colفعال است.
و از md به بعد:
md:flex-rowفعال میشود.
بنابراین ابتدا Layout موبایل را ساختهایم و سپس آن را برای صفحه بزرگتر تغییر دادهایم.
پروژهای که در این مقاله میسازیم
در این مقاله یک صفحه فروشگاهی ساده با بخشهای زیر ایجاد میکنیم:
Header
Hero Section
Category Section
Product Section
Call To Action
Footerهدف این نیست که یک فروشگاه کامل بسازیم؛ هدف این است که نحوه ساخت یک صفحه Responsive واقعی با Tailwind CSS را یاد بگیریم.
مرحله اول — ساخت ساختار HTML
ابتدا ساختار کلی صفحه را ایجاد میکنیم:
<body>
<header>
...
</header>
<main>
<section>
...
</section>
<section>
...
</section>
<section>
...
</section>
</main>
<footer>
...
</footer>
</body>در ادامه هر قسمت را تکمیل میکنیم.
مرحله دوم — ساخت Header Responsive
ابتدا یک Header ساده ایجاد میکنیم:
<header class="border-b bg-white">
<div class="mx-auto flex max-w-7xl items-center justify-between px-4 py-4">
<a href="#" class="text-xl font-bold">
MyStore
</a>
<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>در موبایل:
MyStore Menuدر دسکتاپ:
MyStore Home Products About Contactبررسی Utilityها
flexبرای چیدمان Header استفاده شده است.
items-centerبرای تراز عمودی عناصر استفاده شده است.
justify-betweenبرای قرار دادن عناصر در دو طرف Container استفاده شده است.
hidden md:flexNavigation را در موبایل مخفی و در اندازههای بزرگتر نمایش میدهد.
md:hiddenدکمه Menu را از md به بعد مخفی میکند.
مرحله سوم — ساخت Hero Section
حالا یک Hero Section ایجاد میکنیم.
<section class="bg-gray-100">
<div class="mx-auto flex max-w-7xl flex-col gap-8 px-6 py-12 md:flex-row md:items-center md:py-20">
<div class="flex-1">
<span class="text-sm font-semibold text-blue-600">
NEW COLLECTION
</span>
<h1 class="mt-3 text-3xl font-bold md:text-5xl">
محصولات جدید را کشف کنید
</h1>
<p class="mt-4 text-gray-600 md:text-lg">
جدیدترین محصولات فروشگاه را با طراحی مدرن و
کیفیت مناسب مشاهده کنید.
</p>
<button class="mt-6 rounded-lg bg-blue-600 px-6 py-3 font-semibold text-white">
مشاهده محصولات
</button>
</div>
<div class="flex-1">
<img
src="hero.jpg"
alt="New Collection"
class="w-full rounded-2xl object-cover"
>
</div>
</div>
</section>در موبایل:
Title
Description
Button
Imageدر دسکتاپ:
Title + Description + Button Imageچرا از flex-col استفاده کردیم؟
چون حالت پایه برای موبایل است:
flex-colسپس از md به بعد:
md:flex-rowLayout را دو ستونه میکنیم.
مرحله چهارم — Responsive Typography
در Hero از:
text-3xl md:text-5xlاستفاده کردیم.
یعنی عنوان در موبایل اندازه مناسبی دارد و در صفحههای بزرگتر بزرگتر میشود.
همچنین:
md:text-lgاندازه متن توضیح را در صفحههای بزرگتر افزایش میدهد.
Responsive فقط مربوط به Layout نیست؛ Typography نیز باید با اندازه صفحه هماهنگ شود.
مرحله پنجم — ساخت بخش دستهبندیها
حالا میخواهیم چهار دستهبندی ایجاد کنیم.
<section class="mx-auto max-w-7xl px-6 py-12">
<div class="mb-8">
<h2 class="text-2xl font-bold md:text-3xl">
دستهبندیها
</h2>
<p class="mt-2 text-gray-600">
دستهبندی موردنظر خود را انتخاب کنید.
</p>
</div>
<div class="grid grid-cols-2 gap-4 md:grid-cols-4">
<a href="#" class="rounded-xl border p-5 text-center shadow-sm">
Electronics
</a>
<a href="#" class="rounded-xl border p-5 text-center shadow-sm">
Fashion
</a>
<a href="#" class="rounded-xl border p-5 text-center shadow-sm">
Home
</a>
<a href="#" class="rounded-xl border p-5 text-center shadow-sm">
Sports
</a>
</div>
</section>در موبایل:
+-----------+-----------+
| Electronics| Fashion |
+-----------+-----------+
| Home | Sports |
+-----------+-----------+در دسکتاپ:
+-----------+-----------+-----------+-----------+
| Electronics| Fashion | Home | Sports |
+-----------+-----------+-----------+-----------+در اینجا:
grid-cols-2حالت پایه را مشخص میکند.
و:
md:grid-cols-4از md به بعد تعداد ستونها را به چهار عدد افزایش میدهد.
مرحله ششم — ساخت Product Grid
حالا بخش محصولات را میسازیم.
<section class="bg-gray-50">
<div class="mx-auto max-w-7xl px-6 py-12">
<div class="mb-8 flex flex-col gap-4 sm:flex-row sm:items-end sm:justify-between">
<div>
<h2 class="text-2xl font-bold md:text-3xl">
محصولات جدید
</h2>
<p class="mt-2 text-gray-600">
جدیدترین محصولات فروشگاه
</p>
</div>
<a href="#" class="font-semibold text-blue-600">
مشاهده همه
</a>
</div>
<div class="grid grid-cols-1 gap-6 sm:grid-cols-2 lg:grid-cols-3">
<div class="overflow-hidden rounded-xl border bg-white shadow-sm">
<img
src="product-1.jpg"
alt="Product 1"
class="h-56 w-full object-cover"
>
<div class="p-5">
<h3 class="text-lg font-bold">
Product 1
</h3>
<p class="mt-2 text-gray-600">
Product description.
</p>
<div class="mt-5 flex items-center justify-between">
<span class="font-bold">
$120
</span>
<button class="rounded-lg bg-blue-600 px-4 py-2 text-white">
خرید
</button>
</div>
</div>
</div>
<div class="overflow-hidden rounded-xl border bg-white shadow-sm">
<img
src="product-2.jpg"
alt="Product 2"
class="h-56 w-full object-cover"
>
<div class="p-5">
<h3 class="text-lg font-bold">
Product 2
</h3>
<p class="mt-2 text-gray-600">
Product description.
</p>
<div class="mt-5 flex items-center justify-between">
<span class="font-bold">
$150
</span>
<button class="rounded-lg bg-blue-600 px-4 py-2 text-white">
خرید
</button>
</div>
</div>
</div>
<div class="overflow-hidden rounded-xl border bg-white shadow-sm">
<img
src="product-3.jpg"
alt="Product 3"
class="h-56 w-full object-cover"
>
<div class="p-5">
<h3 class="text-lg font-bold">
Product 3
</h3>
<p class="mt-2 text-gray-600">
Product description.
</p>
<div class="mt-5 flex items-center justify-between">
<span class="font-bold">
$180
</span>
<button class="rounded-lg bg-blue-600 px-4 py-2 text-white">
خرید
</button>
</div>
</div>
</div>
</div>
</div>
</section>بررسی Product Grid
در این قسمت از:
grid-cols-1 sm:grid-cols-2 lg:grid-cols-3استفاده کردهایم.
بنابراین:
Mobile
→ 1 column
Small screens
→ 2 columns
Large screens
→ 3 columnsاین یکی از رایجترین الگوهای Responsive برای نمایش محصولات است.
چرا از sm استفاده کردیم؟
قبلاً ممکن بود فقط از:
grid-cols-1 md:grid-cols-3استفاده کنیم.
اما میتوانیم Layout را دقیقتر کنیم:
grid-cols-1 sm:grid-cols-2 lg:grid-cols-3در این حالت، صفحه در اندازههای مختلف مرحلهبهمرحله تغییر میکند.
البته همیشه لازم نیست از همه Breakpointها استفاده کنیم.
مرحله هفتم — ساخت CTA
CTA یا Call To Action بخشی است که کاربر را به انجام یک عمل مشخص دعوت میکند.
مثلاً:
<section class="mx-auto max-w-7xl px-6 py-12">
<div class="rounded-2xl bg-blue-600 px-6 py-10 text-center text-white md:px-12">
<h2 class="text-2xl font-bold md:text-3xl">
آماده شروع هستید؟
</h2>
<p class="mx-auto mt-3 max-w-2xl text-blue-100">
جدیدترین محصولات ما را مشاهده کنید و
محصول موردنظر خود را انتخاب کنید.
</p>
<button class="mt-6 rounded-lg bg-white px-6 py-3 font-semibold text-blue-600">
شروع کنید
</button>
</div>
</section>در این بخش نیز Typography و Padding را Responsive کردهایم:
px-6 md:px-12و:
text-2xl md:text-3xlمرحله هشتم — ساخت Footer Responsive
حالا Footer را اضافه میکنیم.
<footer class="bg-gray-900 text-white">
<div class="mx-auto grid max-w-7xl grid-cols-1 gap-8 px-6 py-12 sm:grid-cols-2 lg:grid-cols-4">
<div>
<h3 class="text-lg font-bold">
MyStore
</h3>
<p class="mt-3 text-gray-400">
فروشگاه آنلاین با طراحی مدرن.
</p>
</div>
<div>
<h3 class="font-bold">
Products
</h3>
<div class="mt-3 space-y-2 text-gray-400">
<a href="#" class="block">Electronics</a>
<a href="#" class="block">Fashion</a>
<a href="#" class="block">Home</a>
</div>
</div>
<div>
<h3 class="font-bold">
Company
</h3>
<div class="mt-3 space-y-2 text-gray-400">
<a href="#" class="block">About</a>
<a href="#" class="block">Contact</a>
<a href="#" class="block">Support</a>
</div>
</div>
<div>
<h3 class="font-bold">
Follow Us
</h3>
<div class="mt-3 flex gap-4 text-gray-400">
<a href="#">Instagram</a>
<a href="#">Twitter</a>
</div>
</div>
</div>
</footer>در موبایل:
MyStore
Products
Company
Follow Usدر دسکتاپ:
MyStore | Products | Company | Follow Usچون از:
grid-cols-1 sm:grid-cols-2 lg:grid-cols-4استفاده کردهایم.
صفحه کامل
حالا میتوانیم بخشهای مختلف را کنار هم قرار دهیم:
<body>
<header>
Header
</header>
<main>
<section>
Hero
</section>
<section>
Categories
</section>
<section>
Products
</section>
<section>
CTA
</section>
</main>
<footer>
Footer
</footer>
</body>در یک پروژه واقعی، این بخشها میتوانند در فایلهای جداگانه Component یا Template قرار بگیرند.
یک نکته مهم درباره Responsive Design
Responsive Design فقط به معنی کوچک کردن عناصر نیست.
باید در بعضی مواقع ساختار Layout را تغییر دهیم.
برای مثال:
Desktop
Image Contentممکن است در موبایل تبدیل شود به:
Mobile
Image
Contentیا:
Desktop
Menu Item 1 | Menu Item 2 | Menu Item 3در موبایل:
Menuبنابراین Responsive Design یعنی سازگار کردن تجربه کاربر با فضای موجود، نه فقط کاهش اندازه عناصر.
استفاده هوشمندانه از Breakpointها
لازم نیست برای هر Utility چندین Breakpoint تعریف کنیم.
مثلاً:
text-xl sm:text-2xl md:text-3xl lg:text-4xl xl:text-5xlممکن است برای یک عنوان بیش از حد پیچیده باشد.
گاهی این کد کافی است:
text-2xl md:text-4xlقاعده ساده:
از کمترین تعداد Breakpoint لازم برای رسیدن به Layout مناسب استفاده کنید.
این کار باعث میشود کد Tailwind سادهتر و قابل نگهداریتر باشد.
استفاده از max-width برای جلوگیری از کشیدگی محتوا
در صفحات بزرگ، نباید متنها بیش از حد کشیده شوند.
برای مثال:
<p class="max-w-2xl">
این متن یک توضیح نسبتاً طولانی است که بهتر است
در یک محدوده مناسب نمایش داده شود تا خواندن آن برای
کاربر راحتتر باشد.
</p>همچنین میتوانیم Container اصلی را محدود کنیم:
<div class="mx-auto max-w-7xl px-6">
...
</div>این روش باعث میشود محتوا در مانیتورهای بسیار بزرگ بیش از حد کشیده نشود.
جلوگیری از مشکلات Responsive
هنگام ساخت صفحه Responsive موارد زیر را بررسی کنید.
تصاویر
از عرض مناسب استفاده کنید:
<img class="w-full object-cover" ...>متن
متنهای بسیار طولانی ممکن است Layout را خراب کنند.
دکمهها
در موبایل باید فضای کافی برای لمس داشته باشند.
Grid
تعداد ستونها را متناسب با عرض صفحه انتخاب کنید.
Flexbox
در صورت نیاز جهت Layout را تغییر دهید:
flex-col md:flex-rowOverflow
اگر محتوایی بیش از حد عریض است، باید رفتار Overflow آن را بررسی کنید.
تست Responsive
بعد از ساخت صفحه، حتماً آن را در اندازههای مختلف بررسی کنید.
حداقل این حالتها را تست کنید:
Mobile
Tablet
Laptop
Desktop
Large Desktopدر مرورگر میتوانید از Developer Tools استفاده کنید و عرض صفحه را تغییر دهید.
در هر اندازه بررسی کنید:
آیا محتوا از صفحه خارج شده است؟
آیا متن خوانا است؟
آیا دکمهها قابل استفاده هستند؟
آیا تصاویر مناسب هستند؟
آیا Grid به درستی تغییر کرده است؟
آیا Header مناسب است؟
آیا Footer Layout مناسبی دارد؟
آیا Horizontal Scroll ناخواسته ایجاد شده است؟
اشتباهات رایج
۱. طراحی فقط برای Desktop
اگر ابتدا یک Layout بزرگ طراحی کنید و بعد بخواهید آن را برای موبایل اصلاح کنید، ممکن است مجبور شوید تغییرات زیادی انجام دهید.
بهتر است از ابتدا Mobile-First فکر کنید.
۲. استفاده زیاد از Fixed Width
کدهایی مانند:
w-[900px]ممکن است در صفحههای کوچک مشکل ایجاد کنند.
در بسیاری از Layoutها استفاده از:
w-full
max-w-*مناسبتر است.
۳. Breakpointهای بیش از حد
استفاده از Breakpointهای زیاد بدون نیاز واقعی، کد را پیچیده میکند.
۴. نادیده گرفتن محتوای واقعی
Responsive Design باید با محتوای واقعی تست شود.
مثلاً یک عنوان کوتاه ممکن است کاملاً مناسب باشد، اما عنوان طولانی Layout را تغییر دهد.
تمرین عملی
حالا نوبت شماست که یک Landing Page Responsive بسازید.
صفحه باید شامل بخشهای زیر باشد:
Header
در موبایل:
Logo Menuدر Desktop:
Logo NavigationHero
در موبایل:
Title
Description
Button
Imageدر Desktop:
Title + Description + Button ImageCategories
در موبایل:
2 columnsدر دسکتاپ:
4 columnsProducts
در موبایل:
1 columnدر Tablet:
2 columnsدر Desktop:
3 columnsFooter
در موبایل:
1 columnدر Tablet:
2 columnsدر Desktop:
4 columnsسعی کنید از Utilityهایی که در مقالات قبلی یاد گرفتهاید استفاده کنید و تا حد امکان از CSS سفارشی استفاده نکنید.
جمعبندی
در این مقاله یک قدم عملیتر برداشتیم و دیدیم چگونه میتوان یک صفحه Responsive واقعی با Tailwind CSS ایجاد کرد.
مفاهیم مختلف را با یکدیگر ترکیب کردیم:
Container
+
Flexbox
+
Grid
+
Spacing
+
Typography
+
Breakpoints
=
Responsive Pageیاد گرفتیم:
ابتدا Layout موبایل را طراحی کنیم.
با Breakpointها Layout را برای صفحات بزرگتر تغییر دهیم.
از
flex-col md:flex-rowبرای تغییر جهت Layout استفاده کنیم.از
grid-cols-1 sm:grid-cols-2 lg:grid-cols-3برای Product Grid استفاده کنیم.Header را برای موبایل و دسکتاپ متفاوت طراحی کنیم.
Footer را به صورت Responsive ایجاد کنیم.
Typography و Spacing را نیز Responsive کنیم.
از
max-w-*برای کنترل عرض محتوا استفاده کنیم.صفحه را در اندازههای مختلف تست کنیم.
اکنون شما ابزارهای اصلی لازم برای ساخت Layoutهای Responsive با Tailwind CSS را در اختیار دارید.
نظرات
هنوز نظری ثبت نشده است.