CSS Flexbox در سال‌های اخیر به شدت میان توسعه دهنده‌های فرانت-اند محبوبیت پیدا کرده است. که البته این موضوع جای تعجب ندارد چرا که به طراحان قدرت مانور بالایی داده و ایجاد ساختارهای داینامیک را بسیار ساده‌تر کرده است.

با این حال، ما این روزها شاهد ظهور بازیگر جدیدی در این عرصه هستیم به نام CSS Grid که بسیاری از توانایی های Flexbox را در خود جای داده است. در بعضی ساختارها بهتر از Flexbox عمل کرده و در برخی Flexbox گزینه بهتری می‌باشد.

با این حال با ورود CSS Grid، توسعه دهنده‌ها گیج شده و نمی‌توانند بین این دو تکنولوژی یکی را انتخاب کنند.

در این مقاله ما به بررسی این دو، هم در سطح جزئی و هم کلی می پردازیم.

یک بعد در مقابل دو بعد

اگر قرار است که از این مقاله درسی یاد بگیرید، بگذارید این درس باشد:

Flexbox برای ساختارهای یک بعدی ساخته شده و Grid برای ساختارهای دو بعدی.

این موضوع به این معنی است که اگر شما آیتم‌های خود را در یک جهت  و در یک بعد می‌چینید، بهتر است که از Flexbox استفاده نمایید.

فلکس باکس و یک بعد

Flexbox در این ضمینه انعطاف پذیری بیشتری نسبت به CSS Grid به شما می‌دهد. همچنین راحت‌تر و با مقدار کد کمتری به خواسته خود خواهید رسید.

اما اگر هدف ایجاد ساختاری در دو بعد است – هم ستون و هم ردیف – CSS Grid می‌تواند به شما بهتر خدمت کند.

گرید و ساختار دوبعدی

در اینجا CSS Grid مارک‌آپ ساده‌تری دارد و نوشتن و بررسی کد بسیار ساده تر خواهد بود.

البته می توان این دو را با یکدیگر ترکیب نیز کرد. در مثال بالا Grid برای ساختار کلی صفحه یک انتخاب عالی و Flexbox برای کنترل المنت‌های Header بسیار مناسب است. به این شکل شما بهترین‌های هر دو دنیا را خواهید داشت. در انتهای مقاله ما به شما نشان خواهیم داد که چگونه به این هدف دست پیدا کنید.

اولیت محتوا در برابر اولیت ساختار

یکی دیگر از تغییرات اصلی این دو در اولیت بندی آن‌هاست. اولیت Flexbox در محتوا است در حالی که Grid اولویت خود را بر ساختار گذاشته است. ممکن است این موضوع کمی گیج کننده باشد، بنابراین سعی می‌کنیم با یک مثال، ابهام را به حداقل برسانیم.

ما از Header که در پاراگراف قبلی به آن اشاره شد استفاده می‌کنیم. HTML آن به صورت زیر است:

<header>
    <div>Home</div>
    <div>Search</div>
    <div>Logout</div>
</header>

قبل از استفاده از Flexbox آیتم‌ها به شکل زیر روی یکدیگر قرار گرفته اند.

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

با این حال هنگامی که ما کلاس ;display: flex را به آن اضافه می‌کنیم. آیتم ها به زیبایی در کنار یکدیگر قرار می‌گیرند.

header {
    display: flex;
}

استفاده از Flexbox
برای انتقال دکمه خروج به سمت چپ، آیتم مورد نظر را انتخاب کرده و به آن Margin می‌دهیم:

header > div:nth-child(3) {
    margin-left: auto;
}

که نتیجه آن به شکل زیر می‌شود.

استفاده از فلکس باکس

توجه داشته باشید که در این جا ما نحوه قرار گرفتن آیتم‌ها را به عهده خودشان گذاشته‌ایم. و به غیر از ;display; flex، کد دیگری استفاده نشده است.

این موضوع مرکز تفاوت Flexbox و Grid می‌باشد و هنگامی که ما همین Header را به وسیله Grid بازسازی کردیم، تفاوت آن‌ها برای شما آشکار خواهد شد.

