Variants สำหรับแอนิเมชันที่ประสานกัน
กำหนดออบเจ็กต์ variant ที่มีชื่อ และส่งต่อผ่านโครงสร้างคอมโพเนนต์แม่ลูก
Variants สำหรับแอนิเมชันที่ประสานกัน เป็นบทเรียน React Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน React Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน
Variants คืออะไร
Variants คือสถานะแอนิเมชันที่ตั้งชื่อและกำหนดเป็นออบเจ็กต์ แทนที่จะใช้ค่าแบบเขียนตรง ๆ คอมโพเนนต์จะอ้างอิงชื่อ variant เช่น 'hidden' และ 'visible' คอมโพเนนต์แม่สามารถควบคุมคอมโพเนนต์ลูกได้โดยอัตโนมัติ
การกำหนด Variants
สร้างออบเจ็กต์ variants พร้อมสถานะที่ตั้งชื่อ แล้วส่งออบเจ็กต์ดังกล่าวให้พร็อพ variants ของคอมโพเนนต์ motion
const cardVariants = {
hidden: { opacity: 0, y: 30 },
visible: { opacity: 1, y: 0 },
};
<motion.div
variants={cardVariants}
initial="hidden"
animate="visible"
transition={{ duration: 0.4 }}
/>คอมโพเนนต์ลูกแบบหน่วงระยะ
ใช้ staggerChildren ใน transition ของคอมโพเนนต์แม่ เพื่อทำแอนิเมชันให้คอมโพเนนต์ลูกทำงานทีละรายการ โดยหน่วงเวลาระหว่างแต่ละรายการ
const containerVariants = {
hidden: {},
visible: {
transition: {
staggerChildren: 0.1,
delayChildren: 0.2,
},
},
};
const itemVariants = {
hidden: { opacity: 0, x: -20 },
visible: { opacity: 1, x: 0 },
};
<motion.ul variants={containerVariants} initial="hidden" animate="visible">
{items.map(item => (
<motion.li key={item.id} variants={itemVariants}>{item.name}</motion.li>
))}
</motion.ul>การส่งต่อ Variant
เมื่อสถานะ variant ของคอมโพเนนต์แม่เปลี่ยน คอมโพเนนต์ลูกทั้งหมดที่ใช้ชื่อ variant เดียวกันจะทำแอนิเมชันตามโดยอัตโนมัติ จึงไม่จำเป็นต้องส่ง animate ให้คอมโพเนนต์ลูกแต่ละรายการ
// Children inherit animate="visible" from the parent automatically
const parent = { hidden: {}, visible: { transition: { staggerChildren: 0.05 } } };
const child = { hidden: { opacity: 0 }, visible: { opacity: 1 } };
<motion.div variants={parent} initial="hidden" animate="visible">
<motion.p variants={child}>First</motion.p>
<motion.p variants={child}>Second</motion.p>
<motion.p variants={child}>Third</motion.p>
</motion.div>การสลับระหว่างสถานะ
ควบคุมว่า variant ใดทำงานอยู่ด้วยตัวแปรสถานะ Framer Motion จะเปลี่ยนผ่านระหว่างสถานะที่ตั้งชื่อไว้อย่างราบรื่น
const [isOpen, setIsOpen] = useState(false);
const panelVariants = {
closed: { height: 0, opacity: 0 },
open: { height: 'auto', opacity: 1 },
};
<motion.div
variants={panelVariants}
animate={isOpen ? 'open' : 'closed'}
initial="closed"
transition={{ duration: 0.3 }}
/>การเปลี่ยนผ่านแบบกำหนดเองสำหรับแต่ละ Variant
เพิ่มคีย์ transition ภายใน variant เพื่อกำหนดจังหวะเวลาสำหรับสถานะนั้นโดยเฉพาะ
const menuVariants = {
closed: {
scaleY: 0,
transition: { duration: 0.2, ease: 'easeIn' },
},
open: {
scaleY: 1,
transition: { duration: 0.3, ease: 'easeOut', staggerChildren: 0.05 },
},
};Exit Variants กับ AnimatePresence
เพิ่มคีย์ exit ในออบเจ็กต์ variants แล้วครอบคอมโพเนนต์ด้วย AnimatePresence เพื่อทำแอนิเมชันเมื่อถอดคอมโพเนนต์ออกจากการแสดงผล
const pageVariants = {
initial: { opacity: 0, x: '100%' },
enter: { opacity: 1, x: 0 },
exit: { opacity: 0, x: '-100%' },
};
<AnimatePresence mode="wait">
<motion.div
key={router.pathname}
variants={pageVariants}
initial="initial"
animate="enter"
exit="exit"
transition={{ duration: 0.3 }}
/>
</AnimatePresence>การแทนที่ Variant ที่ซ้อนกัน
คอมโพเนนต์ลูกสามารถแทนที่สถานะ variant ที่สืบทอดมาด้วยพร็อพ initial หรือ animate ของตนเอง เพื่อแยกออกจากการควบคุมของคอมโพเนนต์แม่เมื่อจำเป็น
useAnimation สำหรับการควบคุม Variant แบบสั่งการ
useAnimation() ส่งคืนออบเจ็กต์ควบคุมแอนิเมชัน เรียก controls.start('variantName') ด้วยโปรแกรมเพื่อเรียกใช้ variants
const controls = useAnimation();
async function sequence() {
await controls.start('wiggle');
await controls.start('bounce');
}
<motion.div animate={controls} variants={{ wiggle: { rotate: 10 }, bounce: { y: -20 } }} />ตัวเลือกการควบคุมลำดับ
นอกจาก staggerChildren แล้ว คุณยังใช้ when ('beforeChildren' | 'afterChildren') เพื่อจัดลำดับแอนิเมชันของคอมโพเนนต์แม่และลูกได้
const container = {
hidden: { opacity: 0 },
visible: {
opacity: 1,
transition: {
when: 'beforeChildren', // parent fades in before stagger starts
staggerChildren: 0.1,
},
},
};ไลบรารี Variant ที่นำกลับมาใช้ได้
กำหนด variants ในไฟล์ร่วม แล้วนำเข้าไปใช้ในจุดที่ต้องการ เพื่อให้การตั้งค่าแอนิเมชันสอดคล้องกันทั่วทั้งแอป
// lib/variants.ts
export const fadeIn = { hidden: { opacity: 0 }, visible: { opacity: 1 } };
export const slideUp = { hidden: { opacity: 0, y: 20 }, visible: { opacity: 1, y: 0 } };
// Usage:
<motion.div variants={slideUp} initial="hidden" animate="visible" />ตรวจสอบความเข้าใจ
ตัวเลือก transition ใดของ Framer Motion ที่หน่วงแอนิเมชันของคอมโพเนนต์ลูกให้ทำงานต่อกันทีละรายการ
สรุปทบทวน
Variants คือสถานะที่ตั้งชื่อและกำหนดเป็นออบเจ็กต์ ตั้งค่า staggerChildren ใน transition ของคอมโพเนนต์แม่ เพื่อส่งต่อแอนิเมชันไปยังคอมโพเนนต์ลูกโดยอัตโนมัติ ใช้ useAnimation() สำหรับการควบคุมแบบสั่งการ และใช้ AnimatePresence ร่วมกับ exit variants สำหรับแอนิเมชันเมื่อถอดคอมโพเนนต์ออกจากการแสดงผล
คำถามที่พบบ่อย
บทเรียน “Variants สำหรับแอนิเมชันที่ประสานกัน” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “Variants สำหรับแอนิเมชันที่ประสานกัน” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส React Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “Variants สำหรับแอนิเมชันที่ประสานกัน”
กำหนดออบเจ็กต์ variant ที่มีชื่อ และส่งต่อผ่านโครงสร้างคอมโพเนนต์แม่ลูก คุณปฏิบัติ React Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน React Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน React Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “Variants สำหรับแอนิเมชันที่ประสานกัน” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน React Academy นี้ได้ไหม
ได้ บทเรียน React Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- คอมโพเนนต์ Motion และแอนิเมชันพื้นฐาน
- Variants สำหรับแอนิเมชันที่ประสานกัน
- แอนิเมชันจากท่าทาง: Hover, Tap และ Drag
- แอนิเมชันเลย์เอาต์และ AnimatePresence