طراحی Layout در CSS مسیر طولانی و پرفرازونشیبی را پشت سر گذاشته است. در گذشته برای پیادهسازی ساختار صفحات وب با مشکلاتی مانند float و clearfix مواجه بودیم، اما امروزه دو سیستم قدرتمند مستقیماً در هسته CSS در اختیار ما قرار دارند: Flexbox و Grid. این دو ابزار جایگزین روشهای قدیمیتر شدهاند و با ارائه ساختاری تمیز، انعطافپذیر و مقیاسپذیر، فرآیند طراحی رابطهای ریسپانسیو را بسیار سادهتر کردهاند. در همین راستا، مقایسه Flexbox و Grid یکی از موضوعات کلیدی در طراحی مدرن به شمار میآید.
CSS Flexbox برای layoutبندی یکبُعدی طراحی شده است؛ یعنی زمانی که نیاز داریم عناصر را در یک ردیف یا ستون مرتب و فاصلهگذاری کنیم. این ویژگی، Flexbox را به گزینهای مناسب برای پیادهسازی کامپوننتهای رابط کاربری و layoutبندیهای کوچک تبدیل میکند. در مقابل، CSS Grid با قابلیت layoutبندی دوبُعدی، امکان طراحی ساختارهای پیچیده و تمامصفحه را فراهم میسازد.
در این مقاله بهطور شفاف بررسی میکنیم که چه زمانی باید از Flexbox استفاده کرد، چه زمانی Grid انتخاب بهتری است و چگونه ترکیب این دو میتواند به تولید کدی تمیزتر و مقیاسپذیرتر منجر شود.
CSS Flexbox که نخستینبار در سال ۲۰۰۹ معرفی شد، یک سیستم قدرتمند layoutبندی یکبعدی است که به توسعهدهندگان کمک میکند صفحات وب ریسپانسیو طراحی کرده و عناصر را بهسادگی سازماندهی کنند. این روش خیلی زود به استاندارد اصلی در طراحی مدرن تبدیل شد، زیرا نیاز به ترفندهای دشوار و ناکارآمدی مانند float یا positioning را برطرف ساخت.
Flexbox امکان چیدمان عناصر در یک ردیف یا ستون را فراهم کرده و کنترل دقیقی روی فاصله، ترازبندی و ترتیب عناصر درون یک کانتینر ارائه میدهد.
پیش از آنکه بررسی کنیم در چه شرایطی باید از Flexbox و در چه شرایطی از Grid استفاده کنیم، بهتر است ویژگیهای اصلی آنها را مرور کنیم؛ ویژگیهایی که مبنای مقایسه Flexbox و Grid را تشکیل میدهند.
بهعنوان مثال، فرض کنید در کد HTML یک <div> داریم که نقش کانتینر را برای سه عنصر child ایفا میکند. کافی است ویژگی display: flex را به آن اضافه کنیم تا کانتینر به یک flex container تبدیل شود. در این حالت تمام عناصری که داخل کانتینر قرار دارند، به flex item تبدیل میشوند.
کد مربوطه به شکل زیر خواهد بود:
<div class="container">
<div id="one">1</div>
<div id="two">2</div>
<div id="three">3</div>
</div>
.container{
display: flex;
}
در یک flex container میتوانیم جهت نمایش آیتمها را تعیین کنیم. رایجترین مقادیر برای ویژگی flex-direction عبارتند از: row و column.
کد CSS متناظر این حالتها به شکل زیر خواهد بود:
.container{
flex-direction: row | column;
}
در برخی مواقع میتوان مقدار flex-direction را روی row-reverse یا column-reverse قرار داد. نکته کلیدی در این خصوص، مفهوم محورها است.
بسته به مقداری که انتخاب میکنیم، دو محور اصلی و فرعی تعریف میشوند. اگر مقدار flex-direction برابر با row باشد، محور اصلی افقی و محور فرعی عمودی خواهد بود. در حالت column این شرایط برعکس میشود.
بهصورت پیشفرض، آیتمهای یک flex container تلاش میکنند در یک خط قرار بگیرند. اما با استفاده از ویژگی flex-wrap میتوان آنها را مجبور کرد در چند خط بشکنند.
.container{
flex-wrap: wrap | nowrap| wrap-reverse;
}
البته باید توجه داشت که زمانی که آیتمها به خط بعدی منتقل میشوند، یک خط flex جدید در زیر خط قبلی تشکیل میشود و این مسئله باعث میشود ترازبندی آنها دقیقاً مشابه آیتمهای خط بالایی نباشد.
Flexbox ویژگیهای متعددی دارد که امکان کنترل دقیق عناصر را فراهم میسازد. این ویژگیها از جمله تغییر ترتیب عناصر، معکوسسازی ترتیب، یا تعیین میزان رشد و کوچکشدن آیتمها هستند. این موضوع در بحث مقایسه Flexbox و Grid اهمیت ویژهای دارد، زیرا انعطافپذیری Flexbox در ترازبندی، آن را برای لایهبندیهای کوچک بسیار کارآمد میکند.
برای مثال، فرض کنید container ما اکنون چهار المان با عرض و ارتفاع یکسان دارد:
<div id="container"> <div id="one">1</div> <div id="two">2</div> <div id="three">3</div> <div id="four">4</div> </div>
در CSS، ویژگی align-self امکان ترازبندی مستقل هر آیتم را درون کانتینر فراهم میکند. بدین ترتیب میتوان برای هر عنصر ترازبندی متفاوتی نسبت به دیگر عناصر تعیین کرد.
#one{
align-self: flex-start | flex-end | center | stretch
}
از سوی دیگر، ویژگی justify-content این امکان را میدهد که همه آیتمها بهطور یکپارچه در کانتینر تراز شوند. این ویژگیها نشان میدهند مدیریت بخشهای کوچک لایهبندی در Flexbox تا چه اندازه ساده و کارآمد است. به عنوان مثال، فرض کنید بهجای چهار، دوباره سه آیتم در کانتینر داشته باشیم:
.container{
justify-content: flex-start | flex-end | center | space-between | space-around
}
همانطور که میبینیم، ترازبندی محتوا درون flex containerها بسیار ساده است؛ چه زمانی که بخواهیم آیتمها را بهصورت مستقل مدیریت کنیم، چه زمانی که بخواهیم همه را با هم تراز کنیم. ویژگیهایی که تاکنون بررسی کردیم تنها بخشی از امکانات Flexbox هستند و نشان میدهند مدیریت بخشهای کوچک لایهبندی تا چه اندازه ساده است.
در حالی که Flexbox سیستمی یکبعدی برای مدیریت ردیفها یا ستونها محسوب میشود، CSS Grid سطح جدیدی از طراحی را ارائه میدهد؛ زیرا یک سیستم دوبعدی کامل است. به بیان دیگر، Grid امکان کار همزمان با ردیفها و ستونها را فراهم کرده و به همین دلیل، به قدرتمندترین ابزار layoutبندی در CSS امروزی تبدیل شده است.
Grid این امکان را میدهد که طراحیهای پیچیده، سازمانیافته و ریسپانسیو ایجاد کنیم؛ بدون آنکه مجبور باشیم به روشهای قدیمی و ناکارآمد متوسل شویم. این ویژگیها باعث میشوند Grid انتخابی ایدهآل برای طراحی ساختارهای مقاوم و کنترلشده بر روی هر دو محور باشد. به همین ترتیب، در مقایسه Flexbox و Grid، Grid بهطور ویژه برای لایهبندیهای پیچیده و تمامصفحه توصیه میشود.
بیایید از قطعه کد HTML زیر استفاده کنیم و ببینیم چطور میتوانیم یک لایهبندی Grid ایجاد کنیم:
<div class="container"> <div id="one">1</div> <div id="two">2</div> <div id="three">3</div> <div id="four">4</div> <div id="five">5</div> </div>
برای تعریف یک grid container کافی است ویژگی display: grid را به عنصر بلاک خود اعمال کنیم. از این لحظه، عنصر ما به یک Grid تبدیل میشود و باید مشخص کنیم چه تعداد ردیف و ستون در نظر داریم.
برای ایجاد ردیفها و ستونها، از ویژگیهای grid-template-rows و grid-template-columns استفاده میکنیم و مقادیری را به آنها اختصاص میدهیم تا تعیین شود آیتمها چگونه در کانتینر توزیع شوند.
grid-template-columns: 60px 60px; grid-template-rows: auto;
بر اساس مثال بالا، layout ما شامل دو ستون خواهد بود که هر کدام ۶۰ پیکسل از کانتینر را اشغال میکنند. از آنجا که پنج المنت داریم، سه ردیف نیز بهطور خودکار ایجاد میشود و کل کانتینر را پر میکند (با استفاده از مقدار auto).
Grid نیز مانند Flexbox قابلیتهای متنوعی برای ترازبندی عناصر دارد. یکی از این ویژگیها، justify-self است که یک آیتم Grid را درون سلولش و در راستای محور افقی تراز میکند. این ویژگی در بحث مقایسه Flexbox و Grid اهمیت ویژهای دارد، زیرا نشان میدهد Grid امکان کنترل دقیقتری بر ترازبندی هر عنصر بهصورت مستقل ارائه میدهد.
#one{
justify-self: start | end | center | stretch
}
البته justify-self تنها یکی از ویژگیهای ترازبندی در Grid است. از دیگر ویژگیها میتوان به justify-content، justify-items، align-items و align-self اشاره کرد. همانطور که مشاهده میکنیم، Grid انعطافپذیری بیشتری برای ترازبندی و ساخت طراحیهای پیچیده در اختیار ما قرار میدهد.
با وجود تفاوتهای زیاد میان Flexbox و CSS Grid، این دو سیستم شباهتهای مهمی نیز دارند. نقطه مشترک اصلی آنها هدفی است که دنبال میکنند: جایگزینی تکنیکهای قدیمی و پرهزینهای مانند float و positioning hacks. امروزه هر دو ابزار، فرآیند ساخت layoutهای ریسپانسیو و پیچیده را بسیار سادهتر و شهودیتر کردهاند.
هر دو سیستم از ویژگیهای کلیدی ترازبندی پشتیبانی میکنند که به ما امکان کنترل موقعیت آیتمها را در کانتینر میدهند، از جمله:
justify-content: ترازبندی آیتمها در راستای محور اصلی (در Flexbox: افقی در حالت row، در Grid: بهطور پیشفرض افقی)align-content: مدیریت فاصله بین ردیفها یا ستونها هنگام وجود فضای اضافهalign-items: ترازبندی همه آیتمها درون کانتینر روی محور فرعی (در Flexbox: عمودی در حالت row)align-self: امکان بازنویسی تنظیمات ترازبندی کانتینر برای هر آیتم بهصورت مستقلاین ویژگیهای مشترک موجب ایجاد یکپارچگی میان Flexbox و Grid میشوند و جابهجایی بین آنها را بر اساس نیاز layout سادهتر میسازند.
زمانی که Flexbox معرفی شد، بسیاری تصور میکردند بهترین سیستم layoutبندی برای وب خواهد بود؛ اما واقعیت این بود که Flexbox بهعنوان یک سیستم یکبعدی، برای طراحیهای پیچیده کافی نیست.
Flexbox کمک کرد تا اپلیکیشنهای وب ریسپانسیو و قابل نگهداری طراحی شوند، اما زمانی که نیاز به layout دوبعدی داشتیم، محدودیتهای آن آشکار شد. در این مرحله CSS Grid وارد میدان شد تا با امکان مدیریت همزمان ردیفها و ستونها، طراحیهای پیچیدهتر را بهسادگی امکانپذیر کند.
بهترین رویکرد در مقایسه Flexbox و Grid این است که هر دو ابزار را برای اهداف متفاوت بهکار بگیریم:
در عمل، یادگیری اصول Flexbox پیشنیاز استفاده مؤثر از Grid است؛ زیرا هر زمان به ترازبندی عناصر نیاز داشته باشیم، Flexbox بهترین انتخاب خواهد بود.
display: flex تعریف کرده و مقدار flex-direction مورد نظر را مشخص کنیم.البته میتوان کل اپلیکیشن را صرفاً با Flexbox پیادهسازی کرد و نتایجی مشابه Grid گرفت. اما برای داشتن کدی تمیزتر، مقیاسپذیرتر و قابل نگهداری در بلند مدت، ایدهآلترین روش این است که ساختار layoutبندی با Grid و ترازبندی عناصر با Flexbox انجام شود.
grid-column و grid-row استفاده کنیم. در Flexbox، این کار نیازمند ترفندهایی مانند margin، transform یا absolute positioning است.باید این نکته را به یاد داشته باشیم: CSS Grid برای layoutبندی است؛ Flexbox برای ترازبندی.
flex یک ویژگی کوتاهنویسی در CSS برای آیتمهای Flex است، در حالی که Flexbox به کل مدل layoutبندی آن اشاره دارد.grid-template-rows و grid-template-columns که امکان تعریف اندازه ثابت، انعطافپذیر یا خودکار را میدهند.fr و minmax() بهخوبی کار میکند و layoutبندیهای ریسپانسیو ایجاد میکند.Flexbox و CSS Grid بهعنوان دو سیستم اصلی در طراحی layout با CSS، هر کدام نقش ویژهای دارند.
این دو ابزار جایگزین یکدیگر نیستند، بلکه مکمل هم محسوب میشوند. استفاده صحیح و ترکیبی از آنها میتواند انعطافپذیری بیشتری در طراحی ایجاد کرده، فرآیند توسعه را تسهیل کند و نگهداری کدها را سادهتر سازد.
در نهایت، تسلط بر Flexbox و CSS Grid یکی از مهارتهای کلیدی هر توسعهدهنده فرانتاند است و نقش مهمی در ساخت رابطهای کاربری مدرن، ریسپانسیو و بهینه ایفا میکند.