ในปัจจุบัน เรื่อง Responsive Design เป็นเรื่องที่สำคัญมาก เนื่องจากการเข้าถึงโลกอินเทอร์เน็ตในปัจจุบันไม่ได้มาจาก Desktop อย่างเดียวแล้ว แต่มาจากอุปกรณ์ต่างๆ เช่น Mobile และ Tablet รวมถึงอุปกรณ์อื่นๆด้วย ซึ่งสิ่งที่นักพัฒนาและนักออกแบบควรจะทำก็คือ ปรับขนาดให้เหมาะสมกับขนาดหน้าจอที่หลากหลาย ซึ่งรวมไปถึงกระบวนการทำงานให้เหมาะสมด้วย เพราะอุปกรณ์ขนาดเล็ก โดยส่วนมากแล้วก็จะมีข้อจำกัดในเรื่องหน่วยประมวลผลซึ่งเล็กตามไปด้วย เราจึงต้องปรับอะไรกันเพิ่มเติมอีกหน่อยนอกเหนือจากการออกแบบเพียงอย่างเดียว โดยในบทความนี้จะกล่าวถึงเรื่องไฟล์รูปภาพที่จะเอามาทำให้เป็นแบบ Responsive กันครับ
Picturefill.js
Responsive Images เราสามารถทำได้โดยใช้ div ครับ แต่อย่างไรก็ตาม Picturefill (ผู้พัฒนาคือ Scott Jehl) จะสามารถทำงานได้ดีกับเบราว์เซอร์ที่รองรับ CSS3 media queries ครับ ซึ่งเบราว์เซอร์หลักที่เราจะใช้งานด้วยก็เป็นเบราว์เซอร์บน Mobile, Tablet อยู่แล้ว สำหรับ IE ยังคงต้องใช้วิธีอื่นอยู่ครับ และ Picturefill นี้จะทำงานได้เป๊ะขึ้นเมื่องานร่วมกับ matchMedia polyfill ครับ เพื่อให้รองรับ media-query สำหรับเบราว์เซอร์ที่ไม่มี matchMedia ครับ
อย่างไรก็ตาม matchMedia และ matchMedia polyfill เราไม่มีหรือไม่ต้องเรียกใช้ก็ได้ครับ picturefill ก็ยังคงทำงานได้ แต่ว่าเรียกใช้เพื่อให้รองรับ media attributes สำหรับ picture, และ source elements ครับ เพื่อความเป๊ะ
โค้ดตัวอย่าง
<div data-picture data-alt="A giant stone face at The Bayon temple in Angkor Thom, Cambodia">
<div data-src="small.jpg"></div>
<div data-src="medium.jpg" data-media="(min-width: 400px)"></div>
<div data-src="large.jpg" data-media="(min-width: 800px)"></div>
<div data-src="extralarge.jpg" data-media="(min-width: 1000px)"></div>
<!-- Fallback content for non-JS browsers. Same img src as the initial, unqualified source element. -->
<noscript>
<img src="external/imgs/small.jpg" alt="A giant stone face at The Bayon temple in Angkor Thom, Cambodia">
</noscript>
</div>
data-media attribute ใน div[data-src] element นั้นรองรับ CSS3 media queries ทั้งหมดครับ นั่นคือ min width, max width หรือ min-device-pixel-ratio สำหรับหน้าจอแบบ HD (retina displays) ก็รองรับครับ
Note
altattibute ในdiv[data-picture]element ใช้สำหรับสร้างตัว text (alternate text นั่นแหละครับ) สำหรับimgelement.div[data-picture]element มีพลานุภาพยิ่งใหญ่ ใช้ source จำนวนเท่าไหร่ก็ได้- ในแต่ละ
div[data-src]element ต้องมีdata-srcattribute เพื่อระบุ path ของไฟล์รูปภาพไว้ ถ้าไม่มีจะถือว่าบาป - ในแต่ละ
data-srcelement สามารถใช้mediaattribute เพื่อทำให้รองรับ media ต่างๆ ซึ่งทั้ง media types และ queries ต่างก็สามารถใช้ได้เหมือนกัน แต่ media queries จะขึ้นกับแต่ละเบราว์เซอร์ ซึ่งเบราว์เซอร์บางตัวก็ยังไม่รองรับและไม่รองรับ - ในส่วนของ
noscriptจะใช้สำหรับ non-JavaScript environments ซึ่งก็คือ ไม่สามารถใช้ JavaScript ได้ หรือได้ทำการปิดไม่ให้ใช้ JavaScript ไว้ ซึ่งการโหลดภาพจะมาใช้งานที่นี่แทน โดยในส่วนนี้จะให้ดีคือใช้ภาพที่มีขนาดเล็กไว้จะดี โดยเฉพาะกับ mobile devies ที่เก่าและแบตตารีใกล้จะหมดก็จะยังพอสามารถที่จะดาวน์โหลดได้อย่างไม่ใช้ทรัพยากรมากนัก
HD Media Queries
Picturefill รองรับไฟล์ภาพแบบ HD (Retina) ด้วย โดยเราจะสามารถใช้งานได้ตามตัวอย่างนี้ครับ
<div data-picture data-alt="A giant stone face at The Bayon temple in Angkor Thom, Cambodia">
<div data-src="small.jpg"></div>
<div data-src="small.jpg" data-media="(min-device-pixel-ratio: 2.0)"></div>
<div data-src="medium.jpg" data-media="(min-width: 400px)"></div>
<div data-src="medium_x2.jpg" data-media="(min-width: 400px) and (min-device-pixel-ratio: 2.0)"></div>
<div data-src="large.jpg" data-media="(min-width: 800px)"></div>
<div data-src="large_x2.jpg" data-media="(min-width: 800px) and (min-device-pixel-ratio: 2.0)"></div>
<div data-src="extralarge.jpg" data-media="(min-width: 1000px)"></div>
<div data-src="extralarge_x2.jpg" data-media="(min-width: 1000px) and (min-device-pixel-ratio: 2.0)"></div>
<!-- Fallback content for non-JS browsers. Same img src as the initial, unqualified source element. -->
<noscript>
<img src="external/imgs/small.jpg" alt="A giant stone face at The Bayon temple in Angkor Thom, Cambodia">
</noscript>
</div>
data-mediaattribute นั้นรองรับ compound media queries ซึ่งจะทำให้สามารถใช้งานได้อย่างเฉพาะเจาะจงมากขึ้น ดังตัวอย่างที่มีการใช้data-media="(min-width: 400px) and (min-device-pixel-ratio: 2.0)ซึ่งเราสามารถที่จะใช้ภาพความละเอียดสูงมาแทนที่รูปภาพแบบปกติได้ และสำหรับ iOS devices สามารถใช้ prefix เฉพาะได้ในส่วนนี้ นั่นคือ-webkit-min-device-pixel-ratio