Kodokon kodokon.com

รูปภาพแบบตอบสนอง: srcset, sizes และ picture

ส่งรูปภาพที่เหมาะสมให้กับหน้าจอที่เหมาะสมด้วย srcset และ sizes, สงวน picture ไว้สำหรับการกำกับศิลป์ และเชี่ยวชาญการโหลดแบบขี้เกียจ

9 นาที · 3 คำถาม

เปิดบทเรียนนี้ใน Kodokon

รูปภาพมักคิดเป็นครึ่งหนึ่งของน้ำหนักหน้าเว็บ: มันเป็นคานงัดด้านประสิทธิภาพอันดับแรกของคุณ กลไกหลักคือ srcset พร้อมตัวบอกขนาด w ซึ่งประกาศความกว้างจริงของไฟล์ที่มีอยู่ จับคู่กับ sizes ซึ่งประกาศความกว้างการแสดงผลที่ตั้งใจไว้ จุดสำคัญ: เบราว์เซอร์เลือกรูปภาพผ่านpreload scanner ก่อนที่มันจะคำนวณเลย์เอาต์ CSS ด้วยซ้ำ หากไม่มี sizes มันจะสันนิษฐานว่าเป็น 100vw และมักดาวน์โหลดมากเกินความจำเป็น การเลือกสุดท้ายยังคำนึงถึงความหนาแน่นของหน้าจอด้วย: หน้าจอ 2x บนพื้นที่ 400 px จะดึงไฟล์ขนาดราว 800 px

HTML
<img src="harbor-800.jpg"
     srcset="harbor-400.jpg 400w,
             harbor-800.jpg 800w,
             harbor-1600.jpg 1600w"
     sizes="(max-width: 600px) 100vw, 50vw"
     alt="Old harbor at sunset"
     width="800" height="533">
ตัวบอกขนาด w + sizes: เบราว์เซอร์ปรับให้เหมาะสมเอง

ด้วย srcset/sizes เบราว์เซอร์ยังคงเป็นผู้ควบคุม: มันอาจส่งตัวเลือกที่เบากว่าตามความหนาแน่นหรือการตั้งค่าประหยัดข้อมูล ส่วน <picture> พลิกตรรกะ: คุณเป็นผู้กำหนดแหล่งที่มาผ่าน <source media> หรือ <source type> สงวนมันไว้สองกรณี: การกำกับศิลป์ (ครอปต่างกันบนมือถือ ไม่ใช่แค่ขนาด) และการเจรจารูปแบบ (AVIF หรือ WebP พร้อมทางสำรองเป็น JPEG) สำหรับการปรับขนาดง่าย ๆ picture เป็นความซับซ้อนที่ไม่จำเป็น

HTML
<picture>
  <source media="(max-width: 600px)"
          srcset="hero-square.jpg">
  <source type="image/avif"
          srcset="hero-wide.avif">
  <img src="hero-wide.jpg" alt="Museum facade"
       width="1200" height="600">
</picture>
picture: ครอปใหม่บนมือถือและรูปแบบสมัยใหม่พร้อมทางสำรอง

สำหรับทุกอย่างที่เหลือบนหน้า loading="lazy" จะเลื่อนการดาวน์โหลดออกไปจนกว่ารูปภาพจะเข้าใกล้ viewport แบบเนทีฟและไม่ต้องใช้ JavaScript จับคู่มันกับ decoding="async" เพื่อให้การถอดรหัสไม่บล็อกการเรนเดอร์ และเหนือสิ่งอื่นใดกับ width และ height: เบราว์เซอร์คำนวณอัตราส่วนภาพและจองพื้นที่ไว้ ซึ่งกำจัดการเลื่อนเลย์เอาต์ (CLS) สำหรับรูปภาพวิกฤต ให้ทำตรงข้ามกับ lazy: fetchpriority="high"

HTML
<img src="gallery-01.jpg"
     alt="Exhibition hall"
     loading="lazy" decoding="async"
     width="800" height="600">
รูปภาพนอกจอ: lazy, async และมิติที่จองไว้

ทดสอบความรู้

ตรวจสอบว่าคุณจำประเด็นสำคัญของบทเรียนนี้ได้ครบถ้วน

  1. แอตทริบิวต์ sizes มีไว้เพื่ออะไรกันแน่?
    • ปรับขนาดรูปภาพในฝั่ง CSS
    • ประกาศความกว้างการแสดงผลที่ตั้งใจไว้เพื่อให้เบราว์เซอร์เลือกจาก srcset ได้
    • จำกัดน้ำหนักสูงสุดของไฟล์ที่ดาวน์โหลด
  2. ในกรณีใดที่ต้องใช้ <picture> แทน srcset ธรรมดา?
    • เพื่อส่งรูปภาพเดียวกันที่ความกว้างหลายขนาด
    • สำหรับการครอปที่ต่างกันในแต่ละหน้าจอ หรือรูปแบบสมัยใหม่พร้อมทางสำรอง
    • เพื่อเปิดใช้งานการโหลดแบบขี้เกียจแบบเนทีฟ
  3. loading="lazy" ส่งผลอย่างไรต่อรูป hero ของคุณที่มองเห็นตอนโหลด?
    • ไม่มีผล แอตทริบิวต์ถูกละเว้นเหนือขอบพับ
    • มันทำให้การโหลดช้าลงและกระทบ LCP
    • มันปรับปรุง LCP โดยจัดลำดับความสำคัญให้รูปภาพ