<picture>
แท็กHTML5 จะช่วยให้คุณแก้ไขแหล่งรูปภาพที่ถูกต้องโดยขึ้นอยู่กับความกว้างของหน้าจอ
เห็นได้ชัดว่าพฤติกรรมของเบราว์เซอร์ไม่ได้เปลี่ยนแปลงไปมากในช่วง 5 ปีที่ผ่านมาและหลายคนยังคงดาวน์โหลดภาพที่ซ่อนอยู่แม้ว่าจะมีการdisplay: none
ตั้งค่าคุณสมบัติไว้ก็ตาม
แม้ว่าจะมีการสอบถามสื่อการแก้ปัญหามันจะมีประโยชน์เฉพาะเมื่อภาพถูกตั้งเป็นพื้นหลังใน CSS
ในขณะที่ฉันคิดว่ามีเพียงวิธีการแก้ปัญหา JS (ปัญหาโหลดขี้เกียจ , picturefill , ฯลฯ ), ปรากฏว่ามีวิธีการแก้ปัญหา HTML บริสุทธิ์ที่ดีที่มาพร้อมกับ HTML5
และนั่นคือ<picture>
แท็ก
นี่คือวิธีที่MDNอธิบาย:
HTML <picture>
องค์ประกอบเป็นภาชนะที่ใช้ในการระบุหลาย<source>
องค์ประกอบเฉพาะ<img>
ที่อยู่ในนั้น เบราว์เซอร์จะเลือกแหล่งที่เหมาะสมที่สุดตามเค้าโครงปัจจุบันของหน้า (ข้อ จำกัด ของกล่องที่ภาพจะปรากฏขึ้น) และอุปกรณ์ที่จะแสดงบน (เช่นอุปกรณ์ปกติหรือ hiDPI)
และนี่คือวิธีใช้:
<picture>
<source srcset="mdn-logo-wide.png" media="(min-width: 600px)">
<img src="mdn-logo-narrow.png" alt="MDN">
</picture>
ตรรกะที่อยู่เบื้องหลัง
เบราว์เซอร์จะโหลดแหล่งที่มาของimg
แท็กเฉพาะในกรณีที่ไม่มีกฎของสื่อที่ใช้ เมื่อ<picture>
เบราว์เซอร์ไม่รองรับองค์ประกอบองค์ประกอบนั้นจะกลับไปสู่การแสดงimg
แท็กอีกครั้ง
โดยปกติคุณจะต้องใส่ภาพที่เล็กที่สุดเป็นแหล่งกำเนิดของภาพ<img>
และไม่โหลดภาพที่มีขนาดใหญ่สำหรับหน้าจอขนาดใหญ่ ในทางกลับกันหากใช้กฎของสื่อแหล่งที่มาของ<img>
จะไม่ถูกดาวน์โหลด แต่จะดาวน์โหลดเนื้อหาของ<source>
แท็กที่เกี่ยวข้อง
ข้อผิดพลาดเฉพาะที่นี่คือหากองค์ประกอบไม่ได้รับการสนับสนุนโดยเบราว์เซอร์ก็จะโหลดภาพขนาดเล็กเท่านั้น ในทางกลับกันในปี 2560 เราควรคิดและกำหนดรหัสในแนวทางแรกของมือถือ
และก่อนที่จะมีใครออกไปด้วยนี่คือการสนับสนุนเบราว์เซอร์ปัจจุบันสำหรับ<picture>
:
เบราว์เซอร์เดสก์ท็อป
เบราว์เซอร์มือถือ
เพิ่มเติมเกี่ยวกับการสนับสนุนเบราว์เซอร์ที่คุณสามารถค้นหาบนฉันสามารถใช้
สิ่งที่ดีคือว่าhtml5pleaseของประโยคคือการใช้กับทางเลือก และโดยส่วนตัวฉันตั้งใจจะให้คำแนะนำ
เพิ่มเติมเกี่ยวกับแท็กที่คุณจะพบในสเปคของ W3C มีข้อจำกัดความรับผิดชอบที่ฉันพบว่ามีความสำคัญที่จะพูดถึง:
picture
องค์ประกอบจะค่อนข้างแตกต่างจากที่ดูคล้ายกันvideo
และaudio
องค์ประกอบ ในขณะที่พวกเขาทั้งหมดมีsource
องค์ประกอบsrc
แอตทริบิวต์ขององค์ประกอบที่มาไม่มีความหมายเมื่อองค์ประกอบซ้อนอยู่ภายในpicture
องค์ประกอบและอัลกอริทึมการเลือกทรัพยากรที่แตกต่างกัน เช่นเดียวกับที่picture
องค์ประกอบตัวเองไม่ได้แสดงอะไร; เพียง แต่ให้บริบทสำหรับimg
องค์ประกอบที่มีอยู่ซึ่งทำให้สามารถเลือกได้จากหลาย URL
ดังนั้นสิ่งที่กล่าวคือช่วยให้คุณปรับปรุงประสิทธิภาพเมื่อโหลดภาพโดยให้บริบทบางอย่าง
และคุณยังคงสามารถใช้เวทย์มนตร์ CSS เพื่อซ่อนภาพบนอุปกรณ์ขนาดเล็ก:
<style>
picture { display: none; }
@media (min-width: 600px) {
picture {
display: block;
}
}
</style>
<picture>
<source srcset="the-real-image-source" media="(min-width: 600px)">
<img src="a-1x1-pixel-image-that-will-be-hidden-in-the-css" alt="MDN">
</picture>
ดังนั้นเบราว์เซอร์จะไม่แสดงภาพที่แท้จริงและจะดาวน์โหลด1x1
ภาพพิกเซลเท่านั้น(ซึ่งสามารถแคชได้หากคุณใช้มากกว่าหนึ่งครั้ง) อย่างไรก็ตามโปรดทราบว่าหาก<picture>
เบราว์เซอร์ไม่รองรับแท็กแม้ในหน้าจอ descktop ภาพที่แท้จริงจะไม่ปรากฏ (ดังนั้นคุณจะต้องสำรองข้อมูล polyfill ไว้ที่นั่น)