درس ۱۰: Flexbox و Grid
یادگیری Flexbox و CSS Grid برای طراحی layout های مدرن
مقدمهای بر Layout های مدرن
قبل از Flexbox و Grid، طراحی layout در CSS کار پیچیدهای بود که نیاز به استفاده از float، position و table داشت. امروزه Flexbox و CSS Grid دو ابزار قدرتمند برای ایجاد layout های انعطافپذیر و واکنشگرا هستند.
تفاوت Flexbox و Grid:
- Flexbox: برای layout های یکبعدی (ردیف یا ستون)
- Grid: برای layout های دوبعدی (ردیف و ستون همزمان)
- Flexbox: مناسب برای کامپوننتها و عناصر کوچک
- Grid: مناسب برای layout کلی صفحه
- هر دو: کاملاً واکنشگرا و انعطافپذیر
Flexbox - مفاهیم پایه
Flexbox یا Flexible Box Layout مدلی برای چیدمان عناصر در یک بعد است که کنترل بهتری بر توزیع فضا و تراز عناصر ارائه میدهد.
مفاهیم کلیدی:
- Flex Container: عنصر والد که display: flex دارد
- Flex Items: فرزندان مستقیم flex container
- Main Axis: محور اصلی (پیشفرض افقی)
- Cross Axis: محور عمودی بر main axis
ایجاد Flex Container:
.container {
display: flex; /* یا inline-flex */
}
ویژگیهای اصلی Container:
flex-direction
- جهت چیدمانflex-wrap
- شکستن خطjustify-content
- تراز در main axisalign-items
- تراز در cross axisalign-content
- تراز خطوط چندگانه
ویژگیهای Flex Container
flex-direction:
flex-direction: row; /* پیشفرض - چپ به راست */
flex-direction: row-reverse; /* راست به چپ */
flex-direction: column; /* بالا به پایین */
flex-direction: column-reverse; /* پایین به بالا */
flex-wrap:
flex-wrap: nowrap; /* پیشفرض - بدون شکستن */
flex-wrap: wrap; /* شکستن خط */
flex-wrap: wrap-reverse; /* شکستن معکوس */
justify-content (تراز افقی):
justify-content: flex-start; /* شروع */
justify-content: flex-end; /* انتها */
justify-content: center; /* وسط */
justify-content: space-between; /* فاصله بین */
justify-content: space-around; /* فاصله دور */
justify-content: space-evenly; /* فاصله یکسان */
align-items (تراز عمودی):
align-items: stretch; /* پیشفرض - کشیدن */
align-items: flex-start; /* بالا */
align-items: flex-end; /* پایین */
align-items: center; /* وسط */
align-items: baseline; /* خط پایه */
تمرین عملی: Flexbox و Grid
در ادامه، مثالی از استفاده Flexbox و Grid را مشاهده میکنید. کد را ویرایش کرده و تأثیرات مختلف را ببینید:
ویژگیهای Flex Items
عناصر درون flex container نیز ویژگیهای خاص خود را دارند:
flex-grow:
تعیین میکند عنصر چقدر رشد کند:
.item1 { flex-grow: 1; } /* رشد معمولی */
.item2 { flex-grow: 2; } /* دو برابر رشد */
.item3 { flex-grow: 0; } /* بدون رشد */
flex-shrink:
تعیین میکند عنصر چقدر کوچک شود:
.item { flex-shrink: 1; } /* پیشفرض */
.item { flex-shrink: 0; } /* بدون کوچک شدن */
flex-basis:
اندازه اولیه عنصر قبل از توزیع فضا:
.item { flex-basis: 200px; }
.item { flex-basis: 30%; }
.item { flex-basis: auto; }
flex (میانبر):
.item { flex: 1; } /* flex: 1 1 0% */
.item { flex: 0 0 200px; } /* grow shrink basis */
.item { flex: none; } /* 0 0 auto */
align-self:
تراز فردی برای یک عنصر:
.item { align-self: flex-start; }
.item { align-self: center; }
.item { align-self: flex-end; }
CSS Grid - مفاهیم پایه
CSS Grid Layout سیستمی دوبعدی برای طراحی layout است که امکان کنترل همزمان ردیفها و ستونها را فراهم میکند.
مفاهیم کلیدی:
- Grid Container: عنصر والد که display: grid دارد
- Grid Items: فرزندان مستقیم grid container
- Grid Lines: خطوط تقسیمکننده
- Grid Tracks: ردیفها و ستونها
- Grid Cells: خانههای تشکیل شده
- Grid Areas: مناطق تشکیل شده از چند خانه
ایجاد Grid Container:
.container {
display: grid; /* یا inline-grid */
}
تعریف Grid Template
grid-template-columns:
/* اندازههای ثابت */
grid-template-columns: 200px 200px 200px;
/* واحد fr (fraction) */
grid-template-columns: 1fr 2fr 1fr;
/* تکرار */
grid-template-columns: repeat(3, 1fr);
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
/* ترکیبی */
grid-template-columns: 200px 1fr 100px;
grid-template-rows:
grid-template-rows: 100px 200px 100px;
grid-template-rows: repeat(3, 1fr);
grid-template-rows: auto 1fr auto;
grid-gap (gap):
gap: 20px; /* همه جهات */
gap: 20px 30px; /* ردیف ستون */
row-gap: 20px; /* فاصله ردیف */
column-gap: 30px; /* فاصله ستون */
grid-template-areas:
grid-template-areas:
"header header header"
"sidebar main main"
"footer footer footer";
قرارگیری عناصر در Grid
با استفاده از خطوط:
.item {
grid-column-start: 1;
grid-column-end: 3;
grid-row-start: 1;
grid-row-end: 2;
}
/* میانبر */
.item {
grid-column: 1 / 3;
grid-row: 1 / 2;
}
/* span استفاده از */
.item {
grid-column: span 2;
grid-row: span 1;
}
با استفاده از نامها:
.header { grid-area: header; }
.sidebar { grid-area: sidebar; }
.main { grid-area: main; }
.footer { grid-area: footer; }
تراز در Grid:
/* تراز کل grid */
justify-content: center; /* افقی */
align-content: center; /* عمودی */
/* تراز عناصر */
justify-items: center; /* افقی */
align-items: center; /* عمودی */
/* تراز فردی */
justify-self: center; /* افقی */
align-self: center; /* عمودی */
Grid های واکنشگرا
auto-fit و auto-fill:
/* تطبیق خودکار */
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
/* پر کردن خودکار */
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
minmax():
/* حداقل 200px، حداکثر 1fr */
grid-template-columns: repeat(3, minmax(200px, 1fr));
/* ستون انعطافپذیر */
grid-template-columns: 200px minmax(300px, 1fr) 100px;
Grid با Media Queries:
.grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 2rem;
}
@media (max-width: 768px) {
.grid {
grid-template-columns: 1fr;
gap: 1rem;
}
}
ترکیب Flexbox و Grid
بهترین نتایج زمانی حاصل میشود که Flexbox و Grid را در کنار هم استفاده کنید:
استراتژی ترکیبی:
- Grid: برای layout کلی صفحه
- Flexbox: برای کامپوننتهای داخلی
- Grid: برای گالریها و کارتها
- Flexbox: برای نوار ناوبری و فرمها
مثال ترکیبی:
/* Layout کلی با Grid */
.page {
display: grid;
grid-template-areas:
"header"
"main"
"footer";
min-height: 100vh;
}
/* نوار ناوبری با Flexbox */
.navbar {
display: flex;
justify-content: space-between;
align-items: center;
}
/* کارتها با Grid */
.cards {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 2rem;
}
/* محتوای کارت با Flexbox */
.card {
display: flex;
flex-direction: column;
justify-content: space-between;
}
تمرینهای عملی
برای تسلط بیشتر بر مطالب این درس، تمرینهای زیر را انجام دهید:
تمرین ۱: نوار ناوبری
نوار ناوبری واکنشگرا با Flexbox ایجاد کنید که در موبایل به منوی همبرگری تبدیل شود.
تمرین ۲: گالری تصاویر
گالری تصاویری با Grid ایجاد کنید که تعداد ستونها بر اساس اندازه صفحه تغییر کند.
تمرین ۳: Layout صفحه
Layout کاملی برای یک وبسایت با header، sidebar، main و footer طراحی کنید.
تمرین ۴: کارتهای محصول
مجموعهای از کارتهای محصول که با Grid چیده شده و هر کارت با Flexbox طراحی شده باشد.
نکات مهم و بهترین شیوهها
بهترین شیوهها:
- از Grid برای layout کلی و Flexbox برای کامپوننتها استفاده کنید
- همیشه mobile-first طراحی کنید
- از minmax() برای انعطافپذیری استفاده کنید
- gap را ترجیح دهید به margin
- از نامگذاری معنادار برای grid areas استفاده کنید
نکات عملکرد:
- Grid و Flexbox عملکرد بهتری نسبت به float دارند
- از auto-fit/auto-fill برای بهینهسازی استفاده کنید
- تست در مرورگرهای مختلف انجام دهید
- از fallback برای مرورگرهای قدیمی استفاده کنید
اشتباهات رایج:
- استفاده نادرست از flex-grow و flex-shrink
- فراموش کردن gap در Grid
- عدم تست در اندازههای مختلف
- پیچیده کردن بیش از حد layout
- عدم استفاده از semantic HTML
ادامه یادگیری
تبریک! شما بخش CSS را به پایان رساندید. در ادامه با JavaScript و برنامهنویسی تعاملی آشنا خواهید شد.