برای ساخت Header به وسیله Grid می‌توان راه‌های مختلفی را در پیش گرفت. در اینجا ما به وسیله گرید، ۱۰ ستون مختلف ایجاد می کنیم.

header {
    display: grid;
    grid-template-columns: repeat(10, 1fr);
}

همان طور که می‌بینید ساختاری مشابه قبل ایجاد شده است.

فلکس باکس و گرید

با این حال اگر کمی در ساختار دقیق‌تر شویم، تفاوت‌ها آشکار خواهند شد. برای مشاهده ستون‌ها از Chrome inspector استفاده می‌کنیم:

استفاده از inspector

تفاوت این دو ساختار در این است که هنگام استفاده از Grid باید ابتدا ستون‌ها را تعریف کرد. عرض آن‌ها را مشخص و سپس محتوا را در آن‌ها قرار داد.

همان طور که دیدید این شیوه ما را مجبور می‌کند که به تعداد ستون‌هایی که در Header لازم است فکر کنیم.

اگر Grid را تغییر ندهیم، باید ادامه کار را با ساختار ۱۰ ستونی ادامه دهیم. محدودیتی که هنگام استفاده از Flexbox، با آن روبرو نشدیم.

برای انتقال دکمه خروج به سمت راست، باید آن را در ستون دهم قرار دهیم:

header > div:nth-child(3) {
    grid-column: 10;
}

هنگام بررسی دقیق‌تر با شکل زیر روبرو می‌شویم:

گرید و مشکلات آن

ما نمی‌توانستیم مانند قبل ;margin-left: auto را استفاده کنیم. چرا که دکمه خروج در ستون دهم قرار گرفته است. برای جابه‌جایی باید آن را در ستون دیگری قرار داد.

ترکیب بهترین‌ها

حال نحوه ترکیب این دو را با یکدیگر بررسی می‌کنیم و Header قبلی را نیز وارد این ساختار می‌کنیم.

ترکیب گرید و فلکس باکس

مارک‌آپ به شکل زیر می‌شود:

<div class="container">
  <header>HEADER</header>
  <aside>MENU</aside>
  <main>CONTENT</main>
  <footer>FOOTER</footer>
</div>

و CSS آن:

.container {
    display: grid;    
    grid-template-columns: repeat(12, 1fr);
    grid-template-rows: 50px 350px 50px;
}

با استفاده از Grid آیتم ها را در جایگاه‌های خود قرار می‌دهیم.

header {
    grid-column: span 12;
}
aside {
    grid-column: span 2;
}
main {
    grid-column: span 10;
}
footer {
    grid-column: span 12;
}

اکنون به سادگی Header را اضافه می‌کنیم. ما هدر را – که یک آیتم است در CSS Grid – به یک دربرگیرنده Flexbox تبدیل می‌کنیم.

header {
    display: flex;
}

اکنون به راحتی دکمه خروج را به سمت راست انتقال می‌دهیم.

header > div:nth-child(3) {
    margin-left: auto;
}

و در این جا ما یک ساختار بسیار عالی را داریم که از بهترین‌های Flexbox و Grid استفاده کرده است. تصویر زیر نشان می‌دهد که هر دربرگیرنده چگونه به نظر می‌رسد.

ترکیب Flexbox و Grid

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

پشتیبانی مرورگر‌ها

قبل از پایان، لازم است حتما به این موضوع اشاره کنیم. هنگام نوشتن این مقاله، ۷۷ درصد ترافیک جهانی سایت‌ها از CSS Grid پشتیبانی می‌کنند (به عبارتی ۷۷ درصد افراد از مرورگرهایی استفاده می‌کنند که از Grid پشتیبانی می‌کنند). به اعتقاد ما سال ۲۰۱۸ به CSS Grid تعلق خواهد داشت و توسعه دهنده ها بیش از پیش آن را مورد استفاده قرار خواهند داد. درست مانند اتفاقی که برای Flexbox افتاده است.

دیگر مطالب

نظر بدهید

ایمیل شما منتشر نخواهد شد. || Required fields are marked *