آموزش

Flexbox یا Grid؟ کِی از کدام در CSS استفاده کنیم

هر دو چیدمان می‌سازند، ولی یکی‌شان فقط یک ردیف یا یک ستون را می‌فهمد و دیگری کل جدول را با هم.

تحریریه‌ی دینا کد
نویسنده
۳ دقیقه مطالعه۰ بازدید
اشتراک گذاری۰

جواب کوتاه: اگر چیدمانتان یک ردیف یا یک ستون است — یک نوار دکمه، یک منوی افقی — flexbox بگیرید. اگر هم‌زمان به ردیف و ستون نیاز دارید — یک گرید کارت، یک صفحه با هدر/سایدبار/محتوا — grid بگیرید. فلکس‌باکس یک‌بعدی فکر می‌کند، گرید دوبعدی.

فلکس‌باکس: هر آیتم عرض خودش را می‌آورد

css.row { display: flex; flex-wrap: wrap; gap: 8px; }

با پنج آیتم با عرض‌های ۱۲۰، ۲۰۰، ۱۵۰، ۱۰۰ و ۱۸۰ پیکسل، flex-wrap: wrap وقتی جا کم بیاید به ردیف بعد می‌رود — ولی هیچ تضمینی نیست آیتم‌های ردیف دوم زیر همان نقطه‌ی آیتم‌های ردیف اول بایستند. فلکس‌باکس فقط داخل یک ردیف چیدمان می‌کند؛ ردیف‌ها از دید هم بی‌خبرند.

گرید: همه‌ی ردیف‌ها یک جدول را می‌بینند

css.grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; }

با همان پنج آیتم، grid-template-columns از قبل سه ستون هم‌عرض تعریف می‌کند و هر آیتم — مهم نیست محتوایش چقدر باشد — دقیقاً در همان ستون می‌نشیند. ردیف دوم زیر ردیف اول، ستون‌به‌ستون هم‌تراز است؛ چیزی که فلکس‌باکس اصلاً بلد نیست بدهد.

minmax، همان چیزی است که «ریسپانسیو بدون media query» را می‌سازد

css.grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
  gap: 8px;
}

auto-fill هر چند ستون که با عرض حداقل ۲۰۰ پیکسل جا می‌شود می‌گذارد، و 1fr باقی‌مانده‌ی فضا را بین همان ستون‌ها پخش می‌کند. با تغییر عرض صفحه، تعداد ستون‌ها خودش عوض می‌شود — بدون یک خط @media.

این دو رقیب هم نیستند

اکثر صفحات واقعی از هر دو استفاده می‌کنند: grid برای اسکلت کلی صفحه (هدر، سایدبار، محتوا، فوتر)، و flexbox داخل هر بخش برای چیدمان یک ردیف از آیتم‌ها (مثلاً دکمه‌های داخل یک تولبار). سؤال درست «کدام یکی؟» نیست، «این بخش خاص، یک‌بعدی است یا دوبعدی؟»

قانون عملی

نیاز انتخاب
یک ردیف یا ستون از آیتم‌ها flex
چیدمانی که هم‌زمان ردیف و ستون مهم است grid
تعداد ستون‌ها باید با عرض صفحه خودش عوض شود grid با auto-fill + minmax

وسط‌چین‌کردن، جایی که فرقشان کمتر به چشم می‌آید

css.flex-center { display: flex; align-items: center; justify-content: center; }
.grid-center { display: grid; place-items: center; }

برای وسط‌چین‌کردن یک آیتم داخل والدش، هر دو یک نتیجه می‌دهند — فقط grid با place-items: center در یک خط همان کاری را می‌کند که flex با دو خاصیت جدا (align-items برای عمودی، justify-content برای افقی). این یکی از معدود جاهایی است که واقعاً فرقی نمی‌کند کدام را انتخاب کنید؛ هر دو خوانا و هر دو درست‌اند.

اگر می‌خواهید HTML و CSS را از صفر و با پروژه‌ی واقعی تمرین کنید، دوره‌ی HTML و CSS همین دو ابزار چیدمان را کنار هم و با مثال واقعی جا می‌اندازد.

تحریریه‌ی دینا کد
نویسنده

نظرها

اولین نفری باشید که نظر می‌دهد
برای ثبت نظر وارد شوید

سؤالتان را بپرسید یا تجربه‌تان را بنویسید — نویسنده‌ی مطلب پاسخ می‌دهد.

مطالب مرتبط

از همین دسته
آموزش

چرا Rust به‌جای segfault، خطای کامپایل می‌دهد

در C یا ++C یک اشاره‌گر نامعتبر معمولاً ماه‌ها بعد، در پروداکشن، خودش را نشان می‌دهد. در Rust همان اشتباه، همان لحظه‌ی کامپایل متوقفت می‌کند.

تحریریه‌ی دینا کد۵ دقیقه