تعلّم CSS Flexbox: دورة مكثفة لفهم التصميم المرن والاستجابة الحديثة
مقدمة إلى CSS Flexbox
يُعد Flexbox من أهم أدوات تصميم الواجهات الحديثة داخل CSS، لأنه يسهّل بناء تخطيطات مرنة ومتجاوبة مع مختلف أحجام الشاشات. إذا كنت ترغب في إنشاء صفحات منظمة تعمل بكفاءة على الجوال وسطح المكتب، فإن فهم هذا النموذج التخطيطي سيمنحك تحكماً أكبر في ترتيب العناصر ومحاذاتها وتوزيع المسافات بينها.
في هذا الدليل العربي الاحترافي، سنعيد تقديم المفاهيم الأساسية والعملية الخاصة بـ Flexbox بأسلوب مبسّط وواضح، مع شرح أهم خصائص الحاوية والعناصر الداخلية، حتى تتمكن من تطبيقها مباشرة في مشاريعك.

ما هو Flexbox ولماذا تحتاج إليه؟
Flexbox هو اختصار لـ Flexible Box Layout، وهو نظام تخطيط صُمم لترتيب العناصر داخل حاوية بطريقة ذكية ومرنة. بدلاً من الاعتماد على حلول قديمة مثل float أو التلاعب اليدوي بالهوامش، يمكنك باستخدام Flexbox التحكم بسهولة في:
- اتجاه العناصر أفقياً أو عمودياً.
- توزيع المسافات بين العناصر.
- محاذاة العناصر على المحور الرئيسي أو المحور المتقاطع.
- التعامل مع التفاف العناصر عند ضيق المساحة.
- إعادة ترتيب العناصر بصرياً دون تعديل ترتيبها داخل
HTML.
هذه المزايا تجعل Flexbox خياراً مثالياً لبناء القوائم، وأشرطة التنقل، وبطاقات المحتوى، وأقسام hero، والواجهات المتجاوبة بشكل عام.

