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 وتكون أطول من أسطرها.