قبل Flexbox (2012)، ترتيب العناصر في CSS كان كابوس — خاصة التوسيط العمودي (Vertical Centering) اللي كان بيحتاج hacks معقدة. من خلال 8 سنوات في تطوير المواقع، Flexbox هو الأداة اللي باستخدمها في 80% من حالات التخطيط.
في الدرس ده هنتعلم:
⚠️ نصيحة من خبرة: Flexbox مش مناسب لكل حاجة — للتخطيطات ثنائية الأبعاد (صفوف وأعمدة معًا) استخدم CSS Grid. Flexbox للتخطيطات أحادية البعد (صف أو عمود واحد). هنتعلم Grid في الدرس الجاي!
Flexbox (Flexible Box Layout) هو نظام تخطيط في CSS بيخليك ترتب العناصر في صف (row) أو عمود (column) مع التحكم الكامل في:
Flexbox بيعتمد على فكرة بسيطة: فيه حاوية (Container) وفيها عناصر (Items). الحاوية هي اللي بتتحكم في التخطيط الكلي، والعناصر بتتحكم في نفسها كأفراد.
💡 لاحظ: لما تضيف display: flex على الحاوية، العناصر الداخلية بتتحول لـ "Flex Items" تلقائيًا — مش محتاج تضيف أي حاجة على العناصر نفسها!
الخصائص دي بتتحكم في التخطيط الكلي للعناصر جوه الحاوية.
بتحدد إذا كانت العناصر هتترتب أفقيًا (row) أو عموديًا (column).
🎯 row-reverse للعربية: في المواقع العربية (RTL)، row-reverse بيخلي العناصر تترتب من اليمين لليسار — ده مناسب للغة العربية. بس الأفضل هو استخدام dir="rtl" في HTML عشان Flexbox يتكيف تلقائيًا.
المحور الرئيسي هو الاتجاه اللي حددته في flex-direction. لو row، ده بيكون المحور الأفقي. لو column، بيكون المحور العمودي.
| القيمة | الوظيفة | متى نستخدمها؟ |
|---|---|---|
flex-start |
كل العناصر في البداية | Navbar بروابط في اليمين |
flex-end |
كل العناصر في النهاية | زر "تسجيل" في آخر Navbar |
center |
كل العناصر في الوسط | عنوان في وسط الصفحة |
space-between |
الأول في البداية، الآخر في النهاية، الباقي متوزع | Navbar: Logo | روابط | زر تسجيل |
space-around |
مسافات متساوية حول كل عنصر | أيقونات التواصل الاجتماعي |
space-evenly |
مسافات متساوية تمامًا بين كل العناصر | بطاقات متساوية المسافة |
المحور العرضي هو العكس — لو row، ده بيكون المحور العمودي. الخاصية دي بتتحكم في "الارتفاع" العمودي للعناصر.
🌟 center هو السلاح السري! قبل Flexbox، التوسيط العمودي كان بيحتاج position: absolute + transform: translateY(-50%) — كود معقد ومشكل. مع Flexbox: align-items: center وبس!
افتراضيًا، Flexbox بيحاول يحط كل العناصر في سطر واحد — حتى لو المساحة مش كافية. flex-wrap: wrap بيخلي العناصر تنزل لسطر جديد لما المساحة تضيق.
🎯 نصيحة ذهبية: في 99% من الحالات، استخدم flex-wrap: wrap مع gap. ده بيخلي العناصر تتكيف مع الشاشات الصغيرة تلقائيًا — مش محتاج Media Queries في كتير من الحالات!
قبل gap، كنا بنستخدم margin على العناصر — بس ده كان بيسبب مشاكل في الحواف. gap بيضيف مسافة بين العناصر فقط، مش في الحواف.
الخصائص دي بتتحكم في عنصر واحد بشكل منفرد — مش على كل العناصر.
بتحدد إزاي العنصر يكبر ليملأ المساحة الفاضية. لو كل العناصر ليها flex-grow: 1، هيتقسموا المساحة بالتساوي.
بتحدد إزاي العنصر يصغر لما المساحة تضيق. flex-shrink: 0 بيمنع العنصر من التصغير — مفيد للأزرار أو الشعارات.
بتحدد الحجم الابتدائي للعنصر قبل ما يكبر أو يصغر. ممكن تستخدم px، %، أو auto.
بدل ما تكتب 3 خصائص منفصلة، استخدم flex اللي بيجمعهم: flex: grow shrink basis.
لو عايز عنصر واحد يتحكم في محاذاته الخاصة — مش يتبع align-items بتاع الحاوية.
بتيح لك تغيير ترتيب العناصر بدون تعديل HTML. القيمة الافتراضية هي 0 — العناصر بترتب حسب القيمة (الأقل أولًا).
❌ تحذير: استخدم order بحذر — بيغير الترتيب البصري فقط، مش ترتيب DOM. ده ممكن يسبب مشاكل للمكفوفين (قارئات الشاشة بتقرأ DOM مش الترتيب البصري). استخدمه للتعديلات الجمالية البسيطة بس.
🌟 ليه ده شغال؟ flex: 1 1 300px معناه: كل بطاقة تبدأ بـ 300px. لو فيه مساحة، تكبر (flex-grow: 1). لو المساحة ضيقة، تصغر (flex-shrink: 1). مع flex-wrap: wrap، البطاقات هتنزل لسطر جديد لما مفيش مساحة — وده بيخليها متجاوبة تلقائيًا!
gap بدل margin للمسافاتflex-wrap: wrap للتجاوب التلقائيalign-items: center للتوسيط العموديflex-shrink: 0 للعناصر اللي ما لازم تصغرش| الخطأ ❌ | الصح ✅ | السبب |
|---|---|---|
| استخدام Flexbox لشبكة 2D | استخدام CSS Grid للشبكات | Grid أسهل وأقوى للتخطيطات ثنائية الأبعاد |
| نسيان flex-wrap | إضافة flex-wrap: wrap | بدون wrap، العناصر ممكن تخرج برا الشاشة |
| استخدام margin للمسافات | استخدام gap | gap أسهل وما بيسببش مشاكل في الحواف |
| الاعتماد على width: 100% | استخدام flex: 1 | flex: 1 أكثر مرونة وبتتكيف مع المساحة |
| تغيير order بشكل مفرط | استخدام order بحذر | بيأثر على الوصولية (قارئات الشاشة) |
طبق اللي اتعلمته في درس عملي. حاول تبني: