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

flex-wrap وflex-direction في CSS: الصفوف والأعمدة والالتفاف

تقرر flex-wrap هل تنضغط عناصر flex في سطر واحد أم تنتقل إلى السطر التالي، وتقرر flex-direction هل تنساب في صف أم في عمود. تعلّم الاثنتين بأمثلة حية، والاختصار flex-flow، وalign-content، وصف بطاقات متجاوب من دون استعلامات وسائط.

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

flex-wrap: سطر واحد، أو بقدر ما يلزم

افتراضيًا تبقي حاوية flex كل عناصرها في سطر واحد (flex-wrap: nowrap) وتقلصها لتتسع. أما flex-wrap: wrap فتتركها تحتفظ بحجمها وتنتقل إلى السطر التالي بدلًا من ذلك:

كل عنصر يطلب 100px، وهي خمسة عناصر في صندوق عرضه 340px. خمسة عناصر وأربع فجوات بعرض 8px تحتاج إلى 532px، فمن دون التفاف يُضغط كل عنصر إلى نحو 62px، لأن عناصر flex تتقلص افتراضيًا. ومع wrap تبقى 100px: يتسع ثلاثة في السطر الأول وينتقل الاثنان الآخران إلى سطر ثانٍ.

قيم flex-wrap

القيمةما يحدث
nowrap (الافتراضي)سطر واحد. تتقلص العناصر، وتتجاوز الحاوية حين لا تستطيع التقلص أكثر
wrapالعناصر التي لا تتسع تبدأ سطرًا جديدًا في الأسفل
wrap-reverseمثلها، لكن الأسطر الجديدة تتكدس إلى الأعلى: السطر الأول في الأسفل

راقب العناصر تلتف

اسحب المنزلق لتغيير عرض الحاوية. تعدّ القراءة الأسطر وتذكر عدد العناصر في كل منها:

عند 400px يتسع في السطر أربعة عناصر بعرض 90px مع ثلاث فجوات بعرض 8px (384px)، فتحصل على 4 + 2. اسحب نحو 620px فتتسع العناصر الستة في سطر واحد؛ واسحب نحو 120px فيحصل كل عنصر على سطر خاص به.

flex-direction: صف أم عمود

تضبط flex-direction اتجاه انسياب العناصر، وهو المحور الرئيسي:

القيمةتنساب العناصرالعنصر الأول
row (الافتراضي)جنبًا إلى جنب، باتجاه الكتابةفي بداية السطر
row-reverseجنبًا إلى جنب، معكوسةفي نهاية السطر
columnمتكدسة، من الأعلى إلى الأسفلفي الأعلى
column-reverseمتكدسة، من الأسفل إلى الأعلىفي الأسفل

في صندوقي row تتمدد العناصر إلى الارتفاع الكامل للصندوق، لأن align-items: stretch تعمل بشكل متعامد مع الصف. وفي صندوقي column تتمدد إلى العرض الكامل بدلًا من ذلك، للسبب نفسه. دار المحوران، ودارت معهما كل خصائص المحاذاة (تعرض صفحة justify-content ذلك بالتفصيل).

flex-flow: الاثنتان في سطر واحد

flex-flow اختصار لـ flex-direction ثم flex-wrap:

.cards { flex-flow: row wrap; }      /* flex-direction: row; flex-wrap: wrap; */
.stack { flex-flow: column nowrap; } /* flex-direction: column; flex-wrap: nowrap; */

بطاقات متجاوبة بالالتفاف ومن دون استعلام وسائط

أعطِ كل عنصر حجمًا ابتدائيًا بـ flex: 1 1 180px ودع الصف يلتف. كل عنصر يكبر ليملأ سطره، وحين لا يتسع السطر لعنصر آخر بعرض 180px، يلتف العنصر التالي:

في معاينة بعرض نحو 800px تتسع ثلاث بطاقات في السطر الأول (نحو 253px لكل منها) وتتقاسم البطاقتان الأخيرتان السطر الثاني، حيث تكبر كل منهما إلى نحو 386px. هكذا يعمل flexbox: كل سطر يوزع مساحته الخاصة، فتصبح البطاقات في سطر أخير قصير أعرض من التي فوقها. إن أردت أن تبقى البطاقة الأخيرة بعرض الأخريات، استخدم grid مع repeat(auto-fill, minmax(180px, 1fr)) بدلًا من ذلك (راجع صفحة grid).

align-content: التباعد بين الأسطر

حين تلتف الحاوية وتكون أطول من أسطرها، تقرر align-content أين تذهب الأسطر. تقبل قيم justify-content نفسها، إضافةً إلى stretch:

في الصندوق الأول يقع السطران في الأعلى. وفي الثاني يقع السطر الأول في الأعلى والثاني في الأسفل، وكل الارتفاع الفائض بينهما.

الترتيب المعكوس وسهولة الوصول

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

أخطاء شائعة

  • عناصر تتقلص بدل أن تلتف. العناصر ذات flex: 1 تبدأ من flex-basis تساوي 0 وتنضغط في سطر واحد. أعطها أساسًا حقيقيًا، مثل flex: 1 1 200px.
  • وضع flex-wrap على العناصر. مكانها حاوية flex.
  • استخدام align-items للتباعد بين الأسطر الملتفة. تلك تحاذي العناصر داخل كل سطر؛ أما الأسطر نفسها فتتحرك بـ align-content.
  • عنصر أخير وحيد ممدود على الصف كله. هذا أثر flex-grow على سطر فيه عنصر واحد. استخدم grid إن كان يجب أن تكون كل البطاقات بالعرض نفسه.
  • توقع أن تملأ flex-direction: column ارتفاعًا. حاوية العمود بارتفاع محتواها فقط ما لم تعطها height، فلا يبقى لـ justify-content مجال للعمل.

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

ماذا تفعل flex-wrap: wrap؟

تسمح لعناصر flex بالانتقال إلى سطر جديد حين لا تتسع في صف واحد. ومع القيمة الافتراضية nowrap تبقى العناصر في سطر واحد وتتقلص، أو تتجاوز الحاوية إن لم يعد بإمكانها التقلص.

لماذا لا تعمل flex-wrap؟

الالتفاف لا يحدث إلا حين يكون مجموع الأحجام الابتدائية للعناصر أكبر من الحاوية. العناصر ذات flex: 1 تبدأ من flex-basis تساوي 0، فلا تلتف أبدًا؛ أعطها حجمًا ابتدائيًا حقيقيًا (flex: 1 1 200px أو width: 200px). وتحقق أيضًا أن flex-wrap على حاوية flex لا على العناصر.

ما الفرق بين flex-direction row وcolumn؟

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

ما هي flex-flow؟

اختصار لـ flex-direction وflex-wrap في تصريح واحد: flex-flow: row wrap; هي نفسها flex-direction: row; flex-wrap: wrap;.

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

تضع align-items العناصر داخل سطرها. أما align-content فتضع الأسطر نفسها داخل الحاوية، لذلك لا تهم إلا حين يكون للحاوية flex-wrap: wrap وتكون أطول من أسطرها.

Coddy programming languages illustration

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

ابدأ الآن