คู่มือสำหรับผู้เริ่มต้นใช้งานรูปภาพที่ปรับเปลี่ยนตามอุปกรณ์: วิธีทำให้ถูกต้อง

เผยแพร่แล้ว: 2022-04-10

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

ในขั้นตอนนี้ การทำให้เว็บไซต์ดูดีและทำงานได้ดีบนอุปกรณ์และแพลตฟอร์มที่หลากหลายนั้นเป็นส่วนหนึ่งของการออกแบบและพัฒนาเว็บที่ดี ไม่มีการแบ่งแยกระหว่าง "การออกแบบอุปกรณ์พกพา" และ "การออกแบบเดสก์ท็อป" อีกต่อไป ทุกเว็บไซต์ที่สร้างขึ้นในวันนี้ควรตอบสนองและควรทำงานได้ดีกับทุกอุปกรณ์ ส่วนใหญ่ของกระบวนการออกแบบที่ตอบสนองคือรูปภาพที่ตอบสนอง

ภาพที่ตอบสนอง

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

สารบัญ:

  • รูปภาพที่ตอบสนองด้วย CSS ธรรมดา
  • ภาพที่ตอบสนองด้วย srcset และ sizes
  • การใช้ srcset กับตัวบอกความหนาแน่นของพิกเซล
  • การใช้ <picture> องค์ประกอบ
  • เครื่องมือและบริการเพื่อช่วยในการตอบสนองภาพ
วิธีสร้าง #responsive รูปภาพสำหรับ #website ใด ๆ โดยใช้ #HTML และ #CSS ธรรมดา ️
คลิกเพื่อทวีต

รูปภาพที่ตอบสนองด้วย CSS ธรรมดา

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

ก่อนอื่น HTML ของฉันจะรวมแอตทริบิวต์ width และ height :

< img src = "images/leopard.png" alt = "Responsive images: Leopard on a tree branch" width = "1000" height = "667" >
ภาษารหัส: HTML, XML ( xml )

การรวมค่า width และ height ไว้ใน HTML เป็นแนวทางปฏิบัติที่ดีที่สุด เพื่อให้แน่ใจว่าเบราว์เซอร์สงวนพื้นที่ที่จำเป็นสำหรับรูปภาพ และไม่มีการรีโฟลว์หน้าถัดไปในขณะที่กำลังโหลดรูปภาพ

นอกจากนั้น ฉันจะใช้ CSS ต่อไปนี้:

img { max-width : 100% ; height : auto; }
ภาษารหัส: CSS ( css )

ค่าเหล่านี้จะแทนที่ HTML ของฉัน คุณสมบัติ max-width ถูกตั้งค่าเป็น 100% เพื่อให้แน่ใจว่าจะเติมพื้นที่ที่ต้องการ สูงสุดไม่เกิน 1,000px (ค่าจาก HTML) ค่า height ของ auto ช่วยให้มั่นใจได้ว่าความสูงของภาพจะรักษาขนาดภาพตามสัดส่วนกับความกว้างและความสูงตามธรรมชาติ ถ้าฉันลบ height: auto รูปภาพจะอยู่ที่ความสูงที่กำหนดไว้ใน HTML โดยไม่คำนึงถึงความกว้าง ซึ่งมักจะไม่ใช่สิ่งที่ฉันต้องการ

คุณสามารถลองใช้ตัวอย่างง่ายๆ นี้โดยใช้ CodePen ต่อไปนี้ เป็นการดีที่สุดที่จะเปิดการสาธิตในหน้าต่างใหม่ หากคุณต้องการทดสอบการตอบสนอง

และโปรดทราบว่าในตัวอย่างของฉัน ขนาดตามธรรมชาติของรูปภาพคือ 2000px x 1333px แต่ฉันเลือกที่จะแสดงรูปภาพได้สูงสุด 1,000px

ในทางทฤษฎี ฉันสามารถทำด้านบนนี้กับรูปภาพทุกรูปในหน้าของฉันได้ และนี่จะเป็นวิธีที่เป็นพื้นฐานและยอมรับได้ในการรวมรูปภาพที่ตอบสนองตามอุปกรณ์เข้ากับโปรเจ็กต์ของฉัน แต่ในอุดมคติแล้ว ฉันต้องการนำสิ่งนี้ไปสู่อีกระดับและควบคุมความละเอียดของรูปภาพและปัจจัยอื่นๆ เพื่อปรับปรุงประสิทธิภาพและความช่วยเหลือเกี่ยวกับ SEO ซึ่งฉันจะพูดถึงในหัวข้อต่อไปนี้

ภาพที่ตอบสนองด้วย srcset และ sizes

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

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

ต่อไปนี้คือตัวอย่างที่ใช้ภาพ leopard.png หลายเวอร์ชันจากตัวอย่างก่อนหน้านี้:

