Flexbox في CSS: ترتيب العناصر في صف أو عمود
هل حاولت يوماً أن تضع ثلاث بطاقات بجانب بعضها، أو أن توسّط زراً في منتصف صندوق تماماً؟ قبل سنوات كان هذا صداعاً حقيقياً للمطورين. ثم جاء Flexbox فحلّ هذه المشكلات بسطور قليلة. في هذا الدرس ستتعلم كيف ترتب العناصر في صف أو عمود، وتوزّع المسافات بينها، وتحاذيها كما تريد.
الفكرة: حاوية وعناصر
Section titled “الفكرة: حاوية وعناصر”Flexbox يعمل على مستويين:
- الحاوية (Flex Container): العنصر الأب الذي تكتب له
display: flex. - العناصر (Flex Items): أبناؤه المباشرون، الذين يترتبون تلقائياً بداخله.
<div class="row"> <div>أ</div> <div>ب</div> <div>ج</div></div>.row { display: flex;}بهذا السطر الواحد تصطف العناصر الثلاثة في صف واحد بدلاً من أن يكون كل منها في سطر مستقل.
تخيّل الحاوية مثل رف في مكتبة، والعناصر مثل الكتب. Flexbox يمنحك أوامر لترتيب الكتب: صفّها من اليمين، أو وزّعها على طول الرف، أو اجمعها في المنتصف.
الاتجاه: flex-direction
Section titled “الاتجاه: flex-direction”.row { flex-direction: row; } /* صف أفقي (الافتراضي) */.column { flex-direction: column; } /* عمود رأسي */الاتجاه يحدد المحور الرئيسي (Main Axis): في row المحور الرئيسي أفقي، وفي column يصبح رأسياً. والمحور الآخر العمودي عليه يسمى المحور المتقاطع (Cross Axis). هذه الفكرة مهمة لفهم الخاصيتين التاليتين.
التوزيع على المحور الرئيسي: justify-content
Section titled “التوزيع على المحور الرئيسي: justify-content”.row { display: flex; justify-content: space-between;}| القيمة | النتيجة في صف |
|---|---|
flex-start |
العناصر مجمّعة في البداية (اليمين في العربية) |
flex-end |
مجمّعة في النهاية |
center |
مجمّعة في المنتصف |
space-between |
الأول في البداية، والأخير في النهاية، والمسافات متساوية بينها |
space-around |
مسافة متساوية حول كل عنصر |
space-evenly |
كل المسافات متساوية تماماً، حتى عند الأطراف |
space-between هي سر أغلب أشرطة التنقل: الشعار في جهة، والقائمة في الجهة الأخرى.
المحاذاة على المحور المتقاطع: align-items
Section titled “المحاذاة على المحور المتقاطع: align-items”إذا كانت الحاوية أطول من العناصر، تحدد align-items مكانها رأسياً في الصف:
.row { display: flex; align-items: center;}القيم: stretch (الافتراضي: تمتد العناصر لتملأ الارتفاع)، و flex-start (أعلى)، و center (منتصف)، و flex-end (أسفل).
التوسيط الكامل، أشهر مشكلة في CSS تاريخياً، أصبح ثلاثة أسطر:
.center-box { display: flex; justify-content: center; /* أفقياً */ align-items: center; /* رأسياً */ height: 200px;}المسافة بين العناصر: gap
Section titled “المسافة بين العناصر: gap”.row { display: flex; gap: 16px;}gap تضع مسافة بين العناصر فقط، وليس على الأطراف. وهي أنظف بكثير من وضع margin لكل عنصر.
الالتفاف: flex-wrap
Section titled “الالتفاف: flex-wrap”افتراضياً، يحاول Flexbox حشر كل العناصر في سطر واحد حتى لو ضاقت الشاشة. لجعلها تنتقل لسطر جديد عند الحاجة:
.cards { display: flex; flex-wrap: wrap; gap: 16px;}هذا مهم جداً للموبايل: البطاقات تظهر ثلاثاً بجانب بعضها على الكمبيوتر، ثم تلتف تلقائياً على الشاشة الصغيرة.
خصائص العناصر نفسها: flex-grow
Section titled “خصائص العناصر نفسها: flex-grow”حتى الآن كتبنا خصائص للحاوية. أشهر خاصية تُكتب للعنصر هي flex-grow، وتحدد كيف يأخذ العنصر المساحة الفارغة:
.search-input { flex-grow: 1; /* خذ كل المساحة المتبقية */}مثال عملي: شريط بحث فيه حقل وزر. الزر بحجمه الطبيعي، والحقل يتمدد ليملأ الباقي. ويمكنك أيضاً استخدام الاختصار flex: 1 لنفس الغرض تقريباً.
جرّب بنفسك
Section titled “جرّب بنفسك”هذا شريط تنقل وشريط بحث وبطاقات. غيّر justify-content في الشريط إلى center ثم space-evenly، وغيّر flex-direction للبطاقات إلى column:
الناتج
أخطاء شائعة
Section titled “أخطاء شائعة”- كتابة display: flex على العناصر بدل الحاوية: الخاصية تُكتب للأب، فيرتب أبناءه المباشرين.
- الخلط بين justify-content و align-items: الأولى على المحور الرئيسي (أفقي في الصف)، والثانية على المحور المتقاطع. وعند تغيير الاتجاه إلى
columnتتبادلان الدور. - نسيان flex-wrap: فتنضغط العناصر وتخرج عن الشاشة على الموبايل.
اختبر نفسك
Section titled “اختبر نفسك”سؤال
أي خاصية توزع العناصر على المحور الرئيسي، مثل وضع الشعار في جهة والقائمة في الجهة الأخرى؟
justify-content: space-between توزع العناصر على المحور الرئيسي، فيذهب الأول للبداية والأخير للنهاية.
سؤال
في صفحة عربية dir='rtl' ومعها display: flex، من أين يبدأ العنصر الأول؟
Flexbox يحترم اتجاه الصفحة، ففي rtl يبدأ الصف من اليمين تلقائياً.
الخلاصة
Section titled “الخلاصة”display: flexعلى الحاوية يرتب أبناءها المباشرين في صف.flex-directionيحدد الاتجاه:rowأوcolumn.justify-contentللتوزيع على المحور الرئيسي، وalign-itemsللمحاذاة على المحور المتقاطع.gapللمسافات بين العناصر، وflex-wrap: wrapللالتفاف على الشاشات الصغيرة.flex-grow: 1يجعل العنصر يأخذ المساحة المتبقية.