تخطَّ إلى المحتوى

Flexbox في CSS: ترتيب العناصر في صف أو عمود

الدرس 7 من 19 · CSS

هل حاولت يوماً أن تضع ثلاث بطاقات بجانب بعضها، أو أن توسّط زراً في منتصف صندوق تماماً؟ قبل سنوات كان هذا صداعاً حقيقياً للمطورين. ثم جاء Flexbox فحلّ هذه المشكلات بسطور قليلة. في هذا الدرس ستتعلم كيف ترتب العناصر في صف أو عمود، وتوزّع المسافات بينها، وتحاذيها كما تريد.

Flexbox يعمل على مستويين:

  • الحاوية (Flex Container): العنصر الأب الذي تكتب له display: flex.
  • العناصر (Flex Items): أبناؤه المباشرون، الذين يترتبون تلقائياً بداخله.
<div class="row">
<div>أ</div>
<div>ب</div>
<div>ج</div>
</div>
.row {
display: flex;
}

بهذا السطر الواحد تصطف العناصر الثلاثة في صف واحد بدلاً من أن يكون كل منها في سطر مستقل.

تخيّل الحاوية مثل رف في مكتبة، والعناصر مثل الكتب. Flexbox يمنحك أوامر لترتيب الكتب: صفّها من اليمين، أو وزّعها على طول الرف، أو اجمعها في المنتصف.

.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;
}
.row {
display: flex;
gap: 16px;
}

gap تضع مسافة بين العناصر فقط، وليس على الأطراف. وهي أنظف بكثير من وضع margin لكل عنصر.

افتراضياً، يحاول Flexbox حشر كل العناصر في سطر واحد حتى لو ضاقت الشاشة. لجعلها تنتقل لسطر جديد عند الحاجة:

.cards {
display: flex;
flex-wrap: wrap;
gap: 16px;
}

هذا مهم جداً للموبايل: البطاقات تظهر ثلاثاً بجانب بعضها على الكمبيوتر، ثم تلتف تلقائياً على الشاشة الصغيرة.

خصائص العناصر نفسها: flex-grow

Section titled “خصائص العناصر نفسها: flex-grow”

حتى الآن كتبنا خصائص للحاوية. أشهر خاصية تُكتب للعنصر هي flex-grow، وتحدد كيف يأخذ العنصر المساحة الفارغة:

.search-input {
flex-grow: 1; /* خذ كل المساحة المتبقية */
}

مثال عملي: شريط بحث فيه حقل وزر. الزر بحجمه الطبيعي، والحقل يتمدد ليملأ الباقي. ويمكنك أيضاً استخدام الاختصار flex: 1 لنفس الغرض تقريباً.

هذا شريط تنقل وشريط بحث وبطاقات. غيّر justify-content في الشريط إلى center ثم space-evenly، وغيّر flex-direction للبطاقات إلى column:

جرّب بنفسكCSS
أو اضغط Ctrl + Enter

الناتج

  • كتابة display: flex على العناصر بدل الحاوية: الخاصية تُكتب للأب، فيرتب أبناءه المباشرين.
  • الخلط بين justify-content و align-items: الأولى على المحور الرئيسي (أفقي في الصف)، والثانية على المحور المتقاطع. وعند تغيير الاتجاه إلى column تتبادلان الدور.
  • نسيان flex-wrap: فتنضغط العناصر وتخرج عن الشاشة على الموبايل.

سؤال

أي خاصية توزع العناصر على المحور الرئيسي، مثل وضع الشعار في جهة والقائمة في الجهة الأخرى؟

سؤال

في صفحة عربية dir='rtl' ومعها display: flex، من أين يبدأ العنصر الأول؟

  • display: flex على الحاوية يرتب أبناءها المباشرين في صف.
  • flex-direction يحدد الاتجاه: row أو column.
  • justify-content للتوزيع على المحور الرئيسي، و align-items للمحاذاة على المحور المتقاطع.
  • gap للمسافات بين العناصر، و flex-wrap: wrap للالتفاف على الشاشات الصغيرة.
  • flex-grow: 1 يجعل العنصر يأخذ المساحة المتبقية.