Menu
flag Ar iconالعربيةdown icon

Flexbox في CSS: display flex والمحاور والمحاذاة وflex

يرتّب Flexbox العناصر في صف أو عمود ويتحكم في كيفية تقاسمها المساحة واصطفافها. تعلّم display: flex، والمحور الرئيسي والمحور العرضي، وكل خصائص الحاوية، وflex-grow وflex-shrink وflex-basis، مع ساحة تجربة حية تقيس أين يستقر كل عنصر.

تحتوي هذه الصفحة على محررات قابلة للتشغيل - حرّر، شغّل، وشاهد النتيجة فوراً.

ماذا تفعل display: flex

ضع display: flex على أب وسيصطف أبناؤه المباشرون في صف، جنبًا إلى جنب، ويتمددون إلى الارتفاع نفسه. هذا التصريح الواحد يحل محل العناصر العائمة وinline-block ومعظم حيل الموضعة لترتيب صف من الأشياء.

في الصندوق الأول يأخذ كل div سطرًا كاملًا. وفي الثاني تقع العناصر الثلاثة في صف واحد، كل منها بعرض محتواه فقط، ويتمدد One وThree إلى ارتفاع Two. الأب وحده تغيّر: display: flex توضع على الحاوية، لا على العناصر أبدًا.

ساحة تجربة Flexbox

اختر قيمًا وراقب العناصر تتحرك. سطر الشيفرة تحت الصندوق هو CSS لما تراه، والقائمة تحته هي المكان الذي وضع فيه المتصفح كل عنصر فعلًا، مقيسًا بـ getBoundingClientRect().

أمور تستحق التجربة:

  • justify-content: space-between: يستقر العنصر 1 عند x 0 ويلامس العنصر 3 الحافة البعيدة.
  • align-items: center: تحتفظ العناصر الثلاثة بارتفاعاتها وتصطف مراكزها. ومع القيمة الافتراضية stretch لا يكون للعنصر 1 ارتفاع خاص به فيملأ ارتفاع الحاوية الكامل 170px.
  • flex-direction: column: الآن تحرك justify-content العناصر عموديًا وalign-items أفقيًا. الخاصيتان تتبعان المحاور لا الشاشة.

المحور الرئيسي والمحور العرضي

لكل حاوية flex محوران. المحور الرئيسي هو اتجاه انسياب العناصر، وتحدده flex-direction. والمحور العرضي يقطعه بشكل متعامد.

flex-directionالمحور الرئيسيالمحور العرضيjustify-content تحرك العناصرalign-items تحرك العناصر
row (الافتراضي)أفقي، بترتيب القراءةعموديأفقيًاعموديًا
row-reverseأفقي، معكوسعموديأفقيًاعموديًا
columnعمودي، من الأعلى إلى الأسفلأفقيعموديًاأفقيًا
column-reverseعمودي، من الأسفل إلى الأعلىأفقيعموديًاأفقيًا

في صفحة من اليمين إلى اليسار (dir="rtl")، مثل صفحة عربية، يبدأ row من الحافة اليمنى، لأن المحور الرئيسي يتبع اتجاه الكتابة.

خصائص الحاوية

توضع هذه على العنصر الذي عليه display: flex:

الخاصيةماذا تفعلالافتراضي
flex-directionصف أم عمود، وبأي اتجاهrow
flex-wrapهل تنتقل العناصر إلى سطر جديد حين تنفد المساحةnowrap
flex-flowاختصار لـ flex-direction وflex-wraprow nowrap
justify-contentالموضع والتباعد على المحور الرئيسيnormal (تتصرف كـ flex-start)
align-itemsموضع العناصر على المحور العرضيnormal (تتصرف كـ stretch)
align-contentالتباعد بين الأسطر حين تلتف العناصرnormal
gapالمسافة بين العناصر (row-gap، column-gap)0

لكل من justify-content وalign-items صفحتها الخاصة بكل القيم: justify-content وalign-items. والالتفاف والاتجاه في صفحة flex-wrap.

خصائص العناصر: flex-grow وflex-shrink وflex-basis

توضع هذه على الأبناء وتقرر كيف يتقاسمون عرض الحاوية:

  • flex-basis: الحجم الذي يبدأ منه العنصر قبل توزيع المساحة الحرة (auto تعني «استخدم عرضي أو محتواي»).
  • flex-grow: كم حصة يأخذ العنصر من المساحة المتبقية. 0 تعني أنه لا يكبر أبدًا.
  • flex-shrink: كم يتنازل العنصر حين لا تكفي المساحة. 0 تعني أنه لا يصغر أبدًا.

يضبط الاختصار flex الثلاثة معًا:

تكتبومعناهاالسلوك
flex: initial (الافتراضي)0 1 autoبحجم المحتوى، يمكن أن يصغر، ولا يكبر أبدًا
flex: 11 1 0%يبدأ من صفر ويأخذ حصة متساوية من المساحة
flex: auto1 1 autoحجم المحتوى إضافةً إلى حصة من المساحة المتبقية
flex: none0 0 autoبمحتواه أو عرضه بالضبط، لا يكبر ولا يصغر أبدًا
flex: 22 1 0%ضعف حصة العنصر الذي عليه flex: 1

عرض كل صف 480px داخل حشوه، والفجوتان بعرض 8px تتركان 464px للعناصر. تُظهر العروض المطبوعة كيف قُسمت: نحو 155px لكل عنصر في الصف الأول، و116 + 232 + 116 في الثاني (العنصر ذو flex: 2 يأخذ ضعف حصة كل من جاريه)، و100 + 372 في الثالث، حيث يحتفظ العنصر ذو flex: none بعرضه ويأخذ العنصر الآخر كل الباقي.

