ترتيب العناصر بـ Flexbox
الأداة الأهم لترتيب أجزاء الصفحة: صفوف، وأعمدة، وتوسيط في سطرين. ⏱ نحو 25 دقيقة.
- تحوّل الحاوية إلى حاوية مرنة بـ
display: flex. - توزع العناصر بـ
justify-contentوتحاذيها بـalign-items. - تبني شريط تنقل وصف بطاقات.
- تستخدم
flex-wrapوgapوflex: 1، وتوسّط عنصرًا تمامًا.
١مشكلة: العناصر تحت بعضها
العناصر الكتلية مثل <div> تأتي تحت بعضها. فكيف نضع البطاقات الثلاث في صف، أو الشعار يمينًا والروابط يسارًا؟ الجواب سطر واحد على الحاوية الأم: display: flex.
<div class="row"> <div class="card">1</div> <div class="card">2</div> <div class="card">3</div></div>
.row { display: flex; gap: 12px;}.card { background: #DCE8FA; padding: 20px; border-radius: 8px;}
الحاوية .row صارت حاوية مرنة، وأبناؤها المباشرون صاروا عناصر مرنة تصطف في صف. و gap المسافة بينها.
انتبه: الصفحة عربية من اليمين إلى اليسار، فالصف يبدأ من اليمين. لهذا يظهر الصندوق 1 أقصى اليمين.
٢جرّب بنفسك: لوحة التحكم
غيّر القيم وراقب كيف تتحرك الصناديق، والقاعدة المكتوبة تحتها:
| الخاصية | تتحكم في | أشهر القيم |
|---|---|---|
justify-content | التوزيع على الاتجاه الرئيسي (أفقيًّا في الصف). | flex-start و center و space-between |
align-items | المحاذاة على الاتجاه المتعامد (رأسيًّا في الصف). | stretch و center |
flex-direction | اتجاه الصف: أفقي أو رأسي. | row و column |
gap | المسافة بين العناصر. | 12px |
٣شريط التنقل في سطرين
<header class="bar"> <b>بُنّ</b> <nav> <a href="#">الرئيسية</a> <a href="#">القائمة</a> <a href="#">اتصل</a> </nav></header>
.bar { display: flex; justify-content: space-between; align-items: center; background: #3B2A1A; padding: 10px 16px;}.bar b { color: white; font-size: 22px; }.bar nav { display: flex; gap: 14px; }.bar a { color: white; text-decoration: none; }
space-between دفع الشعار إلى أقصى اليمين والقائمة إلى أقصى اليسار. والقائمة نفسها حاوية مرنة ثانية تصفّ الروابط.
٤الالتفاف والتمدد
إذا لم تتسع الشاشة للبطاقات، نسمح لها بالنزول إلى سطر جديد بـ flex-wrap: wrap. و flex: 1 تجعل العناصر تتقاسم المساحة بالتساوي:
<div class="grid"> <div class="card">بايثون</div> <div class="card">الويب</div> <div class="card">قواعد البيانات</div> <div class="card">الأمن</div></div>
.grid { display: flex; flex-wrap: wrap; gap: 10px;}.card { flex: 1 1 140px; background: #FCE8D5; padding: 24px 10px; text-align: center; border-radius: 8px;}
flex: 1 1 140px تعني: تمدّد لتملأ المساحة، وتقلّص إن لزم، وعرضك الأساسي 140px. اضغط «جرّب وعدّل» ثم زر 📱 لترى البطاقات تلتف في الجوال.
٥التوسيط في المنتصف تمامًا
أشهر سؤال في CSS: كيف أوسّط شيئًا أفقيًّا ورأسيًّا؟ مع Flexbox صار ثلاثة أسطر:
<div class="center"><p>في المنتصف تمامًا</p></div>.center { display: flex; justify-content: center; align-items: center; height: 150px; background: #EAF2FB;}
توقّع وتحقّق
أين نكتب display: flex؟
شعار يمينًا وروابط يسارًا:
توسيط رأسي في صف مرن:
لتنزل البطاقات إلى سطر جديد عند ضيق الشاشة:
الخلاصة
display: flexعلى الحاوية الأم، فيصطف أبناؤها في صف (يبدأ من اليمين في العربية).justify-contentللاتجاه الرئيسي، وalign-itemsللمتعامد.gapللمسافة، وflex-wrap: wrapللالتفاف، وflex: 1للتقاسم بالتساوي.- التوسيط التام:
flexمعjustify-content: centerوalign-items: center.
تحدٍّ برمجي: ترويسة وبطاقات الدورات
متقدمرتّب صفحة مركز التدريب بـ Flexbox: ترويسة فيها الشعار والقائمة على الطرفين، وثلاث بطاقات دورات في صف.
- الترويسة header حاوية مرنة، والشعار والقائمة على الطرفين
(space-between)، ومتوسطة رأسيًّا. - روابط nav في صف بمسافة gap.
- الحاوية .courses حاوية مرنة تلتف
(wrap)بمسافة gap. - البطاقات .course تتمدد بالتساوي لتملأ الصف (
flex: 1أوflex: 1 1 140px).
👀 اعرض شكل الناتج المطلوب
- header مرنة:
space-betweenومتوسطة رأسيًّا. - روابط nav في صف بمسافة gap.
- .courses مرنة تلتف بمسافة.
- البطاقات تتمدد بالتساوي
(flex-grow: 1).
💡 تلميح 1
display: flex; justify-content: space-between; align-items: center; }💡 تلميح 2
flex: 1; } يجعلها متساوية.حاول بنفسك أولًا؛ للمسألة أكثر من حلّ صحيح.
<header> <b class="logo">مركز المبرمج</b> <nav> <a href="#">الرئيسية</a> <a href="#">الدورات</a> <a href="#">اتصل</a> </nav></header> <div class="courses"> <div class="course">بايثون</div> <div class="course">تطوير الويب</div> <div class="course">قواعد البيانات</div></div>
header { display: flex; justify-content: space-between; align-items: center; background: #172033; padding: 10px 16px;}nav { display: flex; gap: 14px;}header a, .logo { color: white;}.courses { display: flex; flex-wrap: wrap; gap: 12px; margin-top: 16px;}.course { flex: 1 1 140px; background: #DCE8FA; padding: 30px 10px; text-align: center; border-radius: 8px;}