การจัดการความซับซ้อนด้วย Web Animations API

เผยแพร่แล้ว: 2022-03-10
สรุปอย่างรวดเร็ว ↬ มีตัวเลือกมากเกินไปใน Web Animations API ที่จะหยิบขึ้นมาอย่างง่ายดาย การเรียนรู้ว่าการจับเวลาทำงานอย่างไรและวิธีควบคุมการเล่นแอนิเมชั่นหลายๆ ตัวในคราวเดียว ทำให้เกิดรากฐานที่มั่นคงสำหรับสร้างโปรเจ็กต์ของคุณ

ไม่มีจุดกึ่งกลางระหว่างทรานสิชั่นธรรมดาและแอนิเมชั่นที่ซับซ้อน คุณพอใจกับสิ่งที่ CSS Transitions และ Animations มอบให้ หรือคุณต้องการพลังทั้งหมดที่คุณจะได้รับในทันใด Web Animations API มีเครื่องมือมากมายในการทำงานกับแอนิเมชั่น แต่คุณจำเป็นต้องรู้วิธีจัดการกับมัน บทความนี้จะแนะนำคุณผ่าน ประเด็นหลักและเทคนิค ที่อาจช่วยคุณจัดการกับแอนิเมชั่นที่ซับซ้อนในขณะที่ยังคงความยืดหยุ่น

ก่อนที่เราจะลงลึกในบทความ คุณจำเป็นต้องคุ้นเคยกับพื้นฐานของ Web Animations API และ JavaScript ก่อน เพื่อให้ชัดเจนและหลีกเลี่ยงความฟุ้งซ่านจากปัญหาที่มีอยู่ ตัวอย่างโค้ดที่ให้มานั้นเรียบง่าย จะไม่มีอะไรซับซ้อนไปกว่าฟังก์ชันและอ็อบเจกต์ ในฐานะที่เป็นจุดเริ่มต้นที่ดีสำหรับแอนิเมชั่น ฉันขอแนะนำ MDN เป็นข้อมูลอ้างอิงทั่วไป ซีรีย์ที่ยอดเยี่ยมของ Daniel C. Wilson และ CSS Animations กับ Web Animations API โดย Ollie Williams เราจะไม่พูดถึงวิธีการกำหนดเอฟเฟกต์และปรับแต่งเอฟเฟกต์เพื่อให้ได้ผลลัพธ์ที่คุณต้องการ บทความนี้อนุมานว่าคุณมีแอนิเมชั่นที่กำหนดไว้แล้ว และต้องการแนวคิดและเทคนิคในการจัดการ

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

อินเทอร์เฟซ

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

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

เราเริ่มต้นด้วยอินเทอร์เฟซแอนิเมชั่น ในการรับวัตถุแอนิเมชั่น เราสามารถใช้ Element.animate คุณให้คีย์เฟรมและตัวเลือกแก่มัน และมันจะเล่นแอนิเมชั่นของคุณทันที สิ่งที่มันยังทำคือมันส่งคืนอินสแตนซ์อ็อบเจ็กต์ Animation จุดประสงค์คือเพื่อควบคุมการเล่น

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

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

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

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

เมื่อคุณสร้างแอนิเมชั่นผ่าน Element.animate คุณกำลังใช้ทางลัดที่ทำสามสิ่ง มันสร้างอินสแตนซ์ของ KeyframeEffect มันใส่ในอินสแตนซ์ Animation ใหม่ มันเริ่มเล่นทันที

 const animation = element.animate(keyframes, options);