إعداد مثال عملي لتطبيق Flexbox
قبل البدء في استعراض الخصائص، من المفيد إنشاء مثال بسيط يحتوي على حاوية وعدة عناصر داخلها. يمكن أن تبدأ ببنية HTML مشابهة لما يلي:
<div class="container">
<div class="item item-1">1</div>
<div class="item item-2">2</div>
<div class="item item-3">3</div>
<div class="item item-4">4</div>
<div class="item item-5">5</div>
</div>
ثم تضيف تنسيقاً أولياً في ملف CSS:
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
.container {
background: #cacaca;
padding: 10px;
margin: 50px;
}
.item {
background: #ff0037;
color: #fff;
font-size: 35px;
padding: 20px;
margin: 10px;
}
في هذه المرحلة لن يظهر أي سلوك خاص بـ Flexbox بعد، لكنك ستحصل على حاوية رمادية وعناصر حمراء جاهزة للتجربة.
تفعيل Flexbox باستخدام الخاصية display
لتحويل الحاوية إلى حاوية مرنة، نضيف الخاصية display: flex إلى العنصر الأب:
.container {
display: flex;
}
بمجرد تطبيق هذا السطر، تتحول العناصر الأبناء إلى flex items، وتبدأ قوة Flexbox بالظهور مباشرة. ستلاحظ أن العناصر تصطف تلقائياً في صف واحد، وهو السلوك الافتراضي.
فهم المحاور في Flexbox
لفهم Flexbox بصورة صحيحة، يجب أولاً استيعاب مفهومين أساسيين:
- المحور الرئيسي:
main axis - المحور المتقاطع:
cross axis
اتجاه هذين المحورين يعتمد على قيمة الخاصية flex-direction. لذلك فإن أي حديث عن المحاذاة أو التوزيع لا يكتمل دون معرفة اتجاه المحور الرئيسي أولاً.
الخاصية flex-direction: تحديد اتجاه العناصر
تُستخدم الخاصية flex-direction لتحديد طريقة ترتيب العناصر داخل الحاوية. القيمة الافتراضية هي row، أي ترتيب أفقي من اليسار إلى اليمين في البيئات القياسية.
القيم الأساسية لـ flex-direction
row: ترتيب العناصر في صف أفقي.column: ترتيب العناصر عمودياً.row-reverse: ترتيب أفقي مع عكس التسلسل.column-reverse: ترتيب عمودي مع عكس التسلسل.
عند استخدام column، يصبح المحور الرئيسي عمودياً، بينما يتحول المحور المتقاطع إلى الاتجاه الأفقي. هذه النقطة مهمة جداً لأن خصائص المحاذاة ستتأثر بها لاحقاً.
.container {
display: flex;
flex-direction: row;
}
عند بناء تصميم متجاوب للشاشات الصغيرة، قد يكون تغيير flex-direction إلى column خياراً عملياً لجعل العناصر تتراص فوق بعضها بدلاً من التزاحم أفقياً.
الخاصية justify-content: توزيع العناصر على المحور الرئيسي
تتحكم الخاصية justify-content في كيفية توزيع العناصر على المحور الرئيسي. وهي من أكثر خصائص Flexbox استخداماً في المشاريع العملية.
أشهر القيم التي يمكنك استخدامها
flex-start: بدء العناصر من أول المحور.flex-end: دفع العناصر إلى نهاية المحور.center: توسيط العناصر.space-between: توزيع المساحة بين العناصر فقط.space-around: توزيع مساحات حول كل عنصر.space-evenly: توزيع متساوٍ تماماً للمسافات.
.container {
display: flex;
justify-content: center;
}
الفرق بين القيم المتشابهة
غالباً ما يختلط الأمر على المبتدئين بين space-between وspace-around وspace-evenly. الفرق بينها دقيق لكنه مهم:
space-between: لا يضيف مسافة عند أطراف الحاوية، بل يوزع الفراغ بين العناصر فقط.space-around: يضيف مسافة حول كل عنصر، ما يجعل المسافة بين عنصرين أكبر من المسافة بين العنصر والحافة.space-evenly: يجعل جميع المسافات متساوية، سواء بين العناصر أو بينها وبين الحواف.
اختيار القيمة المناسبة يعتمد على شكل الواجهة الذي تريد الوصول إليه.
الخاصية align-items: محاذاة العناصر على المحور المتقاطع
إذا كانت justify-content تعمل على المحور الرئيسي، فإن align-items تتحكم في محاذاة العناصر على المحور المتقاطع.
لرؤية تأثيرها بوضوح، يمكنك جعل أحد العناصر أطول من البقية:
.item-3 {
height: 150px;
}
.container {
display: flex;
justify-content: center;
align-items: center;
}
أهم قيم align-items
stretch: القيمة الافتراضية، وتعمل على تمديد العناصر لتملأ الارتفاع المتاح.flex-start: محاذاة العناصر عند بداية المحور المتقاطع.flex-end: محاذاة العناصر عند نهاية المحور المتقاطع.center: توسيط العناصر على المحور المتقاطع.baseline: محاذاة العناصر بحسب خط الأساس للنص.
تظهر فائدة baseline بوضوح عندما تختلف أحجام الخطوط بين العناصر، حيث تتم محاذاة النصوص على خط تخيلي واحد.
ماذا يحدث عند تغيير flex-direction إلى column؟
عند استخدام flex-direction: column، يتغير اتجاه المحور الرئيسي من الأفقي إلى العمودي. وهذا يعني أن:
justify-contentسيؤثر في التوزيع العمودي.align-itemsسيؤثر في المحاذاة الأفقية.
هذه النقطة أساسية، لأن كثيراً من الأخطاء في استخدام Flexbox تأتي من نسيان أن المحاور تتغير بتغير الاتجاه.
.container {
display: flex;
flex-direction: column;
align-items: flex-end;
}
في هذا المثال ستتحرك العناصر إلى نهاية المحور المتقاطع، أي إلى الجهة الأفقية المقابلة.
خصائص العناصر الداخلية في Flexbox
بعد إتقان خصائص الحاوية، يأتي دور الخصائص التي تُطبّق على العناصر الأبناء نفسها. هذه الخصائص تمنحك تحكماً دقيقاً في عنصر بعينه دون التأثير على بقية العناصر.
الخاصية align-self
تعمل align-self مثل align-items، لكنها تُطبّق على عنصر واحد فقط. كما يمكنها تجاوز إعداد المحاذاة العامة في الحاوية.
.item-4 {
align-self: flex-start;
}
من خلال هذه الخاصية يمكنك تمييز عنصر محدد بصرياً أو تعديل موضعه داخل التخطيط المرن دون الحاجة لتغيير سلوك المجموعة كلها.
الخاصية order
تتيح لك الخاصية order تغيير الترتيب البصري للعناصر داخل الحاوية. القيمة الافتراضية لكل عنصر هي 0.
.item-1 { order: 3; }
.item-2 { order: 4; }
.item-3 { order: 0; }
.item-4 { order: 1; }
.item-5 { order: 2; }
رغم أن هذه الخاصية مفيدة جداً، يُنصح باستخدامها بحذر، خاصة في الواجهات التي تعتمد على تسلسل منطقي أو وصولية عالية، لأن الترتيب البصري قد يختلف عن ترتيب العناصر داخل المستند.
الخاصية flex-grow
تحدد flex-grow مدى قدرة العنصر على التمدد لشغل المساحة الفارغة المتاحة داخل الحاوية.
.item {
flex-grow: 1;
}
.item-4 {
flex-grow: 3;
}
في هذا المثال، سيشغل العنصر الرابع مساحة أكبر من بقية العناصر لأنه يملك قيمة نمو أعلى. المهم هنا أن القيم تُفهم بشكل نسبي، أي بالمقارنة بين العناصر، لا بشكل مستقل.
الخاصية المختصرة flex
بدلاً من كتابة flex-grow وflex-shrink وflex-basis كل على حدة، يمكنك استخدام الخاصية المختصرة flex.
.item-5 {
flex: 5;
}
وعند كتابة قيمة واحدة فقط، فإنها تُفهم غالباً على أنها تخص flex-grow. هذه الطريقة منتشرة جداً في التطبيقات الواقعية لأنها مختصرة وواضحة.
الخاصية flex-basis
تحدد flex-basis الحجم الابتدائي للعنصر على المحور الرئيسي قبل توزيع المساحة المتبقية. ويمكن اعتبارها بديلاً عملياً للعرض width داخل سياق Flexbox.
.item-5 {
flex-basis: 75%;
}
يمكن استخدام القيم النسبية مثل % أو القيم الثابتة مثل px، وفقاً لمتطلبات التصميم.
الخاصية flex-shrink
تتحكم flex-shrink في قابلية العنصر للانكماش عندما لا توجد مساحة كافية داخل الحاوية. القيمة الافتراضية هي 1، أي أن العنصر قد ينكمش عند الحاجة.
.item-5 {
flex-basis: 700px;
flex-shrink: 0;
}
عند تعيين القيمة 0، فإن العنصر يحتفظ بحجمه ولا ينكمش، لكن هذا قد يؤدي إلى تجاوز المحتوى أو حدوث overflow إذا كانت المساحة محدودة.
الخاصية flex-wrap: التعامل مع كثرة العناصر
عندما يزداد عدد العناصر داخل الحاوية، قد تضيق المساحة المتاحة وتبدأ العناصر بالتزاحم أو الخروج عن حدود الحاوية. هنا تظهر أهمية الخاصية flex-wrap.
.container {
display: flex;
flex-wrap: wrap;
}
القيمة الافتراضية هي nowrap، أي أن العناصر تحاول البقاء في سطر واحد. أما عند استخدام wrap، فإن العناصر تنتقل تلقائياً إلى سطر جديد عند الحاجة، ما يحسن قابلية القراءة ويجعل التخطيط أكثر مرونة.
الخاصية align-content: محاذاة الصفوف داخل الحاوية
إذا كانت الحاوية تحتوي على أكثر من صف نتيجة استخدام flex-wrap، فإن الخاصية align-content تصبح مهمة جداً، لأنها تتحكم في توزيع الصفوف نفسها على المحور المتقاطع.
.container {
display: flex;
flex-wrap: wrap;
height: 600px;
align-content: flex-start;
}
أهم القيم المتاحة
flex-startflex-endcenterspace-betweenspace-aroundspace-evenlystretch
الفرق بين align-content وalign-items جوهري:
align-itemsيضبط محاذاة العناصر داخل الصف الواحد.align-contentيضبط توزيع الصفوف نفسها عندما يكون هناك أكثر من صف.
أفضل استخدامات Flexbox في المشاريع العملية
بعد فهم الخصائص الأساسية، يمكنك توظيف Flexbox في كثير من السيناريوهات الشائعة، مثل:
- بناء شريط تنقل مرن ومتجاوب.
- محاذاة أزرار التحكم داخل النماذج.
- تصميم بطاقات خدمات أو منتجات بأبعاد مرنة.
- إنشاء أقسام
heroمتوازنة بصرياً. - ترتيب العناصر في لوحات التحكم والواجهات الإدارية.
وفي المشاريع الحديثة، غالباً ما يُستخدم Flexbox إلى جانب CSS Grid، حيث يُفضَّل الأول لمحاذاة العناصر في بعد واحد، بينما يُستخدم الثاني للتخطيطات المعقدة ذات البعدين.
نصائح عملية لإتقان Flexbox بسرعة
- ابدأ دائماً بتحديد اتجاه
main axisقبل اختيار خصائص المحاذاة. - استخدم أدوات المطور
DevToolsلفحص الحاوية المرنة ومراقبة سلوك الخصائص. - جرّب القيم المختلفة عملياً بدلاً من الاكتفاء بالحفظ النظري.
- اكتب أمثلة صغيرة ومتكررة حتى تتكون لديك ذاكرة بصرية لسلوك كل خاصية.
- استفد من الأوراق المرجعية
cheat sheetsلتسريع المراجعة أثناء العمل.
الخلاصة التقنية
CSS Flexbox ليس مجرد أداة لتنسيق العناصر، بل هو أسلوب تفكير متكامل في بناء واجهات أكثر مرونة واستجابة. كلما أتقنت فهم المحور الرئيسي والمحور المتقاطع، أصبح استخدامك لخصائص مثل justify-content وalign-items وflex-wrap أكثر دقة واحترافية. من الناحية العملية، يُعد Flexbox الخيار الأمثل لتخطيطات البعد الواحد، خاصة عندما تحتاج إلى محاذاة سريعة، وتوزيع ذكي للمسافات، وتكيف ممتاز مع الشاشات المختلفة.