0Pricing
React Academy · บทเรียน

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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. คอมโพเนนต์ Motion และแอนิเมชันพื้นฐาน
  2. Variants สำหรับแอนิเมชันที่ประสานกัน
  3. แอนิเมชันจากท่าทาง: Hover, Tap และ Drag
  4. แอนิเมชันเลย์เอาต์และ AnimatePresence
← กลับไปที่ React Academy