تخطيطات حقيقية بـ flexbox

الترويسة التي فيها شعار في البداية وروابط في النهاية هي تخطيط flex الأكثر شيوعًا. margin-inline-start: auto على عنصر واحد تلتهم كل المساحة الحرة قبله وتدفعه هو وكل ما بعده إلى النهاية (في صفحة عربية تكون البداية على اليمين والنهاية على اليسار):

تحاذي align-items: center نص الشعار الأكبر مع الروابط، وتباعد gap بين الروابط من دون هوامش تحتاج إلى إلغائها على الأخير.

نمط يومي ثانٍ هو صف الوسائط: أيقونة بحجم ثابت ونص يأخذ الباقي ويلتف داخل عموده.

flex: none هي الضمانة. عناصر flex تصغر افتراضيًا، فإن حذفتها من الدائرة وحذفت أيضًا flex: 1 من النص، تضغط الفقرة الدائرة إلى عرض نحو 23px: شكل بيضاوي. لتوسيط شيء واحد في صندوق يكفي flexbox سطران (justify-content: center; align-items: center)؛ وتقارن صفحة توسيط div ذلك بالطرق الأخرى.

order وسهولة الوصول

تغيّر الخاصية order والاتجاهات -reverse مكان ظهور العناصر، لا مكانها في HTML. قارئات الشاشة ومفتاح Tab ما زالت تتبع ترتيب HTML، فقد يقفز مستخدم لوحة المفاتيح من أول رابط على الشاشة إلى آخرها. استخدمها للزخرفة فقط؛ وحين يكون للترتيب معنى، غيّر HTML.

Flexbox أم grid

يعمل Flexbox في اتجاه واحد في كل مرة: العناصر في الصف تتحدد أحجامها من محتواها، والسطر الثاني (مع الالتفاف) لا يصطف مع الأول. أما grid فيعمل في اتجاهين: تعرّف الأعمدة والصفوف وتستقر العناصر فيها. شريط التنقل أو شريط الأدوات أو صف النموذج مهمة flexbox؛ ومعرض الصور أو الصفحة ذات الشريط الجانبي مهمة grid.

أخطاء شائعة

  • display: flex على العنصر بدل الأب. الحاوية هي التي تأخذ display: flex؛ وأبناؤها هم العناصر.
  • توقع أن تحرك align-items العناصر عموديًا من دون ارتفاع. إن كانت الحاوية بارتفاع أطول عنصر فيها فقط، فلا مجال للحركة. أعطِ الحاوية ارتفاعًا، أو اعلم أنها تعمل لكن ليس لديها ما تفعله.
  • نص يفيض بدل أن يتقلص. لعناصر flex القيمة min-width: auto. أضف min-width: 0 إلى العنصر الذي يجب أن يتقلص.
  • استخدام flex: 1 والتساؤل عن سبب اختلاف العروض. العناصر ذات flex: 1 تتقاسم المساحة بالتساوي، لكن العنصر الذي لا يتسع محتواه (رابط URL طويل، صورة) لن يصغر عنه. وmin-width: 0 تصلح ذلك أيضًا.
  • هوامش بين العناصر. استخدم gap على الحاوية؛ فهي تقع بين العناصر فقط.
  • تداخل flex بلا حاجة. الأبناء المباشرون وحدهم عناصر flex. الأحفاد يتبعون التخطيط العادي ما لم يكن أبوهم المباشر أيضًا display: flex.

الأسئلة الشائعة

ماذا تفعل display: flex؟

تحوّل العنصر إلى حاوية flex. يصبح أبناؤه المباشرون عناصر flex ويوضعون افتراضيًا في صف، جنبًا إلى جنب، ممدودين إلى الارتفاع نفسه، وتتحكم خصائص مثل justify-content وalign-items وgap في كيفية تقاسمهم المساحة.

ماذا تعني flex: 1؟

flex: 1 اختصار لـ flex: 1 1 0%: يمكن للعنصر أن يكبر (flex-grow: 1)، ويمكن أن يصغر (flex-shrink: 1)، ويبدأ من حجم صفر (flex-basis: 0%). العناصر التي لها كلها flex: 1 تتقاسم المساحة الحرة بالتساوي، فتنتهي بالعرض نفسه ما لم يكن محتواها لا يتسع.

ما الفرق بين justify-content وalign-items؟

تضع justify-content العناصر على المحور الرئيسي (أفقيًا في الصف)، وتضعها align-items على المحور العرضي (عموديًا في الصف). مع flex-direction: column يتبادل المحوران، فتصبح justify-content عمودية.

هل أستخدم flexbox أم grid؟

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

لماذا يتجاوز عنصر flex حاويته؟

لعنصر flex القيمة min-width: auto افتراضيًا، فيرفض أن يصغر عن عرض أطول كلمة فيه أو أعرض ابن له. اضبط min-width: 0 (أو overflow: hidden) على العنصر كي يتمكن من التقلص، مثلًا لكي تعمل text-overflow: ellipsis.

هل يعمل flexbox على العناصر السطرية مثل span؟

نعم. أي عنصر عليه display: flex حاوية flex، ويصبح أبناؤه عناصر flex مهما كانت قيمة display الخاصة بهم، فيتوقف أبناء <span> عن كونهم سطريين ويقبلون العرض والارتفاع والهامش مثل العناصر الكتلية.

Coddy programming languages illustration

تعلّم البرمجة مع Coddy

ابدأ الآن