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

องค์ประกอบและเนื้อหาภาพ

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

ก่อนที่เราจะพูดถึงรูปภาพ เรามาพิจารณาแนวคิดนี้ด้วยองค์ประกอบวงกลมก่อน วงกลมจะเป็นวงกลมเสมอ ไม่ใช่วงรี

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

องค์ประกอบรูปภาพจะต้องจัดการกับสถานการณ์เดียวกัน: ขนาดองค์ประกอบไม่จำเป็นต้องมีขนาดเท่ากันกับรูปภาพ วิธีที่ถูกต้องในการกำหนดขนาดและตำแหน่งวิชวลจะขึ้นอยู่กับการออกแบบ เราต้องจัดเตรียมคุณสมบัติเพื่อระบุสิ่งที่เกิดขึ้น ใน Fuse ฉันเรียกสิ่งนี้ว่า StretchMode; ใน CSS นี่คือคุณสมบัติ background-size หรือ object-fit

พิกเซลและจุดที่แม่นยำ

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

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

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

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

เติมและปรับขนาด9

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

รูปภาพด้านบนช่วยแสดงความบิดเบี้ยว แต่คุณสมบัติการเติมอาจไม่เหมาะกับรูปภาพดังกล่าว

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

เครื่องแบบและชุดเครื่องแบบเพื่อเติมเต็ม

หากรูปภาพทั้งหมดต้องพอดีกับองค์ประกอบ และต้องรักษาอัตราส่วนไว้ เราจะใช้โหมด Uniform (เรียกว่า contain ใน CSS) วิธีนี้จะขยายขนาดของรูปภาพเพื่อให้สัมผัสทั้งสองด้านของพื้นที่ที่มีอยู่ โดยปล่อยให้ส่วนที่เหลือขององค์ประกอบว่างเปล่า

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

การจัดตำแหน่งเนื้อหา

นอกเหนือจากโหมด Fill หรือ Scale9 รูปภาพไม่พอดีกับพื้นที่ว่างทั้งหมด สิ่งนี้ทำให้เกิดคำถามว่าจะวางตำแหน่งภาพไว้ที่ใด รูปภาพ Uniform ควรวางอยู่ทางซ้ายหรือทางขวา? รูปภาพ UniformToFill ควรจะแสดงด้านล่างหรือด้านบนของรูปภาพมากกว่า

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

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

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

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

ตัวเลือก

สำหรับ Fuse เรายังมีตัวเลือก StretchDirection อีกด้วย อาจเป็น Both (ค่าเริ่มต้น), UpOnly หรือ DownOnly อย่างใดอย่างหนึ่ง รูปภาพจะขยายไปในทิศทางที่อนุญาตเท่านั้น ตัวอย่างเช่น หากเรามี Image {StretchMode=Uniform StretchDirection=DownOnly} ภาพจะย่อลงเพื่อให้พอดีกับองค์ประกอบ แต่จะไม่ขยายเกินขนาดธรรมชาติ ในทางปฏิบัติ มีกรณีการใช้งานที่จำกัดสำหรับสิ่งนี้

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

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

องค์ประกอบอื่นๆ

หากคุณกำลังเขียนกลไก UI คุณอาจสนใจที่จะทราบวิธีการคำนวณทั้งหมดนี้ แจ้งให้เราทราบหากคุณต้องการบทความประเภทนี้ — มันค่อนข้างจะเน้นไปทางคณิตศาสตร์ แต่ก็ไม่ซับซ้อน ใน Fuse คุณสามารถค้นหาคลาส SizingContainer ซึ่งสรุปตรรกะส่วนใหญ่ได้ แม้ว่าโค้ดการคำนวณเค้าโครงจะเป็นส่วนหนึ่งของคลาสนั้นก็ตาม

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

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

อ่านบทความเพิ่มเติมเกี่ยวกับ การเขียน UI Engine ติดตามฉันบน Twitter และหากต้องการให้ฉันเขียนต่อ โปรดพิจารณา "เป็นผู้อุปถัมภ์"