الغوص العميق في ملاءمة الكائن وحجم الخلفية في CSS

نشرت: 2022-03-10
ملخص سريع ↬ في هذه المقالة ، سنتعرف على كيفية object-fit وحجم background-size ، ومتى يمكننا استخدامها ، ولماذا ، جنبًا إلى جنب مع بعض حالات الاستخدام العملية والتوصيات. دعنا نتعمق.

لا يمكننا دائمًا تحميل صور بأحجام مختلفة لعنصر HTML. إذا استخدمنا عرضًا وارتفاعًا لا يتناسبان مع نسبة العرض إلى الارتفاع للصورة ، فقد تكون الصورة إما مضغوطة أو ممتدة. هذا ليس جيدًا ، ويمكن حله إما باستخدام object-fit لعنصر img أو باستخدام background-size .

أولاً ، دعنا نحدد المشكلة. ضع في اعتبارك الشكل التالي:

صورة جيدة المظهر وصورة مضغوطة في المقارنة
صورة جيدة المظهر يتم ضغطها عند استخدامها في أحد مكونات البطاقة. (معاينة كبيرة)

لماذا يحدث هذا؟

سيكون للصورة نسبة عرض إلى ارتفاع ، وسيقوم المتصفح بملء المربع المحتوي بهذه الصورة. إذا كانت نسبة العرض إلى الارتفاع للصورة مختلفة عن العرض والارتفاع المحددين لها ، فستكون النتيجة إما صورة مضغوطة أو ممتدة.

نرى هذا في الشكل التالي:

صورة جيدة المظهر وصورة ممتدة في المقارنة
تختلف نسبة أبعاد الصورة عن المربع المحتوي ، ويتم تمديد الصورة. (معاينة كبيرة)

الحل

لا نحتاج دائمًا إلى إضافة صورة ذات حجم مختلف عندما لا تتوافق نسبة العرض إلى الارتفاع للصورة مع عرض العنصر المحتوي وارتفاعه. قبل الغوص في حلول CSS ، أود أن أوضح لك كيف اعتدنا على القيام بذلك في تطبيقات تحرير الصور:

مثال على صورة ذات حواف علوية وسفلية تم اقتصاصها في قناع
أولاً ، نقوم بتوسيط الصورة عموديًا ، ثم نقوم بتقطيع القناع. هذا يحافظ على نسبة العرض إلى الارتفاع للصورة ويمنعها من الضغط. (معاينة كبيرة)

الآن بعد أن فهمنا كيفية عمل ذلك ، دعنا ندخل في كيفية عمل ذلك في المتصفح. ( تنبيه المفسد: إنه أسهل! )

object-fit

تحدد خاصية object-fit كيف يجب تغيير حجم محتوى عنصر مستبدل مثل img أو video ليناسب الحاوية الخاصة به. القيمة الافتراضية object-fit هي fill ، والتي يمكن أن تؤدي إلى ضغط الصورة أو تمديدها.

لنستعرض القيم الممكنة.

المزيد بعد القفز! أكمل القراءة أدناه ↓

القيم الممكنة object-fit

object-fit: contain

في هذه الحالة ، سيتم تغيير حجم الصورة لتناسب نسبة العرض إلى الارتفاع لحاوياتها. إذا كانت نسبة العرض إلى الارتفاع للصورة لا تتطابق مع الحاوية ، فسيتم تحويلها إلى تنسيق letterbox.

تناسب الكائن: تحتوي على
عند استخدام object-fit: contain ، سيتم تغيير حجم الصورة إلى تنسيق letterbox أو تغيير حجمها وفقًا لذلك. (معاينة كبيرة)

object-fit: cover

هنا ، سيتم أيضًا تغيير حجم الصورة لتلائم نسبة العرض إلى الارتفاع لحاوياتها ، وإذا كانت نسبة العرض إلى الارتفاع للصورة لا تتطابق مع الحاوية ، فسيتم قصها لتلائم.

تناسب الكائن: غطاء
عند استخدام object-fit: cover ، سيتم إما قص الصورة لتلائم أو يتم تغيير حجمها وفقًا لذلك. (معاينة كبيرة)

object-fit: fill

باستخدام هذا ، سيتم تغيير حجم الصورة لتناسب نسبة العرض إلى الارتفاع لحاوياتها ، وإذا كانت نسبة العرض إلى الارتفاع للصورة لا تتطابق مع الحاوية ، فسيتم ضغطها أو شدها. لا نريد ذلك.

تناسب الكائن: ملء
عند استخدام object-fit: fill ، سيتم ضغط الصورة أو شدها أو تغيير حجمها وفقًا لذلك. (معاينة كبيرة)

object-fit: none

في هذه الحالة ، لن يتم تغيير حجم الصورة على الإطلاق ، لا يتم شدها أو ضغطها. إنه يعمل مثل قيمة cover ، لكنه لا يحترم نسبة العرض إلى الارتفاع في الحاوية.