< img srcset = "images/leopard-480.png 480w, images/leopard-800.png 800w, images/leopard.png 2000w" sizes = "(max-width: 600px) 480px, (max-width: 1000px) 800px, 1000px" src = "images/leopard.png" alt = "Leopard on a tree branch" >
ภาษารหัส: HTML, XML ( xml )

หากคุณไม่เคยเห็น srcset และ sizes มาก่อน อาจดูสับสนในแวบแรก ฉันจะทำลายมันทั้งหมดเพื่อให้เข้าใจได้ง่าย

การแยกย่อยแอตทริบิวต์ srcset

แอตทริบิวต์ srcset ยอมรับรายการที่คั่นด้วยเครื่องหมายจุลภาคของสตริงตั้งแต่หนึ่งรายการขึ้นไป แต่ละสตริงประกอบด้วย:

  • URL ที่ชี้ไปที่รูปภาพ
  • ตัวอธิบายเพิ่มเติมตัวใดตัวหนึ่งต่อไปนี้ (คั่นด้วยการเว้นวรรค):
    • ตัวบอกความกว้าง
    • ตัวบอกความหนาแน่นของพิกเซล

ในตัวอย่างของฉัน ฉันได้รวม width descriptor ซึ่งคุณจะเห็นบ่อยที่สุด ฉันได้รวมรูปภาพไว้สามเวอร์ชัน: รุ่นความละเอียดสูงขนาดใหญ่ พร้อมด้วยแบบกว้าง 800px และอีกแบบกว้าง 480px

สังเกตว่าเมื่อฉันใช้ตัวบอกความกว้างในตัวอย่างข้างต้น ไวยากรณ์คือค่าความกว้างตามด้วย "w" ทันที (อย่าใช้ค่าหน่วย "px"!) สำหรับแต่ละตัวบอกความกว้างที่แสดงรูปภาพ ฉันใช้ความกว้างที่แท้จริงของรูปภาพเป็นพิกเซล คุณสามารถรับขนาดที่แท้จริงของรูปภาพใด ๆ ได้หลายวิธี – โดยการอ้างอิงคุณสมบัติของมันในระบบไฟล์ของคุณ โปรแกรมแก้ไขรูปภาพ หรือแม้แต่ในเบราว์เซอร์หรือเครื่องมือสำหรับนักพัฒนาของเบราว์เซอร์ของคุณ

แบ่งแอตทริบิวต์ sizes

แอตทริบิวต์ srcset sizes คุณสามารถใช้ srcset เพียงอย่างเดียวได้ (ดูหัวข้อถัดไป) แต่วิธีทั่วไปในการใช้ srcset ก็คือการใช้ sizes

แอตทริบิวต์ sizes ยอมรับรายการที่คั่นด้วยเครื่องหมายจุลภาคของสตริงตั้งแต่หนึ่งรายการขึ้นไป แต่ละสตริงประกอบด้วย:

  • เงื่อนไขสื่อ (คล้ายกับการสืบค้นสื่อที่ใช้ใน CSS)
  • ค่าที่กำหนดขนาดของ "ช่อง" ที่รูปภาพจะใช้ค่า

ค่าสล็อตสามารถเป็นความยาวสัมบูรณ์ เช่น em หรือ px หรือหน่วยสัมพันธ์ของวิวพอร์ต (เช่น vw ) สังเกตในตัวอย่างของฉัน ค่าสล็อตในแอตทริบิวต์ sizes ไม่ตรงกันทุกประการกับตัวบอกความกว้างทั้งสาม นี่คือรหัสอีกครั้ง:

< img srcset = "images/leopard-480.png 480w, images/leopard-800.png 800w, images/leopard.png 2000w" sizes = "(max-width: 600px) 480px, (max-width: 1000px) 800px, 1000px" src = "images/leopard.png" alt = "Leopard on a tree branch" >
ภาษารหัส: HTML, XML ( xml )

ความจริงที่ว่าค่าสล็อตไม่ตรงกับตัวบอกความกว้างทุกประการก็ไม่เป็นไร ในกรณีของฉัน ฉันสามารถแบ่งค่า sizes เป็น:

  • วิวพอร์ตกว้าง 600px จะโหลดภาพ 480w จากค่า srcset ภายในช่องที่มีความกว้าง 480px
  • วิวพอร์ตกว้าง 1000px จะโหลดภาพ 800w ในช่อง 800px
  • รูปภาพขนาดเต็มเริ่มต้น (2000w) จะเติมช่อง 1000px หากไม่ตรงตามเงื่อนไขสื่อก่อนหน้า

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

