وقتی صحبت از طراحی وب مدرن میشود، دیگر نمیتوان با همان روشهای قدیمیِ جدولها یا حتی فقط Flexbox همه نیازها را پوشش داد. پروژههای امروزی، از داشبوردهای پیچیده گرفته تا وبسایتهای خبری چندبخشی، به ساختارهایی نیاز دارند که هم انعطافپذیر باشند و هم قابل کنترل در جزئیات. اینجاست که CSS Grid وارد میشود.
CSS Grid یک سیستم چیدمان دوبعدی است؛ یعنی برخلاف Flexbox که بیشتر برای یک بعد (افقی یا عمودی) طراحی شده، Grid به شما امکان میدهد همزمان ستونها و ردیفها را مدیریت کنید. نتیجه؟ شما میتوانید ساختارهای پیچیده را بدون ترفندهای اضافی یا کدهای غیرضروری بسازید.
پس در نتیجه:
- Grid به شما اجازه میدهد صفحه را به شبکهای از سلولها تقسیم کنید.
- هر عنصر میتواند دقیقاً در جای مشخصی از این شبکه قرار گیرد.
- شما کنترل کامل روی اندازه، فاصله، و حتی رفتار واکنشگرا دارید.
به زبان ساده، CSS Grid همان چیزی است که طراحان سالها دنبالش بودند: روشی استاندارد و قدرتمند برای ساخت Layoutهای پیچیده.
مفاهیم پایه در CSS Grid
برای اینکه بتوانیم از Grid بهدرستی استفاده کنیم، باید ابتدا زبان مخصوص آن را یاد بگیریم. Grid مثل یک نقشه شهری است: خیابانها (خطوط)، بلوکها (سلولها)، و محلهها (ناحیهها). اگر این نقشه را نشناسیم، حرکت در آن بیهدف خواهد بود.
Grid Container و Grid Item
- Container: عنصری که با
display: gridتعریف میشود و کل شبکه را در خود نگه میدارد. - Item: هر عنصر فرزند داخل Container که در یکی از خانههای شبکه قرار میگیرد.
خطوط، سلولها و ناحیهها
- Grid Lines: خطوط عمودی و افقی که شبکه را میسازند.
- Grid Cells: کوچکترین واحد شبکه؛ مثل یک خانه در جدول.
- Grid Areas: مجموعهای از سلولها که میتوانند یک بخش بزرگتر مثل هدر یا سایدبار را تشکیل دهند.
واحدهای اندازهگیری اختصاصی
Grid واحدهای خاصی دارد که طراحی را منعطف میکنند:
- fr: واحدی برای تقسیم فضای آزاد. مثلاً
1fr 2frیعنی ستون دوم دو برابر ستون اول فضا بگیرد. - auto: اندازه ستون یا ردیف بر اساس محتوای داخل آن تعیین میشود.
- minmax(): ترکیبی هوشمند برای مشخص کردن حداقل و حداکثر اندازه.
- واحدهای کلاسیک مثل px و % همچنان قابل استفاده هستند.
شروع کار با CSS Grid
حالا که مفاهیم پایه را شناختیم، وقت آن است وارد عمل شویم. اولین قدم برای استفاده از Grid این است که یک عنصر را به Grid Container تبدیل کنیم. کافی است در CSS بنویسیم:
.container {
display: grid;
}
از همین لحظه، تمام فرزندان این عنصر بهعنوان Grid Item شناخته میشوند و میتوانند در شبکهای که تعریف میکنیم قرار بگیرند.
تعریف ستونها و ردیفها
برای مشخص کردن ساختار شبکه، از دو ویژگی کلیدی استفاده میکنیم:
.container {
display: grid;
grid-template-columns: 200px 1fr 1fr;
grid-template-rows: 100px auto;
}
grid-template-columns: ستونها را تعریف میکند. در مثال بالا، ستون اول ثابت (200px) است و دو ستون بعدی با واحد fr فضای باقیمانده را تقسیم میکنند.grid-template-rows: ردیفها را مشخص میکند. ردیف اول 100px ارتفاع دارد و ردیف دوم بسته به محتوای داخلش کشیده میشود.
فاصلهها (Gaps)
یکی از مزیتهای Grid این است که فاصله بین ستونها و ردیفها را بهسادگی میتوان کنترل کرد:
.container {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
gap: 20px;
}
gap: فاصله بین همه سلولها را تعیین میکند.- میتوان جداگانه هم نوشت:
row-gapوcolumn-gap.
نکته کلیدی: برخلاف روشهای قدیمی که مجبور بودیم برای فاصله از margin یا padding استفاده کنیم، Grid فاصلهها را بهصورت داخلی مدیریت میکند و این باعث میشود Layout تمیزتر و قابل پیشبینیتر باشد.
جایگذاری آیتمها در Grid
تا اینجا یاد گرفتیم چطور ستونها و ردیفها را تعریف کنیم. حالا باید ببینیم چطور میتوانیم عناصر را دقیقاً در جای دلخواه قرار دهیم. این بخش همان جایی است که Grid قدرت واقعیاش را نشان میدهد.
استفاده از grid-column و grid-row
هر آیتم میتواند با این دو ویژگی در شبکه جایگذاری شود:
.item1 {
grid-column: 1 / 3; /* از ستون اول تا سوم */
grid-row: 1 / 2; /* فقط در ردیف اول */
}
grid-column: start / end: مشخص میکند آیتم از کدام خط شروع شود و تا کدام خط ادامه پیدا کند.grid-row: start / end: همین مفهوم برای ردیفها.
مفهوم span
گاهی نمیخواهیم شماره خط پایان را مشخص کنیم، بلکه میخواهیم آیتم چند ستون یا چند ردیف را بگیرد:
.item2 {
grid-column: span 2; /* دو ستون را اشغال کند */
grid-row: span 3; /* سه ردیف را اشغال کند */
}
این روش برای ساخت بخشهایی مثل هدر یا سایدبار بسیار کاربردی است.
تعریف ناحیهها با grid-template-areas
اگر بخواهیم Layout را خواناتر کنیم، میتوانیم ناحیهها را با اسم مشخص کنیم:
.container {
display: grid;
grid-template-columns: 1fr 2fr;
grid-template-rows: 80px auto;
grid-template-areas:
"header header"
"sidebar main";
}
.header { grid-area: header; }
.sidebar { grid-area: sidebar; }
.main { grid-area: main; }
این روش باعث میشود Layout مثل یک نقشه متنی ساده شود و خواندن آن راحتتر باشد.
ویژگیهای پیشرفته در CSS Grid
تا اینجا با اصول پایه و جایگذاری آیتمها آشنا شدیم. حالا وقت آن است که سراغ قابلیتهای پیشرفته برویم؛ همان بخشهایی که Grid را از یک ابزار ساده به یک سیستم قدرتمند برای طراحی Layoutهای پیچیده تبدیل میکنند.
Auto-placement (جایگذاری خودکار)
اگر برای آیتمها موقعیت مشخص نکنید، Grid آنها را بهصورت خودکار در اولین سلولهای خالی قرار میدهد. این ویژگی باعث میشود بدون نوشتن کد اضافه، عناصر بهطور منظم در شبکه جای بگیرند.
.container {
display: grid;
grid-template-columns: repeat(3, 1fr);
}
در این مثال، هر آیتم به ترتیب در ستونها و ردیفها قرار میگیرد.
Explicit vs Implicit Grid
- Explicit Grid: شبکهای که شما با
grid-template-columnsوgrid-template-rowsتعریف کردهاید. - Implicit Grid: اگر آیتمها بیشتر از شبکه تعریفشده باشند، Grid بهطور خودکار ردیفها یا ستونهای جدید ایجاد میکند. میتوانید اندازه این بخشهای ضمنی را با
grid-auto-rowsیاgrid-auto-columnsکنترل کنید.
.container {
display: grid;
grid-template-columns: 1fr 1fr;
grid-auto-rows: 150px;
}
minmax() برای واکنشگرایی
یکی از قدرتمندترین ابزارهای Grid است. با آن میتوانید حداقل و حداکثر اندازه یک ستون یا ردیف را مشخص کنید:
.container {
display: grid;
grid-template-columns: repeat(3, minmax(200px, 1fr));
}
این یعنی هر ستون حداقل 200px باشد، اما اگر فضای بیشتری وجود داشت، تا یک سهم از فضای آزاد بزرگ شود.
auto-fit و auto-fill
این دو ویژگی برای ساخت Layoutهای واکنشگرا عالی هستند:
- auto-fill: ستونها را تا جایی که جا شود پر میکند، حتی اگر خالی بمانند.
- auto-fit: ستونها را تا جایی که جا شود پر میکند، اما ستونهای خالی را جمع میکند تا فضای آزاد بین ستونهای موجود تقسیم شود.
.container {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
}
مثالهای عملی با CSS Grid
ساخت یک Layout ساده وبلاگ
کد:
.container {
display: grid;
grid-template-columns: 1fr 300px;
grid-template-rows: 80px auto 60px;
grid-template-areas:
"header header"
"main sidebar"
"footer footer";
gap: 20px;
}
.header { grid-area: header; }
.main { grid-area: main; }
.sidebar { grid-area: sidebar; }
.footer { grid-area: footer; }
توضیح: در این مثال، ما یک صفحه وبلاگ کلاسیک با چهار بخش اصلی طراحی کردهایم: هدر در بالا، محتوای اصلی در سمت چپ، سایدبار در سمت راست و فوتر در پایین. استفاده از grid-template-areas باعث میشود ساختار صفحه مثل یک نقشه متنی ساده خوانده شود و جایگذاری عناصر کاملاً واضح باشد.
این روش نهتنها خوانایی کد را بالا میبرد، بلکه تغییر یا بازطراحی Layout را هم آسان میکند. کافی است نام ناحیهها را جابهجا کنید تا ساختار صفحه تغییر کند، بدون اینکه نیاز به تغییرات سنگین در CSS داشته باشید.
طراحی یک داشبورد
کد:
.dashboard {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 20px;
}
.card {
background: #f5f5f5;
padding: 20px;
}
توضیح: داشبوردها معمولاً شامل چندین کارت اطلاعاتی هستند که باید در صفحه بهطور منظم و واکنشگرا نمایش داده شوند. در این مثال، هر کارت بهطور خودکار در ستونها قرار میگیرد و اندازه آنها با توجه به فضای صفحه تغییر میکند.
ویژگی auto-fit همراه با minmax() باعث میشود کارتها در صفحههای بزرگ بهصورت چندستونه نمایش داده شوند و در صفحههای کوچکتر بهصورت تکستونه در زیر هم قرار بگیرند. این یعنی بدون نوشتن Media Queryهای اضافی، داشبورد شما کاملاً واکنشگرا خواهد بود.
ساخت گالری تصاویر واکنشگرا
کد:
.gallery {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
gap: 10px;
}
.gallery img {
width: 100%;
height: auto;
display: block;
}
توضیح: گالری تصاویر یکی از بهترین مثالها برای قدرت Grid است. در این نمونه، تصاویر بهطور خودکار در ستونها قرار میگیرند و فاصله بین آنها با gap مدیریت میشود. هر تصویر عرض ستون خود را پر میکند و بهصورت واکنشگرا تغییر اندازه میدهد.
ویژگی auto-fill تضمین میکند که ستونها تا جای ممکن پر شوند، حتی اگر برخی سلولها خالی بمانند. این باعث میشود گالری در صفحههای بزرگ بهصورت چندستونه و در صفحههای کوچک بهصورت تکستونه نمایش داده شود، بدون نیاز به کدنویسی اضافی.

