SMIL ยังคงเป็นทางเลือกที่น่าสนใจสำหรับการทำอนิเมชันใน SVG โดยเฉพาะเมื่อต้องการให้อนิเมชันทำงานได้แม้โหลดไฟล์ด้วย <img> ข้อดีคือสามารถขยับคุณสมบัติขององค์ประกอบใน SVG ได้เต็มที่โดยไม่พึ่ง JavaScript ในบทความนี้จะชี้ว่า SMIL มีจุดอ่อนเรื่องความซ้ำซ้อนของโค้ดและเสนอวิธีวางแผนอนิเมชันด้วย "timing chart" เพื่อทำให้ markup ดูแลได้ง่ายขึ้น พร้อมแนวทางจัดการการซิงค์เวลาและการรองรับความต้องการลดการเคลื่อนไหวของผู้ใช้
ทำไมใช้ SMIL กับ SVG
SVG เป็นองค์ประกอบกราฟิกที่ยืดหยุ่นกว่าแท็กกล่องทั่วไป - <circle> หรือเส้นทางต่างๆ ทำงานร่วมกับ CSS ได้หลายอย่าง แต่บางแอตทริบิวต์อย่าง viewBox ยังไม่มีตัวแทนใน CSS SMIL เข้ามาเติมเต็มช่องว่างนี้เพราะสามารถแอนิเมตทุกแอตทริบิวต์ภายใน SVG ได้โดยตรง แม้บางบราวเซอร์จะไม่รัน JavaScript เมื่อโหลดไฟล์ SVG ด้วย <img> แต่ SMIL และ CSS animation ยังคงทำงานได้ ซึ่งเหมาะกับอนิเมชันที่ไม่ต้องการสคริปต์เพิ่มเติม
วางแผนก่อนเขียน - Timing Chart
จุดอ่อนของ SMIL คือความอ้วนของ markup - แต่ละแท็กแอนิเมตได้เพียงคุณสมบัติเดียวต่อองค์ประกอบหนึ่งตัว วิธีแก้คือวางแผนทุกชิ้นส่วนก่อนเขียนจริง การใช้ timing chart ช่วยให้เห็นภาพเมื่อแต่ละชิ้นเริ่มและจบ เหมือนเส้นช่วงเวลาที่เรียงกันหรือทับซ้อนกัน คุณไม่จำเป็นต้องวาดตามสเกลเป๊ะๆ ตราบใดที่ความสัมพันธ์ของช่วงเวลากลุ่มย่อยชัดเจน การเขียนป้ายบอกความยาวของช่วงเวลาเป็นเทคนิคช่วยประหยัดเวลาที่ดี
การซิงค์เวลา - syncbase และ offsets
SMIL มีวิธีกำหนดจุดเริ่มต้นของอนิเมชันหลายแบบที่ช่วยเชื่อมชิ้นส่วนเข้าด้วยกัน หนึ่งในที่มีประโยชน์คือการใช้ค่า syncbase ซึ่งคือ ID ของแท็กตามด้วย .begin หรือ .end และสามารถใส่ offset ได้ เช่น หากต้องการให้อนิเมชันความทึบเริ่มก่อนอนิเมชันสีจะจบ 300 milliseconds ให้ตั้งค่าเป็น colorChange.end - 300ms วิธีนี้ทำให้ความสัมพันธ์ทางเวลาเป็นสิ่งที่ชัดเจนและแก้ไขได้ง่าย หากต้องการให้กลุ่มอนิเมชันทั้งหมดเริ่มสัมพันธ์กับอนิเมชันหลัก ให้อาศัยการตั้งค่า begin="primary.begin" หรือเลือก ID อย่าง #primary เพื่อให้ง่ายต่อการเลื่อนทั้งกลุ่มในคราวเดียว
การรองรับ prefers-reduced-motion และ fallback
การเคารพผู้ใช้ที่ตั้งค่า prefers-reduced-motion เป็นสิ่งสำคัญ บราวเซอร์รองรับฟีเจอร์นี้ค่อนข้างกว้างและควรคิดตั้งแต่แรกว่าจะรับมืออย่างไร ตัวเลือกมีหลายทางเช่นใช้ <picture> เพื่อสลับเป็นภาพนิ่งสำหรับผู้ใช้ลดการเคลื่อนไหว หรือใช้ CSS background-image และ media query @media (prefers-reduced-motion) เพื่อเปลี่ยนเป็นเวอร์ชันนิ่ง อีกทางคือใช้ JavaScript .matchMedia() ร่วมกับ SMIL DOM interface เพื่อควบคุมว่าอนิเมชันไหนถูกสตาร์ท วิธีที่เลือกควรประเมินข้อดีข้อเสียแต่เนิ่นๆ จะช่วยลดการแก้โค้ดซ้ำในภายหลัง
ตัวอย่างจริงในการใช้งานคือการสร้าง loading spinner ที่ประกอบด้วยสามจุดซึ่งใช้แอนิเมตแบบ opacity โดยแยกเป็นแท็ก <animate> หกแท็ก และตั้งชื่อ ID ที่มีแนวทางชัดเจน เช่น #fadeInLeft, #fadeOutLeft เพื่อให้ง่ายต่อการอ่านและบำรุงรักษา
สำหรับนักพัฒนาหน้าเว็บ การเข้าใจการวางแผนเวลาและการใช้ syncbase กับ SMIL จะเป็นทักษะที่ช่วยให้สร้างอนิเมชัน SVG ที่ซับซ้อนได้โดยไม่พึ่งสคริปต์มากนัก และยังช่วยออกแบบ fallback ที่เป็นมิตรต่อการเข้าถึง
สิ่งที่ต้องติดตามต่อ - เริ่มจากการร่าง timing chart สำหรับอนิเมชันที่คุณต้องการ แล้วทดลองใช้ syncbase กับ offsets ทั้งบวกและลบเพื่อตั้งค่าความสัมพันธ์เวลา สุดท้ายให้ทดสอบกับ prefers-reduced-motion และสภาพแวดล้อมการโหลดผ่าน <img> และ <picture> เพื่อหาวิธี fallback ที่เหมาะสม
ที่มา: Smashing Magazine - เรียบเรียงและสรุปเป็นภาษาไทยโดยทีมงาน IT Genius
ไอทีจีเนียส เอ็นจิเนียริ่ง (IT Genius Engineering) ให้บริการด้านไอทีครบวงจร ทั้งงานด้านการอบรม (Training) สัมมนา รับงานเขียนโปรแกรม เว็บไซต์ แอพพลิเคชั่น งานออกแบบกราฟิก และงานด้าน E-Marketing ที่กำลังได้รับความนิยมในปัจจุบัน ทั้ง SEO , PPC , และ Social media marketting
ติดต่อเราเพื่อสอบถามผลิตภัณฑ์ ขอราคา หรือปรึกษาเรื่องไอที ได้เลยค่ะ
Line : @itgenius (มี @ ด้านหน้า) หรือ https://lin.ee/xoFlBFeFacebook : https://www.facebook.com/itgeniusonline
Tel : 02-570-8449 มือถือ 088-807-9770 และ 092-841-7931
Email : contact@itgenius.co.th
แนะนำหลักสูตรอบรมที่น่าสนใจ
Basic HTML5 and CSS3 (คอร์ส html 5 และ css 3 พื้นฐาน)
ในการเรียน html5 และ css3 นับเป็นเทคโนโลยีการพัฒนาเว็...
Advanced HTML5 and CSS3
หลักสูตรนี้จะเจาะลึกการใช้งาน HTML5 และ CSS3 ในขั้นสูง ผู้เรียนจะต้องมีความเข้าใจในการเ...
Basic JavaScript
หลักสูตร Basic JavaScript นี้ถูกออกแบบมาเพื่อให้ผู้เรียนได้เรียนรู้พื้นฐานของภาษา JavaS...
คำค้นหา : SVGSMILanimationfront-endaccessibility




