เจาะลึกเข้าไปในวัตถุพอดีและขนาดพื้นหลังใน CSS

เผยแพร่แล้ว: 2022-03-10
สรุปโดยย่อ ↬ ในบทความนี้ เราจะพูดถึงวิธีการทำงาน object-fit และ background-size เมื่อเราสามารถใช้งานได้ และเหตุผล รวมถึงกรณีการใช้งานและคำแนะนำที่เป็นประโยชน์บางประการ มาดำดิ่งกัน

เราไม่สามารถโหลดรูปภาพที่มีขนาดต่างกันสำหรับองค์ประกอบ HTML ได้เสมอไป หากเราใช้ความกว้างและความสูงที่ไม่เป็นสัดส่วนกับอัตราส่วนกว้างยาวของรูปภาพ รูปภาพนั้นอาจถูกบีบอัดหรือยืดออก นั่นไม่ดี และสามารถแก้ไขได้ด้วย object-fit สำหรับองค์ประกอบ img หรือโดยใช้ background-size

ขั้นแรก มากำหนดปัญหากันก่อน พิจารณารูปต่อไปนี้:

รูปหล่อกับรูปย่อ
รูปภาพดูดีที่ถูกบีบเมื่อนำมาใช้ในส่วนประกอบการ์ด (ตัวอย่างขนาดใหญ่)

ทำไมสิ่งนี้ถึงเกิดขึ้น?

รูปภาพจะมีอัตราส่วนกว้างยาว และเบราว์เซอร์จะเติมกล่องที่มีรูปภาพนั้น หากอัตราส่วนกว้างยาวของรูปภาพแตกต่างจากความกว้างและความสูงที่ระบุ ผลลัพธ์จะเป็นรูปภาพที่บีบหรือขยาย

เราเห็นสิ่งนี้ในรูปต่อไปนี้:

ภาพที่ดูดีและภาพที่ยืดเยื้อในการเปรียบเทียบ
อัตราส่วนกว้างยาวของรูปภาพแตกต่างจากกล่องที่บรรจุ และรูปภาพจะขยายออก (ตัวอย่างขนาดใหญ่)

การแก้ไขปัญหา

เราไม่จำเป็นต้องเพิ่มรูปภาพที่มีขนาดต่างกันเสมอไปเมื่ออัตราส่วนกว้างยาวของรูปภาพไม่สอดคล้องกับความกว้างและความสูงขององค์ประกอบที่มีอยู่ ก่อนดำดิ่งสู่โซลูชัน CSS ฉันต้องการแสดงให้คุณเห็นว่าเราเคยทำสิ่งนี้ในแอปแก้ไขรูปภาพอย่างไร:

ตัวอย่างรูปภาพที่มีขอบบนและล่างครอบตัดด้วยมาสก์
ขั้นแรก เราจะจัดกึ่งกลางรูปภาพในแนวตั้ง จากนั้นจึงตัดเป็นมาส์ก ซึ่งจะรักษาอัตราส่วนภาพของภาพและป้องกันไม่ให้ถูกบีบอัด (ตัวอย่างขนาดใหญ่)

ตอนนี้เราเข้าใจวิธีการทำงานแล้ว มาดูวิธีการทำงานในเบราว์เซอร์กัน ( แจ้งเตือนสปอยเลอร์: ง่ายกว่า! )

CSS object-fit

คุณสมบัติ object-fit กำหนดว่าเนื้อหาขององค์ประกอบที่ถูกแทนที่ เช่น img หรือ video ควรปรับขนาดให้พอดีกับคอนเทนเนอร์อย่างไร ค่าดีฟอลต์สำหรับ object-fit คือ fill ซึ่งอาจส่งผลให้รูปภาพถูกบีบหรือยืดออก

มาดูค่าที่เป็นไปได้กัน

เพิ่มเติมหลังกระโดด! อ่านต่อด้านล่าง↓

ค่าที่เป็นไปได้สำหรับ object-fit

object-fit: contain

ในกรณีนี้ รูปภาพจะถูกปรับขนาดให้พอดีกับอัตราส่วนกว้างยาวของคอนเทนเนอร์ หากอัตราส่วนกว้างยาวของรูปภาพไม่ตรงกับคอนเทนเนอร์ จะเป็นแถบดำแถบดำ

พอดีกับวัตถุ: มี
เมื่อใช้ object-fit: contain รูปภาพจะมีแถบดำบนแถบดำหรือปรับขนาดตามนั้น (ตัวอย่างขนาดใหญ่)

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 (ขวา) (ตัวอย่างขนาดใหญ่)

CSS background-size

ด้วย background-size ข้อแตกต่างประการแรกคือเรากำลังจัดการกับพื้นหลัง ไม่ใช่องค์ประกอบ HTML ( img )

ค่าที่เป็นไปได้สำหรับ background-size

ค่าที่เป็นไปได้สำหรับ background-size คือ auto , contain และ cover

background-size: auto

ด้วย auto รูปภาพจะอยู่ที่ขนาดเริ่มต้น:

ขนาดพื้นหลัง: auto
โปรดทราบว่าบางครั้งขนาดเริ่มต้นอาจทำให้ภาพไม่ชัด (หากมีขนาดเล็กเกินไป) (ตัวอย่างขนาดใหญ่)

background-size: cover

ที่นี่ รูปภาพจะถูกปรับขนาดให้พอดีกับคอนเทนเนอร์ หากอัตราส่วนภาพไม่เท่ากัน รูปภาพจะถูกปิดบังให้พอดี

ขนาดพื้นหลัง: ปก
เมื่อใช้ background-size: cover อย่าลืมพิจารณาอัตราส่วนกว้างยาวของรูปภาพด้วย (ตัวอย่างขนาดใหญ่)

background-size: contain

ในกรณีนี้ รูปภาพจะถูกปรับขนาดให้พอดีกับคอนเทนเนอร์ หากอัตราส่วนภาพปิดอยู่ รูปภาพจะมีแถบดำด้านบนสุดตามที่แสดงในตัวอย่างถัดไป:

ขนาดพื้นหลัง: มี
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 คืออวาตาร์ของผู้ใช้ อัตราส่วนภาพที่อนุญาตสำหรับอวาตาร์มักจะเป็นสี่เหลี่ยมจัตุรัส การวางรูปภาพในคอนเทนเนอร์สี่เหลี่ยมอาจทำให้รูปภาพบิดเบี้ยว

อวาตาร์ของผู้ใช้ที่ไม่มีอ็อบเจกต์พอดีและพอดีอ็อบเจกต์: 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
เราสามารถใช้ 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 จะเหมาะสมกว่า

ฉันหวังว่าคุณจะพบว่าบทความนี้มีประโยชน์ ขอบคุณสำหรับการอ่าน.