مقایسه CSS Grid با Flexbox
وقتی صحبت از چیدمان در CSS میشود، دو ابزار اصلی در اختیار داریم: Flexbox و Grid. هر دو برای مدیریت ساختار صفحه طراحی شدهاند، اما فلسفه و کاربردشان متفاوت است. Flexbox بیشتر برای چیدمان یکبعدی (افقی یا عمودی) ساخته شده، در حالی که Grid از ابتدا برای چیدمان دوبعدی (ستون و ردیف همزمان) طراحی شده است.
تمرکز بر یکبعدی در Flexbox
Flexbox زمانی عالی عمل میکند که بخواهید عناصر را در یک خط مرتب کنید: مثلاً منوی ناوبری، دکمهها یا کارتهایی که باید در یک ردیف یا ستون قرار بگیرند. ویژگیهایی مثل justify-content و align-items کنترل دقیقی روی نحوه توزیع و ترازبندی عناصر میدهند. اما وقتی ساختار صفحه پیچیدهتر میشود و نیاز به مدیریت همزمان ستونها و ردیفها داریم، Flexbox بهتنهایی کافی نیست و معمولاً مجبور میشویم از ترفندهای اضافی استفاده کنیم.
قدرت دوبعدی در Grid
Grid به شما امکان میدهد همزمان ستونها و ردیفها را تعریف کنید و عناصر را دقیقاً در مختصات دلخواه قرار دهید. این یعنی میتوانید یک Layout کامل شامل هدر، سایدبار، محتوای اصلی و فوتر را تنها با چند خط کد بسازید. ویژگیهایی مثل grid-template-areas یا minmax() طراحی را خواناتر و واکنشگرا میکنند، چیزی که در Flexbox دستیابی به آن دشوارتر است.
ترکیب Flexbox و Grid
نکته مهم این است که Grid و Flexbox رقیب هم نیستند، بلکه مکملاند. در بسیاری از پروژهها، Grid برای ساختار کلی صفحه استفاده میشود و Flexbox برای مدیریت جزئیات داخل هر بخش. مثلاً میتوانید کل Layout را با Grid بسازید و سپس آیتمهای داخل یک کارت یا منو را با Flexbox مرتب کنید. این ترکیب بهترین نتیجه را میدهد: کنترل دوبعدی در سطح بالا و انعطاف یکبعدی در سطح جزئیات.
جدول مقایسه CSS Grid و Flexbox
| ویژگی | CSS Grid | Flexbox |
|---|---|---|
| نوع چیدمان | دوبعدی (ستون و ردیف همزمان) | یکبعدی (فقط افقی یا عمودی) |
| کنترل جایگذاری | امکان تعیین دقیق موقعیت آیتمها با grid-row و grid-column |
آیتمها به ترتیب در خط اصلی قرار میگیرند؛ کنترل موقعیت محدودتر است |
| ساختار کلی صفحه | مناسب برای Layoutهای پیچیده مثل وبلاگ، داشبورد یا گالری | بیشتر برای چیدمان جزئیات داخل یک بخش یا خط |
| واحدهای اندازهگیری | پشتیبانی از واحدهای اختصاصی مثل fr, minmax(), auto-fit |
بیشتر وابسته به واحدهای کلاسیک مثل px, % و انعطاف با flex-grow |
| واکنشگرایی | سادهتر و قدرتمندتر؛ بدون نیاز به Media Queryهای زیاد | نیازمند Media Query یا تنظیمات دستی برای ساختارهای پیچیده |
| خوانایی کد | امکان تعریف ناحیهها با grid-template-areas → کد شفافتر |
ساختار خطی؛ برای Layoutهای بزرگ خوانایی کمتر دارد |
| ترکیب با دیگری | معمولاً برای ساختار کلی صفحه استفاده میشود | معمولاً برای جزئیات داخلی هر بخش استفاده میشود |
جمعبندی
CSS Grid امروز بهعنوان ستون اصلی طراحی Layoutهای مدرن شناخته میشود. این سیستم با فراهم کردن امکان مدیریت همزمان ستونها و ردیفها، طراحی دوبعدی را ساده و قدرتمند کرده است. در طول مطلب دیدیم که Grid چگونه با مفاهیم پایه مثل Container و Item شروع میشود، سپس با ویژگیهای پیشرفتهای مانند minmax() ،auto-fit و grid-template-areas به ابزاری انعطافپذیر برای ساخت Layoutهای پیچیده و واکنشگرا تبدیل میشود. مثالهای عملی از وبلاگها، داشبوردها و گالریها نشان دادند که Grid نهتنها برای پروژههای بزرگ، بلکه برای ساختارهای روزمره نیز بهترین انتخاب است.
در حال دریافت نظرات از سرور، لطفا منتظر بمانید
در حال دریافت نظرات از سرور، لطفا منتظر بمانید