الإجابة السريعة: text-align على الأب
العنصر <img> عنصر سطري: يقع في سطر النص ككلمة. لذلك توسّطه بالطريقة نفسها التي توسّط بها النص، عبر text-align: center على أبيه:
التنسيق يوضع على الـ div، لا على الصورة. وضع text-align: center على <img> نفسها لا يفعل شيئًا، لأن الصورة لا تحتوي على نص بداخلها لمحاذاته.
الطريقة 2: display block وmargin auto
إن فضّلت تنسيق الصورة نفسها، حوّلها إلى عنصر كتلي وأعطها هوامش جانبية تلقائية. تُقسم المساحة الحرة على الجانبين بالتساوي:
الصورة الرمادية عليها margin: 0 auto لكنها تبقى في بداية السطر: الهوامش التلقائية لا تفعل شيئًا على عنصر سطري. display: block هي القطعة الناقصة. وmax-width: 100% مع height: auto تمنعان الصورة من تجاوز الشاشة الضيقة مع الحفاظ على نسبها.
الطريقة 3: flexbox أو grid، بما في ذلك التوسيط العمودي
لتوسيط صورة في الاتجاهين داخل صندوق، أعطِ الصندوق ارتفاعًا ووسّط محتواه باستخدام grid أو flexbox:
المكافئ في flexbox هو display: flex; justify-content: center; align-items: center;. في الحالتين يحتاج الصندوق إلى ارتفاع أكبر من الصورة، وإلا فلا مساحة للتوسيط فيها. الطرق نفسها توسّط أي عنصر؛ وتقارن صفحة توسيط div بينها جميعًا.
توسيط صورة مع وصف
الصورة مع وصفها مكانها عنصر <figure>. وسّط محتوى الـ figure، فتصطف الصورة والوصف معًا:
عدة صور في صف موسّط
صف من الشعارات أو الصور المصغرة مهمة flexbox. توسّط justify-content: center المجموعة، وتباعد gap بينها، وتسمح flex-wrap بالتفافها على الشاشات الصغيرة مع بقائها موسّطة:
أي طريقة تستخدم
| الحالة | استخدم |
|---|---|
| صورة داخل فقرة أو عنصر كتلي بسيط | text-align: center على الأب |
| لا يمكنك تنسيق إلا الصورة | display: block; margin: 0 auto; |
| التوسيط في الاتجاهين داخل صندوق | Grid مع place-items: center (أو flexbox) على الصندوق |
| صف من الصور | Flexbox مع justify-content: center |
| صورة مع وصف | <figure> مع text-align: center |
| صورة خلفية لا محتوى | background-position: center، راجع background-image |
الطرق القديمة، ولماذا لا تستخدمها
ما زلت ستجد هذه في الدروس القديمة:
<!-- obsolete: do not use -->
<center><img src="logo.png" alt="Logo"></center>
<img src="logo.png" alt="Logo" align="center">
أُزيل <center> والسمة align من HTML. ما زالت المتصفحات تعرض <center> للتوافق مع الصفحات القديمة، وalign="center" على الصورة لا توسّطها أفقيًا أصلًا: تعاملها المتصفحات كمحاذاة عمودية داخل السطر. استخدم إحدى طرق CSS أعلاه.
أخطاء شائعة
text-align: centerعلى<img>. ضعها على الأب.margin: 0 autoعلى صورة سطرية. أضفdisplay: block.- التوسيط العمودي من دون ارتفاع للأب. يتقلص الصندوق إلى حجم الصورة، فلا تبقى مساحة للتوسيط.
float: center. لا توجد قيمة كهذه. العناصر العائمة تذهب إلى أحد الجانبين فقط.- نسيان
alt. الصورة الموسّطة ما زالت تحتاج إلى نص بديل؛ استخدمalt=""للصور الزخرفية البحتة فقط. - صورة ممطوطة. ضبط
widthوheightمعًا في CSS بقيم ذات نسبة مختلفة يشوّهها. اضبط أحدهما واستخدمheight: auto، أو أضفobject-fit: cover.
الأسئلة الشائعة
كيف أوسّط صورة في HTML؟
ضع text-align: center على العنصر الذي يحتويها، مثلًا <p style="text-align: center;"><img src="logo.png" alt="Logo"></p>. الصورة سطرية افتراضيًا، فتتوسط ككلمة من النص.
كيف أوسّط صورة باستخدام margin auto؟
اجعل الصورة عنصرًا كتليًا أولًا: img { display: block; margin: 0 auto; }. الهوامش التلقائية لا توسّط العناصر السطرية، والصورة سطرية حتى تغيّر ذلك.
كيف أوسّط صورة عموديًا وأفقيًا؟
اجعل حاويتها grid (أو flexbox) بارتفاع محدد: .box { display: grid; place-items: center; height: 300px; }. عندها تقع الصورة في منتصف الصندوق.
هل يمكن استخدام الوسم <center> أو align="center" لتوسيط صورة؟
لا. الوسم <center> والسمة align على <img> ملغيان في HTML5. ما زالت المتصفحات تعرض <center> للصفحات القديمة، لكن align="center" على الصورة تحاذيها عموديًا في السطر لا أفقيًا. استخدم CSS.
لماذا توجد فجوة صغيرة تحت الصورة الموسّطة؟
الصورة السطرية تقع على خط أساس النص، تاركة مساحة تحتها للأجزاء النازلة من الحروف. اضبط display: block على الصورة، أو vertical-align: middle، فتختفي الفجوة.