ก่อนที่ฉันจะก้าวไปสู่การพัฒนาอาชีพ ฉันได้ทำงานกราฟิกเคลื่อนไหวมากมายใน After Effects แต่ถึงแม้จะมีพื้นหลังนั้น ฉันก็ยังพบว่าแอนิเมชั่นบนเว็บนั้นค่อนข้างจะงุนงง
กราฟิกวิดีโอได้รับการออกแบบในอัตราส่วนที่กำหนดแล้วส่งออก เสร็จแล้ว! แต่ไม่มี "การตั้งค่าการส่งออก" บนเว็บ เราเพียงแค่ส่งโค้ดออกไปสู่โลก และแอนิเมชั่นของเราต้องปรับให้เข้ากับอุปกรณ์ใดก็ตามที่พวกเขาลงจอด
เรามาพูดถึงแอนิเมชั่นแบบตอบสนองกันเถอะ! เราจะทำแอนิเมชั่นบนเว็บไวด์ไวด์เว็บได้ดีที่สุดอย่างไร? เราจะกล่าวถึงแนวทางทั่วไป เคล็ดลับเฉพาะของ GSAP และหลักการเคลื่อนไหวบางส่วน มาเริ่มกันที่กรอบกันบ้าง…
แอนิเมชั่นนี้จะถูกใช้งานอย่างไร?
บทความของ Zach Saucier เกี่ยวกับแอนิเมชั่นที่ตอบสนอง แนะนำให้ย้อนกลับไปคิดถึงผลลัพธ์สุดท้ายก่อนที่จะกระโดดเข้าสู่โค้ด
แอนิเมชั่นจะเป็นโมดูลที่ทำซ้ำในหลายส่วนของแอปพลิเคชันของคุณหรือไม่? จำเป็นต้องปรับขนาดเลยหรือไม่? การคำนึงถึงสิ่งนี้สามารถช่วยกำหนดวิธีการปรับขนาดแอนิเมชั่นและป้องกันไม่ให้คุณเปลืองแรงไปเปล่าๆ
นี่เป็นคำแนะนำที่ดี อา ใหญ่ ส่วนหนึ่งของการออกแบบแอนิเมชั่นแบบตอบสนองคือการรู้ว่าแอนิเมชั่นนั้นจำเป็นต้องปรับขนาดหรือไม่และอย่างไร จากนั้นจึงเลือกแนวทางที่เหมาะสมตั้งแต่เริ่มต้น
ภาพเคลื่อนไหวส่วนใหญ่จัดอยู่ในหมวดหมู่ต่อไปนี้:
- คงที่: แอนิเมชั่นสำหรับสิ่งต่างๆ เช่น ไอคอนหรือตัวโหลดที่ยังคงขนาดและอัตราส่วนภาพเท่ากันในทุกอุปกรณ์ ไม่มีอะไรต้องกังวลที่นี่! ฮาร์ดโค้ดค่าพิกเซลบางส่วนในนั้นและเริ่มต้นวันของคุณ
- ของไหล แอนิเมชั่นที่ต้องปรับเปลี่ยนอย่างลื่นไหลในอุปกรณ์ต่างๆ ภาพเคลื่อนไหวเค้าโครงส่วนใหญ่จัดอยู่ในหมวดหมู่นี้
- กำหนดเป้าหมาย: แอนิเมชั่นที่เจาะจงสำหรับอุปกรณ์หรือขนาดหน้าจอบางขนาด หรือเปลี่ยนแปลงอย่างมากที่จุดพักบางจุด เช่น แอนิเมชั่นเฉพาะเดสก์ท็อปหรือการโต้ตอบที่อาศัยการโต้ตอบเฉพาะอุปกรณ์ เช่น การแตะหรือวางเมาส์เหนือ
แอนิเมชั่นที่ลื่นไหลและตรงเป้าหมายต้องใช้วิธีคิดและวิธีแก้ปัญหาที่แตกต่างกัน มาดูกัน…
แอนิเมชั่นของไหล
As แอนดี้เบลล์ พูดว่า: เป็นที่ปรึกษาของเบราว์เซอร์ ไม่ใช่ไมโครผู้จัดการ — ให้กฎเกณฑ์และคำแนะนำที่ชัดเจนแก่เบราว์เซอร์ จากนั้นปล่อยให้เบราว์เซอร์ทำการตัดสินใจที่ถูกต้องสำหรับผู้ที่เข้าชม
(นี่ สไลด์ จากการนำเสนอนั้น)
แอนิเมชั่นของไหลคือการปล่อยให้เบราว์เซอร์ทำงานหนัก แอนิเมชั่นจำนวนมากสามารถปรับให้เข้ากับบริบทต่างๆ ได้อย่างง่ายดาย เพียงแค่ใช้หน่วยที่เหมาะสมตั้งแต่เริ่มต้น หากคุณปรับขนาดปากกานี้ คุณจะเห็นว่าภาพเคลื่อนไหวโดยใช้ หน่วยวิวพอร์ต ปรับขนาดได้อย่างไหลลื่นเมื่อเบราว์เซอร์ปรับ:
กล่องสีม่วงจะเปลี่ยนความกว้างที่จุดพักที่แตกต่างกัน แต่เมื่อเราใช้เปอร์เซ็นต์เพื่อย้าย ภาพเคลื่อนไหวก็จะปรับขนาดตามไปด้วย
คุณสมบัติเค้าโครงภาพเคลื่อนไหวเช่น left
และ top
อาจทำให้เลย์เอาต์รีโฟลว์และแอนิเมชั่น 'janky' ที่กระวนกระวายใจ ดังนั้นหากเป็นไปได้ให้ยึดติดกับการเปลี่ยนแปลงและความทึบ
เราไม่ได้จำกัดอยู่แค่ยูนิตเหล่านี้เท่านั้น — มาดูความเป็นไปได้อื่นๆ กันบ้าง
หน่วย SVG
สิ่งหนึ่งที่ฉันชอบในการทำงานกับ SVG คือเราสามารถใช้หน่วยผู้ใช้ SVG สำหรับแอนิเมชั่นที่ตอบสนองได้ทันที เบาะแสอยู่ในชื่อจริงๆ - สามารถปรับขนาดได้ กราฟิกแบบเวกเตอร์ ใน SVG-land องค์ประกอบทั้งหมดจะถูกพล็อตที่พิกัดเฉพาะ พื้นที่ SVG เปรียบเสมือนกระดาษกราฟที่ไม่มีที่สิ้นสุดซึ่งเราสามารถจัดองค์ประกอบต่างๆ ได้ ดิ viewBox
กำหนดขนาดของกระดาษกราฟที่เราเห็น
viewBox="0 0 100 50”
ในการสาธิตครั้งต่อไปนี้ SVG . ของเรา viewBox
is 100
หน่วยกว้างและ 50
หน่วยสูง ซึ่งหมายความว่าถ้าเราทำให้องค์ประกอบเคลื่อนไหวโดย 100
หน่วยตามแนวแกน x มันจะเคลื่อนที่ตามความกว้างทั้งหมดของ SVG แม่ของมันเสมอ ไม่ว่า SVG จะใหญ่หรือเล็กแค่ไหน! ให้การสาธิตปรับขนาดเพื่อดู
การสร้างแอนิเมชั่นองค์ประกอบย่อยตามความกว้างของคอนเทนเนอร์พาเรนต์นั้นค่อนข้างยากใน HTML-land จนถึงตอนนี้ เราต้องคว้าความกว้างของพาเรนต์ด้วย JavaScript ซึ่งง่ายพอเมื่อคุณทำแอนิเมชั่น from
ตำแหน่งที่เปลี่ยนไป แต่เล่นซอเล็กน้อยเมื่อคุณทำแอนิเมชั่น to
ที่ไหนสักแห่งที่คุณเห็นในการสาธิตต่อไปนี้ หากจุดสิ้นสุดของคุณเป็นตำแหน่งที่แปลงแล้วและคุณปรับขนาดหน้าจอ คุณจะต้องปรับตำแหน่งนั้นด้วยตนเอง ยุ่ง… 🤔
หากคุณปรับค่าในการปรับขนาด อย่าลืม เด้งหรือแม้แต่เริ่มการทำงานของฟังก์ชันหลังจากที่ปรับขนาดเบราว์เซอร์เสร็จแล้ว การปรับขนาดผู้ฟังจะเรียกใช้เหตุการณ์จำนวนมากทุกวินาที ดังนั้นการอัปเดตคุณสมบัติในแต่ละเหตุการณ์จึงเป็นงานอย่างมากสำหรับเบราว์เซอร์
แต่การเร่งความเร็วของแอนิเมชั่นนี้จะกลายเป็นอดีตไปแล้วในไม่ช้า! ได้โปรดม้วนกลอง… 🥁
หน่วยคอนเทนเนอร์! สิ่งที่น่ารัก ในขณะที่ฉันเขียนสิ่งนี้ ใช้งานได้ใน Chrome และ Safari เท่านั้น แต่บางทีเมื่อคุณอ่านข้อความนี้ เราก็มี Firefox ด้วย ตรวจสอบการใช้งานจริงในการสาธิตครั้งต่อไปนี้ ดูหนุ่มน้อยเหล่านั้นไป! แอนิเมชั่นไม่น่าตื่นเต้นที่สัมพันธ์กับองค์ประกอบหลัก!
ข้อมูลสนับสนุนเบราว์เซอร์นี้มาจาก ฉันสามารถใช้ซึ่งมีรายละเอียดมากขึ้น ตัวเลขระบุว่าเบราว์เซอร์รองรับคุณสมบัติในเวอร์ชันนั้นขึ้นไป
เดสก์ทอป
Chrome | Firefox | IE | ขอบ | Safari |
---|---|---|---|---|
105 | ไม่ | ไม่ | 105 | 16.0 |
มือถือ / แท็บเล็ต
android-chrome | แอนดรอยด์ ไฟร์ฟอกซ์ | Android | iOS ของซาฟารี |
---|---|---|---|
106 | ไม่ | 106 | 16.0 |
การเปลี่ยนเลย์เอาต์แบบไหลด้วย FLIP
ดังที่เราได้กล่าวไว้ก่อนหน้านี้ ใน SVG-land ทุกองค์ประกอบจะถูกจัดวางอย่างเป็นระเบียบบนกริดเดียว และง่ายต่อการเคลื่อนย้ายอย่างตอบสนอง ใน HTML-land มันซับซ้อนกว่ามาก ในการสร้างเลย์เอาต์ที่ตอบสนอง เราได้ใช้วิธีการกำหนดตำแหน่งและระบบเลย์เอาต์ที่หลากหลาย ปัญหาหลักของการทำแอนิเมชั่นบนเว็บก็คือ มาก ของการเปลี่ยนแปลงเค้าโครงไม่สามารถเคลื่อนไหวได้ บางทีองค์ประกอบต้องย้ายจากตำแหน่ง relative
ไปยัง fixed
หรือลูกของคอนเทนเนอร์แบบยืดหยุ่นบางส่วนจะต้องสับเปลี่ยนอย่างราบรื่นทั่ววิวพอร์ต บางทีองค์ประกอบอาจต้องได้รับการเลี้ยงดูใหม่และย้ายไปยังตำแหน่งใหม่ทั้งหมดใน DOM
หากินเหรอ?
ดี. เทคนิค FLIP อยู่ที่นี่เพื่อช่วยวันนี้ มันช่วยให้เราสามารถเคลื่อนไหวสิ่งที่เป็นไปไม่ได้เหล่านี้ได้อย่างง่ายดาย หลักการพื้นฐานคือ:
- ชื่อจริง: คว้าตำแหน่งเริ่มต้นขององค์ประกอบที่เกี่ยวข้องกับการเปลี่ยนแปลง
- ชื่อสกุล: ย้ายองค์ประกอบและคว้าตำแหน่งสุดท้าย
- กลับหัวกลับหาง: หาการเปลี่ยนแปลงระหว่างสถานะแรกและสถานะสุดท้าย และใช้การแปลงเพื่อกลับองค์ประกอบกลับไปยังตำแหน่งเดิม ทำให้ดูเหมือนองค์ประกอบยังคงอยู่ใน เป็นครั้งแรก ตำแหน่ง แต่จริงๆ แล้วไม่ใช่
- เล่น: ลบการแปลงกลับและเคลื่อนไหวไปที่ ปลอม เป็นครั้งแรก พูดกับ ล่าสุด รัฐ
นี่คือตัวอย่างการใช้ปลั๊กอิน FLIP ของ GSAP ที่ทำทุกอย่างเพื่อคุณ!
หากคุณต้องการทำความเข้าใจเพิ่มเติมเล็กน้อยเกี่ยวกับการนำวานิลลาไปใช้ ให้ไปที่ Paul Lewis's โพสต์บล็อก — เขาเป็นสมองที่อยู่เบื้องหลังเทคนิค FLIP
ปรับขนาด SVG . ได้อย่างไหลลื่น
คุณเข้าใจฉัน… นี่ไม่ใช่ จริงๆ เคล็ดลับแอนิเมชั่น แต่การจัดฉากให้ถูกต้องนั้นจำเป็นสำหรับแอนิเมชั่นที่ดี! SVG ปรับขนาดได้ดีเยี่ยมตามค่าเริ่มต้น แต่เราสามารถควบคุมวิธีการขยายเพิ่มเติมได้ด้วย preserveAspectRatio
ซึ่งมีประโยชน์มากเมื่ออัตราส่วนกว้างยาวขององค์ประกอบ SVG และ viewBox
อัตราส่วนภาพจะแตกต่างกัน มันทำงานในลักษณะเดียวกับ background-position
และ background-size
คุณสมบัติใน CSS การประกาศประกอบด้วยค่าการจัดตำแหน่ง (background-position
) และ พบ or ชิ้น อ้างอิง (background-size
).
สำหรับข้อมูลอ้างอิงของ Meet และ Slice — slice
ก็เหมือน background size: cover
และ meet
ก็เหมือน background-size: contain
.
preserveAspectRatio="MidYMax slice"
— จัดแนวให้ตรงกลางแกน x ด้านล่างของแกน y และขยายให้ครอบคลุมวิวพอร์ตทั้งหมดpreserveAspectRatio="MinYMin meet"
— จัดชิดซ้ายของแกน x ด้านบนของแกน y และขยายขนาดโดยคงไว้ซึ่งทั้งหมดviewBox
มองเห็นได้
ทอมมิลเลอร์ ก้าวไปอีกขั้นโดยใช้ overflow: visible
ใน CSS และองค์ประกอบที่มีเพื่อเปิดเผย "สเตจซ้าย" และ "สเตจขวา" โดยคงส่วนสูงไว้:
สำหรับแอนิเมชั่น SVG ที่ตอบสนอง การใช้ช่องมองภาพ SVG เพื่อสร้างมุมมองที่ครอบตัดและปรับขนาดให้ต่ำกว่าความกว้างของเบราว์เซอร์ในขณะเดียวกันก็เผยให้เห็นแอนิเมชั่น SVG ทางด้านขวาและซ้ายมากขึ้นเมื่อเบราว์เซอร์กว้างกว่านั้น เกณฑ์ เราสามารถทำได้โดยเพิ่มโอเวอร์โฟลว์ที่มองเห็นได้บน SVG และร่วมมือกับ a
max-height
กระดาษห่อหุ้มเพื่อป้องกันไม่ให้ SVG ปรับขนาดในแนวตั้งมากเกินไป
ปรับขนาดผ้าใบอย่างไหลลื่น
Canvas มีประสิทธิภาพมากกว่าสำหรับแอนิเมชั่นที่ซับซ้อนด้วย จำนวนมาก ของชิ้นส่วนที่เคลื่อนไหวมากกว่าการสร้างภาพเคลื่อนไหว SVG หรือ HTML DOM แต่ก็ซับซ้อนกว่าโดยเนื้อแท้เช่นกัน คุณต้องทำงานเพื่อให้ได้ประสิทธิภาพเหล่านั้น! ต่างจาก SVG ที่มียูนิตตอบสนองที่น่ารักและขยายออกจากกล่อง ต้องมีการควบคุมและจัดการเล็กน้อย
ฉันชอบตั้งค่าของฉัน เพื่อให้ทำงานได้มากในลักษณะเดียวกับ SVG (ฉันอาจลำเอียง) ด้วยระบบหน่วยที่น่ารักในการทำงานภายในและอัตราส่วนกว้างยาวคงที่
ต้องวาดใหม่ทุกครั้งที่มีการเปลี่ยนแปลง ดังนั้นอย่าลืมรอการวาดใหม่จนกว่าเบราว์เซอร์จะปรับขนาดเสร็จ หรือดีบัก!
จอร์จฟรานซิส ประกอบสิ่งนี้ด้วย ห้องสมุดเล็กๆ ที่น่ารัก ซึ่งช่วยให้คุณกำหนด Canvas viewBox
คุณลักษณะและ preserveAspectRatio
— เหมือนกับ SVG!
แอนิเมชั่นเป้าหมาย
ในบางครั้ง คุณอาจต้องใช้ความลื่นไหลน้อยลงและเข้าใกล้แอนิเมชั่นของคุณมากขึ้น อุปกรณ์พกพามีพื้นที่น้อยกว่ามาก และประสิทธิภาพของแอนิเมชั่นน้อยกว่าเครื่องเดสก์ท็อป ดังนั้นจึงควรแสดงแอนิเมชันแบบลดขนาดให้กับผู้ใช้อุปกรณ์เคลื่อนที่ แม้จะไม่มีแอนิเมชันก็ตาม:
บางครั้งแอนิเมชั่นที่ตอบสนองได้ดีที่สุดสำหรับมือถือก็ไม่ใช่แอนิเมชั่นเลย! สำหรับ UX บนอุปกรณ์เคลื่อนที่ ให้จัดลำดับความสำคัญให้ผู้ใช้ใช้เนื้อหาได้อย่างรวดเร็ว แทนที่จะรอให้แอนิเมชั่นทำงานเสร็จ แอนิเมชั่นบนมือถือควรปรับปรุงเนื้อหา การนำทาง และการโต้ตอบ แทนที่จะทำให้ล่าช้า Eric van Holtz
ในการทำเช่นนี้ เราสามารถใช้การสืบค้นสื่อเพื่อกำหนดเป้าหมายขนาดวิวพอร์ตเฉพาะได้ เช่นเดียวกับที่เราทำเมื่อเราจัดสไตล์ด้วย CSS! ต่อไปนี้คือตัวอย่างง่ายๆ ที่แสดงภาพเคลื่อนไหว CSS ที่ได้รับการจัดการโดยใช้คิวรี่สื่อและภาพเคลื่อนไหว GSAP ที่จัดการด้วย gsap.matchMedia()
:
ความเรียบง่ายของเดโมนี้กำลังซ่อนเวทย์มนตร์ไว้มากมาย! ภาพเคลื่อนไหว JavaScript ต้องการการตั้งค่าและการล้างข้อมูลเพิ่มขึ้นเล็กน้อย เพื่อให้ทำงานได้อย่างถูกต้องในขนาดหน้าจอที่กำหนดเพียงขนาดเดียวเท่านั้น ฉันเคยเห็นความสยดสยองในอดีตที่ผู้คนเพิ่งซ่อนแอนิเมชั่นจากมุมมองใน CSS ด้วย opacity: 0
แต่แอนิเมชั่นยังคงทำงานอยู่เบื้องหลังโดยใช้ทรัพยากร 😱
หากขนาดหน้าจอไม่ตรงกันอีกต่อไป แอนิเมชั่นจะต้องถูกกำจัดและปล่อยสำหรับการรวบรวมขยะ และองค์ประกอบที่ได้รับผลกระทบจากแอนิเมชั่นจะต้องถูกล้างออกจากสไตล์อินไลน์ที่แนะนำการเคลื่อนไหวใดๆ เพื่อป้องกันความขัดแย้งกับสไตล์อื่นๆ จนถึง gsap.matchMedia()
นี่เป็นกระบวนการที่เที่ยวยุ่งยิ่ง เราต้องติดตามแต่ละแอนิเมชั่นและจัดการทั้งหมดนี้ด้วยตนเอง
gsap.matchMedia()
แทนที่จะช่วยให้คุณใส่โค้ดแอนิเมชั่นของคุณลงในฟังก์ชันที่จะทำงานเฉพาะเมื่อ แบบสอบถามสื่อ การแข่งขัน จากนั้นเมื่อไม่ตรงกันอีกต่อไป ภาพเคลื่อนไหว GSAP ทั้งหมดและ ทริกเกอร์เลื่อน ในฟังก์ชันนั้นจะถูกเปลี่ยนกลับโดยอัตโนมัติ คิวรีสื่อที่แอนิเมชั่นปรากฏขึ้นจะทำงานอย่างหนักสำหรับคุณ อยู่ใน GSAP 3.11.0 และเป็นตัวเปลี่ยนเกม!
เราไม่ได้จำกัดแค่ขนาดหน้าจอเท่านั้น มี มีสื่อมากมายอยู่ที่นั่น ที่จะติด!
(prefers-reduced-motion) /* find out if the user would prefer less animation */
(orientation: portrait) /* check the user's device orientation */
(max-resolution: 300dpi) /* check the pixel density of the device */
ในการสาธิตต่อไปนี้ เราได้เพิ่มการตรวจสอบสำหรับ prefers-reduced-motion
เพื่อให้ผู้ใช้ที่พบว่าแอนิเมชั่นสับสนจะไม่ถูกรบกวนจากสิ่งที่หวือหวา
และดูการสาธิตสนุกๆ อื่นๆ ของ Tom Miller ที่เขาใช้อัตราส่วนกว้างยาวของอุปกรณ์เพื่อปรับภาพเคลื่อนไหว:
คิดนอกกรอบ เกินขนาดหน้าจอ
การคิดเกี่ยวกับแอนิเมชั่นแบบตอบสนองมีอะไรมากกว่าแค่ขนาดหน้าจอ อุปกรณ์ต่าง ๆ อนุญาตให้มีปฏิสัมพันธ์ที่แตกต่างกัน และมันง่ายที่จะยุ่งเหยิงเล็กน้อยเมื่อคุณไม่คำนึงถึงสิ่งนั้น หากคุณกำลังสร้างสถานะโฮเวอร์ใน CSS คุณสามารถใช้ hover
คุณสมบัติสื่อเพื่อทดสอบว่าผู้ใช้ ประถม กลไกการป้อนข้อมูลสามารถวางเมาส์เหนือองค์ประกอบได้
@media (hover: hover) {
/* CSS hover state here */
}
คำแนะนำบางส่วนจาก เจค ไวท์ลีย์:
หลายครั้งที่เราสร้างแอนิเมชั่นตามความกว้างของเบราว์เซอร์ ทำให้สันนิษฐานง่ายๆ ว่าผู้ใช้เดสก์ท็อปต้องการสถานะโฮเวอร์ โดยส่วนตัวแล้วฉันมีปัญหามากมายในอดีตที่ฉันจะเปลี่ยนไปใช้เลย์เอาต์เดสก์ท็อป >1024px แต่อาจตรวจจับการสัมผัสใน JS ได้ ซึ่งทำให้เลย์เอาต์สำหรับเดสก์ท็อปไม่ตรงกัน แต่ JS นั้นมีไว้สำหรับมือถือ วันนี้ฉันพึ่งโฮเวอร์และตัวชี้เพื่อให้แน่ใจว่ามีความเท่าเทียมกันและจัดการกับ iPad Pros หรือพื้นผิวของหน้าต่าง (ซึ่งสามารถเปลี่ยนประเภทตัวชี้ขึ้นอยู่กับว่าฝาครอบปิดลงหรือไม่)
/* any touch device: */
(hover: none) and (pointer: coarse)
/* iPad Pro */
(hover: none) and (pointer: coarse) and (min-width: 1024px)
จากนั้นฉันจะแต่งงานกับคิวรีเลย์เอาต์ CSS และคิวรี JavaScript ของฉัน ดังนั้นฉันจึงพิจารณาว่าอุปกรณ์อินพุตเป็นปัจจัยหลัก ได้รับการสนับสนุน โดยความกว้างมากกว่าที่จะตรงกันข้าม
เคล็ดลับ ScrollTrigger
หากคุณกำลังใช้ GSAP's ปลั๊กอิน ScrollTriggerมียูทิลิตีเล็ก ๆ น้อย ๆ ที่มีประโยชน์ที่คุณสามารถเชื่อมต่อเพื่อระบุความสามารถในการสัมผัสของอุปกรณ์ได้อย่างง่ายดาย: ScrollTrigger.isTouch
.
0
- ไม่มีการสัมผัส (ตัวชี้/เมาส์เท่านั้น)1
- สัมผัสเท่านั้น อุปกรณ์ (เช่นโทรศัพท์)2
– อุปกรณ์สามารถรับได้ แตะ อินพุตและ เมาส์/ตัวชี้ (เช่นแท็บเล็ต Windows)
if (ScrollTrigger.isTouch) {
// any touch-capable device...
}
// or get more specific:
if (ScrollTrigger.isTouch === 1) {
// touch-only device
}
เคล็ดลับอีกประการสำหรับแอนิเมชั่นที่กระตุ้นการเลื่อนแบบตอบสนอง...
การสาธิตต่อไปนี้ด้านล่างกำลังย้ายแกลเลอรีรูปภาพในแนวนอน แต่ความกว้างจะเปลี่ยนไปตามขนาดหน้าจอ หากคุณปรับขนาดหน้าจอเมื่อคุณผ่านแอนิเมชั่นสครับลงได้ครึ่งทาง คุณอาจจบลงด้วยแอนิเมชั่นที่เสียหายและค่าที่ค้าง นี่เป็น speedbump ทั่วไป แต่อย่างใดอย่างหนึ่งที่แก้ไขได้ง่าย! เปิดการคำนวณที่ขึ้นอยู่กับขนาดหน้าจอเป็นค่าฟังก์ชันและ set invalidateOnRefresh:true
. ด้วยวิธีนี้ ScrollTrigger จะคำนวณค่านั้นใหม่ให้กับคุณเมื่อเบราว์เซอร์ปรับขนาด
โบนัสเคล็ดลับเนิร์ด GSAP!
บนอุปกรณ์มือถือ แถบที่อยู่ของเบราว์เซอร์มักจะแสดงและซ่อนเมื่อคุณเลื่อน นับเป็นเหตุการณ์การปรับขนาดและจะเริ่มต้น a ScrollTrigger.refresh()
. นี่อาจไม่เหมาะเพราะอาจทำให้แอนิเมชั่นของคุณกระโดดได้ เพิ่ม GSAP 3.10 แล้ว ignoreMobileResize
. ไม่มีผลต่อการทำงานของแถบเบราว์เซอร์ แต่จะป้องกัน ScrollTrigger.refresh()
จากการยิงเพื่อ การปรับขนาดแนวตั้งขนาดเล็กบนอุปกรณ์แบบสัมผัสเท่านั้น
ScrollTrigger.config({
ignoreMobileResize: true
});
หลักการเคลื่อนไหว
ฉันคิดว่าจะมอบแนวทางปฏิบัติที่ดีที่สุดให้คุณพิจารณาเมื่อทำงานกับการเคลื่อนไหวบนเว็บ
ระยะทางและการผ่อนคลาย
สิ่งเล็กน้อยแต่สำคัญที่ลืมง่ายด้วยแอนิเมชั่นที่ตอบสนองคือความสัมพันธ์ระหว่างความเร็ว โมเมนตัม และระยะทาง! แอนิเมชั่นที่ดี ควรเลียนแบบโลกแห่งความจริง ให้รู้สึกน่าเชื่อและต้องใช้เวลาในโลกแห่งความจริงนานกว่าจะครอบคลุมระยะทางที่ไกลกว่า ให้ความสนใจกับระยะทางที่ภาพเคลื่อนไหวของคุณเดินทาง และตรวจสอบให้แน่ใจว่าระยะเวลาและการค่อยๆ เปลี่ยนที่ใช้มีความเหมาะสมในบริบทของภาพเคลื่อนไหวอื่นๆ
คุณยังสามารถใช้การค่อยๆ เปลี่ยนอย่างน่าทึ่งมากขึ้นกับองค์ประกอบต่างๆ ได้ด้วยการเดินทางไกลเพื่อแสดงโมเมนตัมที่เพิ่มขึ้น:
สำหรับกรณีการใช้งานบางอย่าง การปรับระยะเวลาให้มีพลังมากขึ้นตามความกว้างของหน้าจออาจเป็นประโยชน์ ในการสาธิตครั้งต่อไปนี้ เราจะใช้ gsap.utils
เพื่อยึดมูลค่าที่เราได้รับกลับมาจากปัจจุบัน window.innerWidth
ให้อยู่ในช่วงที่เหมาะสม จากนั้นเราจะจับคู่ตัวเลขนั้นกับระยะเวลา
ระยะห่างและปริมาณ
สิ่งที่ควรทราบอีกประการหนึ่งคือระยะห่างและปริมาณขององค์ประกอบในขนาดหน้าจอต่างๆ การอ้างอิง สตีเวนชอว์:
หากคุณมีแอนิเมชั่นสิ่งแวดล้อมบางประเภท (พารัลแลกซ์ เมฆ ต้นไม้ ลูกปา ของตกแต่ง ฯลฯ) ที่เว้นระยะห่างรอบหน้าต่าง ตรวจสอบให้แน่ใจว่าได้ปรับขนาดและ/หรือปรับปริมาณตามขนาดหน้าจอ หน้าจอขนาดใหญ่อาจต้องการองค์ประกอบเพิ่มเติมที่กระจายไปทั่วทั้งหน้าจอ ในขณะที่หน้าจอขนาดเล็กต้องการเพียงบางส่วนสำหรับเอฟเฟกต์เดียวกัน
ฉันรักวิธี โอเฟอร์ วิชเนีย นึกถึงแอนิเมชั่นเป็นเวที การเพิ่มและลบองค์ประกอบไม่เพียงแต่จะต้องเป็นพิธีการเท่านั้น แต่ยังเป็นส่วนหนึ่งของการออกแบบท่าเต้นโดยรวมได้อีกด้วย
เมื่อออกแบบแอนิเมชั่นที่ตอบสนอง ความท้าทายไม่ใช่วิธีการอัดเนื้อหาเดียวกันลงในวิวพอร์ตเพื่อให้ "พอดี" แต่เป็นการจัดระเบียบชุดของเนื้อหาที่มีอยู่เพื่อให้สื่อถึงความตั้งใจเดียวกัน นั่นหมายถึงการเลือกอย่างรอบคอบว่าจะเพิ่มเนื้อหาส่วนใดและส่วนใดที่จะนำออก โดยปกติแล้ว ในโลกของแอนิเมชั่น สิ่งต่างๆ จะไม่เพียงแค่ปรากฏขึ้นหรือออกจากเฟรมเท่านั้น การคิดว่าองค์ประกอบต่างๆ เข้าหรือออกจาก "เวที" นั้นสมเหตุสมผลแล้ว ซึ่งทำให้การเปลี่ยนผ่านนั้นเคลื่อนไหวในลักษณะที่เหมาะสมกับภาพและเนื้อหา
และนั่นคือจำนวนมาก หากคุณมีคำแนะนำเกี่ยวกับแอนิเมชั่นที่ตอบสนองได้ดีกว่านี้ ให้แสดงในส่วนความคิดเห็น หากมีอะไรที่เป็นประโยชน์มาก ฉันจะเพิ่มข้อมูลเหล่านี้ลงในบทสรุปของข้อมูล!
ภาคผนวก
อีกหนึ่งบันทึกจาก ทอมมิลเลอร์ ขณะที่ฉันกำลังเตรียมบทความนี้:
ฉันอาจจะสายเกินไปกับเคล็ดลับนี้สำหรับบทความเกี่ยวกับแอนิเมชั่นที่ตอบสนองของคุณ แต่ฉันขอแนะนำอย่างยิ่งให้ "สร้างแอนิเมชั่นทั้งหมดให้เสร็จก่อนสร้าง" ฉันกำลังปรับปรุงแอนิเมชั่นไซต์บางส่วนด้วย "เวอร์ชันสำหรับมือถือ" ขอบคุณพระเจ้าสำหรับ
gsap.matchMedia
… แต่ฉันแน่ใจว่าหวังว่าเราจะรู้ว่าจะมีเลย์เอาต์/แอนิเมชั่นสำหรับอุปกรณ์พกพาที่แยกจากกันตั้งแต่ต้น
ฉันคิดว่าเราทุกคนซาบซึ้งที่เคล็ดลับในการ "วางแผนล่วงหน้า" นี้เกิดขึ้นในนาทีสุดท้าย ขอบคุณ Tom และขอให้โชคดีกับชุดติดตั้งเพิ่มเติมเหล่านั้น