มาทำลายมันและดูโค้ดที่เทียบเท่ากันที่ทำในสิ่งเดียวกัน

 const animation = new Animation( // (2) new KeyframeEffect(element, keyframes, options) // (1) ); animation.play(); (3)

นำตลับ (1) ใส่ลงในเครื่องเล่น (2) จากนั้นกดปุ่ม Play (3)

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

เพิ่มเติมหลังกระโดด! อ่านต่อด้านล่าง↓

เวลา

เช่นเดียวกับในเรื่องตลก จังหวะเวลาคือทุกสิ่งในแอนิเมชั่น เพื่อให้เอฟเฟกต์ทำงาน เพื่อให้ได้ความรู้สึกบางอย่าง คุณต้องสามารถปรับแต่งวิธีที่คุณสมบัติเปลี่ยนแปลงได้ คุณสามารถควบคุม เวลาได้สองระดับ ใน Web Animations API

ในระดับคุณสมบัติส่วนบุคคล เรามี offset Offset ให้คุณ ควบคุมเวลาคุณสมบัติเดียว โดยการให้ค่าจากศูนย์ถึงหนึ่ง คุณกำหนดว่าแต่ละเอฟเฟกต์จะเริ่มเมื่อใด เมื่อละเว้น จะเท่ากับศูนย์

คุณอาจจำจาก @keyframes ใน CSS ว่าคุณสามารถใช้เปอร์เซ็นต์แทน from / to ได้อย่างไร นั่นคือ offset ที่หารด้วยหนึ่งร้อย ค่า offset เป็น ส่วนหนึ่งของระยะเวลาของการวนซ้ำครั้งเดียว

offset ทำให้คุณสามารถจัดเรียงคีย์เฟรมภายใน KeyframeEffect การชดเชยจำนวนสัมพัทธ์ทำให้แน่ใจได้ว่าไม่ว่าระยะเวลาหรืออัตราการเล่นคีย์เฟรมทั้งหมดของคุณจะเริ่มต้นในช่วงเวลาเดียวกันโดยสัมพันธ์กัน

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

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

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

 delay + (iterations × duration) + end delay

คุณสามารถดูการทำงานจริงในการสาธิตต่อไปนี้:

ดูปากกา [ระยะเวลาที่แท้จริงของแอนิเมชั่นคือเท่าไร](https://codepen.io/smashingmag/pen/VwWWrzz) โดย Kirill Myshkin

ดูปากกา ระยะเวลาที่แท้จริงของแอนิเมชั่นคืออะไร? โดย Kirill Myshkin

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

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

ดูปากกา [Tweak interationStart](https://codepen.io/smashingmag/pen/qBjjVPR) โดย Kirill Myshkin

ดูการทำงานร่วมกันของ Pen Tweak เริ่มโดย Kirill Myshkin

ควบคุมหลายอย่างเป็นหนึ่งเดียว

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

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

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

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

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

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

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

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

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

ความแตกต่างเพียงอย่างเดียวระหว่างการโทร play ในแอนิเมชั่นเดียวและอาร์เรย์ของแอนิเมชั่นคือคุณต้องทำซ้ำ นี่คือรหัสที่คุณสามารถใช้กับอินสแตนซ์ Animation ได้ทุกวิธี:

 // To play just call play on all of them animations.forEach((animation) => animation.play());

เราจะใช้สิ่งนี้เพื่อสร้างฟังก์ชั่นทุกประเภทสำหรับผู้เล่นของเรา

มาสร้างกล่องที่จะเก็บแอนิเมชั่นและเล่นกัน คุณสามารถสร้างกล่องเหล่านั้นได้ตามความเหมาะสม เพื่อให้ชัดเจน ฉันจะแสดงตัวอย่างการใช้ฟังก์ชันและวัตถุ ฟังก์ชัน createPlayer ใช้อาร์เรย์ของแอนิเมชั่นที่จะเล่นพร้อมกัน ส่งคืนวัตถุด้วยวิธีการ play เดียว

 function createPlayer(animations) { return Object.freeze({ play: function () { animations.forEach((animation) => animation.play()); } }); }

นั่นก็เพียงพอแล้วสำหรับคุณที่จะรู้ว่าจะเริ่มขยายการทำงาน มาเพิ่มวิธีการหยุดชั่วคราวและ currentTime กัน

 function createPlayer(animations) { return Object.freeze({ play: function () { animations.forEach((animation) => animation.play()); }, pause: function () { animations.forEach((animation) => animation.pause()); }, currentTime: function (time = 0) { animations.forEach((animation) => animation.currentTime = time); } }); }

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

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

 function currentTime(time = 0) { animations.forEach(function (animation) { if (typeof animation.currentTime === "function") { animation.currentTime(time); } else { animation.currentTime = time; } }); }

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

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

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

บทสรุป

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

อ่านเพิ่มเติม

  • “เทคนิคการปฏิบัติในการออกแบบแอนิเมชั่น” Sarah Drasner
  • “การออกแบบด้วยการลดการเคลื่อนไหวเพื่อความไวต่อการเคลื่อนไหว” Val Head
  • “ UI ทางเลือกเสียงสำหรับผู้ช่วยเสียง” Ottomatias Peura
  • “การออกแบบคำแนะนำเครื่องมือที่ดีขึ้นสำหรับอินเทอร์เฟซผู้ใช้มือถือ” Eric Olive