คุณสามารถดูตัวอย่างการใช้งานโค้ดได้โดยใช้การสาธิต CodePen ด้านล่าง โปรดทราบว่าในกรณีนี้ คุณจะต้องทดสอบกับสิ่งที่เลียนแบบอุปกรณ์ต่างๆ (เช่น DevTools ใน Chrome) คุณยังสามารถเปิดหน้าโดยใช้อุปกรณ์จริงที่หลากหลายเพื่อทำการทดสอบจริง เพื่อความสะดวก เราได้ใส่ข้อความซ้อนทับบนรูปภาพแต่ละรูป เพื่อให้คุณเห็นว่าโหลดใดเมื่อคุณดูหน้าเว็บ

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

การใช้ srcset กับตัวบอกความหนาแน่นของพิกเซล

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

< img srcset = "images/leopard-480.png, images/leopard-800.png 1.5x, images/leopard.png 2x" src = "images/leopard-480.png" alt = "Leopard on a tree branch" >
ภาษารหัส: HTML, XML ( xml )

สังเกตสองสามสิ่งที่นี่ ประการแรก สำหรับแอตทริบิวต์ src ปกติ ฉันใช้รูปภาพที่เล็กที่สุด เพื่อให้แน่ใจว่าจะใช้อุปกรณ์เคลื่อนที่เป็นอันดับแรก ถัดไป แอตทริบิวต์ srcset จะรวมรูปภาพเวอร์ชันอื่นๆ สองสามเวอร์ชัน โดยมีความละเอียดระบุโดยตัวอธิบาย 1.5x และ 2x รูปภาพ 480 ไม่มีคำอธิบายเนื่องจาก 1x เป็นนัย สุดท้าย สังเกตว่าไม่มีแอตทริบิวต์ sizes ซึ่งฉันไม่ต้องการในกรณีนี้ MDN อธิบายว่าเบราว์เซอร์เลือกรูปภาพอย่างไร:

ตัวแทนผู้ใช้จะเลือกแหล่งที่มาที่มีอยู่ตามดุลยพินิจของตน สิ่งนี้ทำให้พวกเขามีช่องทางที่เพียงพอในการปรับแต่งการเลือกตามสิ่งต่าง ๆ เช่นการตั้งค่าของผู้ใช้หรือเงื่อนไขแบนด์วิดท์

เพื่อให้เข้าใจว่าตัวอธิบายทำงานอย่างไร โปรดจำไว้ว่าพิกเซลอุปกรณ์หนึ่งพิกเซลแสดงถึงแต่ละพิกเซล CSS ดังนั้น 1x จะเป็นอัตราส่วน 1:1, 1.5x จะเป็นอัตราส่วน 1.5:1 และอื่นๆ คุณสามารถลองใช้ CodePen ด้านล่างได้ แต่คุณจะต้องใช้อุปกรณ์ต่างๆ (หรือใช้เครื่องมือที่เลียนแบบ) เพื่อดูความแตกต่าง

การใช้ <picture> องค์ประกอบ

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

อิลิเมนต์ <picture> เป็นคุณลักษณะ HTML ที่ช่วยให้คุณสามารถนำเสนอรูปภาพในรูปแบบอื่นตามการมีอยู่ของคุณลักษณะสื่อเฉพาะ นอกจากนี้ยังช่วยให้สามารถปิดรูปภาพได้เมื่อผู้ใช้ปรับขนาดวิวพอร์ตและโดยพื้นฐานแล้วช่วยให้คุณสามารถกำหนดทิศทางของภาพกับภาพของคุณ โดยแสดงฉากต่างๆ ที่หลากหลาย แต่ครอบตัดหรือซูมต่างกันขึ้นอยู่กับขนาดของอุปกรณ์

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

นี่คือตัวอย่างโค้ดที่ช่วยให้ฉันกำหนดทิศทางศิลปะบนรูปภาพของฉันได้:

< picture > < source media = "(min-width: 1000px)" srcset = "images/chipmunk.png" > < source media = "(min-width: 800px)" srcset = "images/chipmunk-zoom.png" > < img src = "images/chipmunk-closeup.png" alt = "Chipmunk in a field on a rock" > </ picture >
ภาษารหัส: HTML, XML ( xml )

สังเกตสิ่งต่อไปนี้เกี่ยวกับรหัส:

  • องค์ประกอบ <picture> ยอมรับองค์ประกอบ <picture> รูปภาพ> ที่ซ้อนกันหลายรายการเป็นเด็ก
  • แต่ละองค์ประกอบ <source> ภายใน <picture> กำลังใช้แอตทริบิวต์ media เพื่อกำหนดเงื่อนไขสื่อที่เรียกใช้รูปภาพต้นฉบับนั้น
  • <picture> องค์ประกอบยอมรับ &lt;img&gt; องค์ประกอบตั้งแต่ยังเด็ก ซึ่งเบราว์เซอร์จะรับรู้ว่าเป็นทางเลือกสำรอง หากไม่รองรับ <picture>
  • ไม่มีแอตทริบิวต์โดยตรงในองค์ประกอบ <picture> ( <picture> ยอมรับเฉพาะแอตทริบิวต์ส่วนกลางของ HTML เท่านั้นและไม่มีแอตทริบิวต์ของตัวเอง)