الكائن المناسب: لا شيء
عند استخدام object-fit: none ، لن يتم تغيير حجم الصورة إذا كانت أبعادها مختلفة. (معاينة كبيرة)

بصرف النظر عن object-fit ، لدينا أيضًا خاصية object-position ، المسؤولة عن وضع الصورة داخل حاويتها.

القيم الممكنة object-position

تعمل خاصية object-position بشكل مشابه لخاصية background-position في CSS:

مركز موضع الكائن ، يسار ، يمين
في معظم الأحيان ، يتم استخدام القيمة الافتراضية (على سبيل المثال ، "المركز" أو "50٪ 50٪`). (معاينة كبيرة)

تعمل الكلمات الرئيسية top bottom أيضًا عندما تكون نسبة العرض إلى الارتفاع للمربع المحتوي أكبر رأسيًا:

أعلى وأسفل موضع الكائن
مقارنة object-position: top (يسار) object-position: bottom (يمين). (معاينة كبيرة)

background-size CSS

مع background-size ، يتمثل الاختلاف الأول في أننا نتعامل مع الخلفية ، وليس عنصر HTML ( img ).

القيم الممكنة background-size

القيم المحتملة background-size هي auto ، و contain ، cover .

background-size: auto

باستخدام auto ، ستبقى الصورة بحجمها الافتراضي:

حجم الخلفية: تلقائي
ضع في اعتبارك أن الحجم الافتراضي قد ينتج عنه أحيانًا صورة ضبابية (إذا كانت صغيرة جدًا). (معاينة كبيرة)

background-size: cover

هنا ، سيتم تغيير حجم الصورة لتناسب الحاوية. إذا كانت نسب العرض إلى الارتفاع غير متطابقة ، فسيتم إخفاء الصورة لتناسبها.

حجم الخلفية: الغلاف
عند استخدام background-size: cover ، تأكد من مراعاة نسب العرض إلى الارتفاع للصورة. (معاينة كبيرة)

background-size: contain

في هذه الحالة ، سيتم تغيير حجم الصورة لتناسب الحاوية. إذا كانت نسب العرض متوقفة عن التشغيل ، فسيتم تحويل الصورة إلى letterbox كما هو موضح في المثال التالي:

حجم الخلفية: تحتوي على
background-size: contain تغيير حجم الصورة لتناسب الحاوية. (معاينة كبيرة)

بالنسبة background-position ، فهو مشابه لكيفية عمل object-position . الاختلاف الوحيد هو أن الموضع الافتراضي لموضع object-position يختلف عن موضع background-position .

عندما لا تستخدم object-fit أو background-size

إذا تم إعطاء العنصر أو الصورة ارتفاعًا ثابتًا وكان background-size: cover أو object-fit: cover مطبق عليه ، ستكون هناك نقطة تكون فيها الصورة عريضة جدًا ، وبالتالي تفقد التفاصيل المهمة التي قد تؤثر على كيفية يدرك المستخدم الصورة.

ضع في اعتبارك المثال التالي الذي تم فيه إعطاء الصورة ارتفاعًا ثابتًا:

 .card__thumb { height: 220px; }
مثال حيث تكون الصورة عريضة جدًا نظرًا لارتفاعها الثابت وحاوية البطاقة عريضة جدًا
الصورة المعروضة على اليمين واسعة جدًا لأنها ذات ارتفاع ثابت بينما حاوية البطاقة واسعة جدًا. (معاينة كبيرة)

إذا كانت حاوية البطاقة واسعة جدًا ، فسيؤدي ذلك إلى ما نراه على اليمين (صورة عريضة جدًا). هذا لأننا لا نحدد نسبة العرض إلى الارتفاع.

لا يوجد سوى إصلاح واحد من اثنين لهذا. الأول هو استخدام اختراق الحشو لإنشاء نسبة جوهرية.

 .card__thumb { position: relative; padding-bottom: 75%; height: 0; } .card__thumb img { position: absolute; left: 0; top: 0; width: 100%; height: 100%; object-fit: cover; }

الإصلاح الثاني هو استخدام خاصية CSS الجديدة aspect-ratio . باستخدامه يمكننا القيام بما يلي:

 .card__thumb img { aspect-ratio: 4 / 3; }

ملاحظة : لقد كتبت بالفعل عن خاصية aspect-ratio بالتفصيل في حالة رغبتك في التعرف عليها: "دعنا نتعرف على نسبة العرض إلى الارتفاع في CSS".

حالات الاستخدام والأمثلة

صور المستخدم الرمزية

حالة استخدام مثالية object-fit: cover عبارة عن صور رمزية للمستخدم. غالبًا ما تكون نسبة العرض إلى الارتفاع المسموح بها للصورة الرمزية مربعة. قد يؤدي وضع صورة في حاوية مربعة إلى تشويه الصورة.

صورة رمزية للمستخدم بدون ملاءمة الكائن ومع ملاءمة الكائن: الغلاف
مقارنة بين الصورة الرمزية للمستخدم بدون object-fit object-fit: cover . (معاينة كبيرة)
 .c-avatar { object-fit: cover; }

قائمة الشعارات

قائمة عملاء الأعمال أمر مهم. غالبًا ما نستخدم الشعارات لهذا الغرض. نظرًا لأن الشعارات سيكون لها أحجام مختلفة ، فنحن بحاجة إلى طريقة لتغيير حجمها دون تشويهها.

لحسن الحظ ، object-fit: contain هو حل جيد لذلك.

 .logo__img { width: 150px; height: 80px; object-fit: contain; }
قائمة الشعارات: Airbnb و Domino’s Pizza و Apple Pay و Amazon
يمكن أن يساعدنا استخدام object-fit: contain على تغيير حجم شعارات العملاء دون تشويهها. (معاينة كبيرة)

المادة المصغرة

هذه حالة استخدام شائعة جدًا. قد لا تحتوي حاوية الصورة المصغرة للمقالة دائمًا على صورة بنفس نسبة العرض إلى الارتفاع. يجب إصلاح هذه المشكلة عن طريق نظام إدارة المحتوى (CMS) في المقام الأول ، ولكنها ليست كذلك دائمًا.

 .article__thumb { object-fit: cover; }
الصورة المصغرة للمادة
تعديل الصور المصغرة للمقال مع القليل من المساعدة من object-fit: cover . (معاينة كبيرة)

خلفية البطل

في حالة الاستخدام هذه ، سيعتمد قرار استخدام عنصر img أو خلفية CSS على ما يلي:

  • هل الصورة مهمة؟ إذا تم تعطيل CSS لسبب ما ، فهل نريد أن يرى المستخدم الصورة؟
  • أم أن الغرض من الصورة مجرد ديكور؟

بناءً على إجابتنا ، يمكننا تحديد الميزة التي يجب استخدامها. إذا كانت الصورة مهمة :

استخدم الحالة مع خلفية بطل
لنفترض أن الصورة مهمة ، لأنها موقع متعلق بالطعام. (معاينة كبيرة)
 <section class="hero"> <img class="hero__thumb" src="thumb.jpg" alt="" /> </section>
 .hero { position: relative; } .hero__thumb { position: absolute; left: 0; top: 0; width: 100%; height: 100%; object-fit: cover; }

إذا كانت الصورة مزخرفة ، فيمكننا background-image :

 .hero { position: relative; background-image: linear-gradient(to top, #a34242, rgba(0,0,0,0), url("thumb.jpg"); background-repeat: no-repeat; background-size: cover; }

CSS أقصر في هذه الحالة. تأكد من أن أي نص يتم وضعه فوق الصورة يمكن قراءته والوصول إليه.

إضافة خلفية إلى صورة object-fit: contain

هل تعلم أنه يمكنك إضافة لون خلفية إلى img ؟ سنستفيد من ذلك عند استخدام object-fit: contain .

في المثال أدناه ، لدينا شبكة من الصور. عندما تختلف نسب العرض إلى الارتفاع للصورة والحاوية ، سيظهر لون الخلفية.

 img { object-fit: contain; background-color: #def4fd; }
إضافة لون خلفية إلى صورة ذات ملاءمة الكائن: احتواء
يمكننا استخدام object-fit: contain على لإضافة لون خلفية للصورة. (معاينة كبيرة)

عنصر الفيديو

هل احتجت يومًا إلى video كخلفية؟ إذا كان الأمر كذلك ، فمن المحتمل أنك تريده أن يأخذ العرض والارتفاع الكاملين لوالده.

 .hero { position: relative; background-color: #def4fd; } .hero__video { position: aboslute; left: 0; top: 0; width: 100%; height: 100%; }
شخصية لا يغطي الفيديو فيها الخلفية الرئيسية
القيمة الافتراضية object-fit لعنصر video contain . كما ترى هنا ، لا يغطي الفيديو الخلفية الرئيسية ، على الرغم من احتوائه على position: absolute ، width: 100% ، height: 100% . (معاينة كبيرة)

ولجعله يغطي عرض والارتفاع الأصل ، نحتاج إلى تجاوز القيمة الافتراضية object-fit :

 .hero__video { /* other styles */ object-fit: cover; }
شكل حيث يغطي الفيديو العرض والارتفاع الكاملين لوالده.
يغطي الفيديو الآن العرض والارتفاع الكاملين لوالده. (معاينة كبيرة)

خاتمة

كما رأينا ، فإن كلاً object-fit وحجم background-size مفيدان جدًا في التعامل مع نسب عرض إلى ارتفاع مختلفة للصورة. لن نتحكم دائمًا في تعيين الأبعاد المثالية لكل صورة ، وهنا تبرز ميزتا CSS هاتان.

تذكير ودي بشأن الآثار المترتبة على إمكانية الوصول للاختيار بين عنصر img وخلفية CSS: إذا كانت الصورة مزخرفة تمامًا ، فانتقل إلى خلفية CSS. خلاف ذلك ، فإن img تكون أكثر ملاءمة.

آمل أن تكون قد وجدت هذه المقالة مفيدة. شكرا لقرائتك.