justify-content وalign-items بجملة واحدة لكل منهما
في حاوية flex، تنشر justify-content العناصر على المحور الرئيسي (على امتداد الصف)، وتصفّها align-items على المحور العرضي (صعودًا ونزولًا في الصف). كلتاهما توضع على الحاوية:
الصندوق موسّط في الاتجاهين: على البعد نفسه من حافتي البداية والنهاية، ومن الأعلى والأسفل. احذف height: 140px ولن يبقى لـ align-items: center ما تفعله، لأن الحاوية تتقلص إلى ارتفاع العنصر نفسه.
كل قيم justify-content مع القياس
كل صف أدناه هو العناصر الثلاثة نفسها مع justify-content مختلفة. الأرقام في التسمية فوق كل صف هي الفجوات التي تركها المتصفح: قبل العنصر الأول، وبين العناصر، وبعد الأخير.
عرض الحاوية 420px والعناصر تأخذ 180px، فتبقى 240px من المساحة الحرة. أين تذهب:
| القيمة | تذهب المساحة الحرة | الفجوات في المثال |
|---|---|---|
flex-start (وstart) | كلها بعد العناصر | 0 / 0 / 0 / 240 |
center | نصفها قبل ونصفها بعد | 120 / 0 / 0 / 120 |
flex-end (وend) | كلها قبل العناصر | 240 / 0 / 0 / 0 |
space-between | بين العناصر فقط | 0 / 120 / 120 / 0 |
space-around | متساوية على جانبي كل عنصر، فتحصل الأطراف على النصف | 40 / 80 / 80 / 40 |
space-evenly | كل الفجوات متساوية، بما فيها الأطراف | 60 / 60 / 60 / 60 |
تتبع flex-start اتجاه flex، وتتبع start اتجاه الكتابة. لا تختلفان إلا مع row-reverse أو column-reverse، حيث تكون flex-start في الطرف المعكوس.
كل قيم align-items
تعمل align-items بشكل متعامد مع الصف. للعناصر أدناه ارتفاعات مختلفة كي ترى ما تفعله كل قيمة بها:
| القيمة | ما يحدث على المحور العرضي |
|---|---|
stretch (الافتراضي) | العناصر التي بلا ارتفاع مضبوط تكبر لتملأ الحاوية |
flex-start (وstart) | تقع العناصر في الأعلى، بارتفاعها الخاص |
center | تتوسط العناصر، بارتفاعها الخاص |
flex-end (وend) | تقع العناصر في الأسفل |
baseline | تتحرك العناصر كي تشترك أسطر النص الأولى في خط أساس واحد |
في صندوق baseline تقع التسميات الثلاث «Ag» على خط واحد رغم أن الأولى أكبر والثانية فوقها حشو. هذه هي القيمة المناسبة لصف يخلط عنوانًا كبيرًا بنص صغير، أو تسمية بحقل إدخال.
انقر للمحاذاة
انقر أي خلية في الشبكة ذات الثلاثة في ثلاثة. ينتقل الصندوق إليها، وتُطبع أدناه CSS التي تضعه هناك:
تغيّر صفوف الأداة align-items، وتغيّر أعمدتها justify-content. الخلية الوسطى هي «توسيط div» الكلاسيكي.
في العمود، تتبادل الخاصيتان
تتبع justify-content المحور الرئيسي دائمًا. مع flex-direction: column يكون المحور الرئيسي عموديًا، فتحرك justify-content العناصر صعودًا ونزولًا وتحركها align-items عرضيًا:
إن خلطت بينهما، بدّل الخاصيتين بدل إعادة كتابة التخطيط.
align-self والهوامش التلقائية: عنصر واحد فقط
align-self على عنصر تتجاوز align-items لذلك العنصر. لا توجد justify-self في flexbox؛ لتحريك عنصر واحد على المحور الرئيسي، أعطه هامشًا auto، فيأخذ كل المساحة الحرة على ذلك الجانب:
ينزل العنصر الأخضر وحده إلى الأسفل، ويُدفع العنصر الكهرماني إلى الطرف البعيد من الصف بينما يبقى الآخرون في البداية.
حين توجد عدة أسطر: align-content
تحاذي align-items العناصر داخل سطرها. وحين تلتف الحاوية على عدة أسطر، تباعد align-content بين الأسطر نفسها، وتقبل قيم justify-content نفسها. لا تفعل شيئًا في حاوية nowrap، التي يملأ سطرها الوحيد ارتفاع الحاوية دائمًا. تعرضها صفحة flex-wrap.
أخطاء شائعة
- الخلط بين المحورين.
justify-contentهي اتجاه الانسياب، وalign-itemsمتعامدة معه. في العمود يكون التوسيط العموديjustify-content: center. - لا مساحة حرة. العنصر الذي عليه
flex: 1يأخذ كل المساحة، فلا يبقى لـjustify-contentما توزعه. ويحدث الشيء نفسه حين تكون الحاويةinline-flexوبعرض عناصرها تمامًا. - لا ارتفاع لـ
align-items. الحاوية التي بارتفاع محتواها لا تترك شيئًا للمحاذاة. اضبطheightأوmin-height. - البحث عن
justify-selfفي flexbox. تُتجاهل هناك. استخدمmargin-inline-start: auto(أوmargin-left: auto) على العنصر. align-items: stretchلا تمدّ. العنصر الذي لهheightخاص يحتفظ به. احذف الارتفاع (استخدمmin-heightإن كان يحتاج إلى حد أدنى).- وضع الخاصيتين على العناصر. كلتاهما توضع على حاوية flex. وحدها
align-selfتوضع على العنصر.
الأسئلة الشائعة
ما الفرق بين justify-content وalign-items؟
توزّع justify-content العناصر على المحور الرئيسي، وهو اتجاه انسيابها (أفقي في flex-direction: row). وتضعها align-items على المحور العرضي (عمودي في الصف). وفي العمود تتبادلان: تصبح justify-content عمودية.
ما الفرق بين space-between وspace-around وspace-evenly؟
لا تضع space-between أي مسافة قبل العنصر الأول ولا بعد الأخير وتقسم الباقي بين العناصر. وتعطي space-around كل عنصر مسافة متساوية على جانبيه، فتحصل الأطراف على نصف فجوة. أما space-evenly فتجعل كل الفجوات متساوية، بما فيها الأطراف.
لماذا لا تعمل justify-content؟
غالبًا لا توجد مساحة حرة لتوزيعها: لعنصر ما flex-grow أو flex: 1، أو الحاوية بعرض عناصرها فقط (مثلًا display: inline-flex أو حاوية عائمة). وتحقق أيضًا أن display: flex على الأب لا على العناصر.
لماذا لا توسّط align-items center عموديًا؟
الحاوية على الأرجح بارتفاع محتواها تمامًا، فلا يوجد ما يُوسَّط داخله. أعطِ حاوية flex ارتفاعًا أو min-height، وستتحرك العناصر إلى منتصفها.
ماذا تفعل align-self؟
تتجاوز align-self قيمة align-items الخاصة بالحاوية لعنصر واحد. مثلًا align-self: flex-end على ابن واحد تنقل ذلك الابن وحده إلى نهاية المحور العرضي بينما يبقى الآخرون حيث وضعتهم align-items.
هل توجد justify-self في flexbox؟
لا. يتجاهل flexbox الخاصية justify-self، لأن المحور الرئيسي مشترك بين كل العناصر. لدفع عنصر واحد على المحور الرئيسي استخدم هامشًا auto، مثل margin-inline-start: auto. أما justify-self فتعمل في grid.