CodePen ด้านล่างแสดงให้เห็นสิ่งนี้:

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

เครื่องมือและบริการเพื่อช่วยในการตอบสนองภาพ

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

  • Responsive Image Breakpoints Generator – เครื่องมือออนไลน์เพื่อสร้างขนาดภาพที่ตอบสนองได้อย่างเหมาะสมที่สุด
  • Image Responsiver – โมดูลโหนดที่แปลงไวยากรณ์รูปภาพ HTML อย่างง่ายเป็นไวยากรณ์รูปภาพที่ตอบสนองได้ดียิ่งขึ้น
  • gatsby-plugin-image – ปลั๊กอิน Gatsby ที่จัดการส่วนที่ยากในการผลิตภาพในหลากหลายขนาดและรูปแบบ
  • lazySizes – ตัวโหลดขี้เกียจที่รวดเร็ว ปราศจากปัญหา SEO และกำหนดค่าเริ่มต้นได้เองสำหรับรูปภาพ (รวมถึงรูปภาพที่ตอบสนองตามอุปกรณ์/srcset) iframes และอื่นๆ
  • WURFL.js – JavaScript ที่ตรวจจับรุ่นอุปกรณ์ของสมาร์ทโฟน แท็บเล็ต สมาร์ททีวี และเกมคอนโซลที่เข้าถึงเว็บไซต์ของคุณ
  • Picturefill – โครงการเก่าที่ช่วยให้คุณใช้องค์ประกอบ <picture> บนเบราว์เซอร์รุ่นเก่าได้ เราขอแนะนำให้คุณหลีกเลี่ยงเครื่องมือนี้ เนื่องจากอาจทำให้โค้ดของคุณขยายใหญ่ขึ้นบนเบราว์เซอร์ที่เริ่มต้นได้ช้าอยู่แล้ว เทคนิคการใช้ทางเลือกที่เหมาะสมหรือแนวทางที่เน้นอุปกรณ์เคลื่อนที่เป็นอันดับแรกน่าจะดีกว่า

ที่สำคัญและสะดวกสบาย บริการต่างๆ จำนวนหนึ่งสามารถสร้างภาพที่ตอบสนองได้โดยอัตโนมัติ โดยนำเสนอคุณลักษณะต่างๆ เช่น ขนาดภาพต่างๆ, API สำหรับการสร้างภาพแบบทันทีทันใด และอื่นๆ

แม้แต่ WordPress เองก็มาพร้อมกับการรองรับในตัวสำหรับรูปภาพที่ตอบสนอง (เริ่มในเวอร์ชัน 4.4)

เครื่องมือ/บริการอื่นที่ควรค่าแก่การพิจารณาคือ Optimole เป็นเครื่องมือเพิ่มประสิทธิภาพและการนำเสนอภาพขั้นสูงที่สร้างโดยทีมงานที่อยู่เบื้องหลัง Themeisle สิ่งนี้จะไม่เพียงแต่ลดขนาดดิสก์ของภาพของคุณโดยไม่เกิดปัญหาด้านคุณภาพของภาพ แต่จะดูแลการส่งภาพไปยังผู้เยี่ยมชมเว็บไซต์ของคุณผ่าน CDN ของภาพ แง่มุมหนึ่งของคุณลักษณะการส่งรูปภาพนี้คือ รูปภาพของคุณจะได้รับการปรับให้เหมาะสมสำหรับการดูบนอุปกรณ์ต่างๆ ด้วย

Optimole เวอร์ชันฟรีมีให้ใช้งานแล้ว อนุญาตให้เข้าชมเว็บไซต์ได้มากถึง 5,000 ครั้งต่อเดือน และจะมอบคุณสมบัติการปรับขนาดอัตโนมัติ CDN และอื่นๆ ให้คุณ

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

วิธีสร้าง #responsive รูปภาพด้วย #CSS และ #HTML (พร้อมตัวอย่างที่ใช้งานได้จริง) ️
คลิกเพื่อทวีต

อย่าลืมเข้าร่วมหลักสูตรเร่งรัดของเราในการเร่งความเร็วไซต์ WordPress ของคุณ ด้วยการแก้ไขง่ายๆ บางอย่าง คุณสามารถลดเวลาในการโหลดลงได้ถึง 50-80%:

สมัครสมาชิกทันที รูปภาพ

เค้าโครงและการนำเสนอโดย Chris Fitzgerald และ Karol K.