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

แอนิเมชันเลย์เอาต์และ AnimatePresence

ทำให้การเปลี่ยนแปลงเลย์เอาต์เคลื่อนไหวโดยอัตโนมัติด้วย prop layout และจัดการการเมานต์หรือถอดเมานต์ด้วย AnimatePresence

แอนิเมชันเลย์เอาต์และ AnimatePresence เป็นบทเรียน React Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน React Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน

แอนิเมชันเลย์เอาต์

เพิ่มพร็อพ layout ให้คอมโพเนนต์ motion แล้ว Framer Motion จะทำแอนิเมชันให้การเปลี่ยนแปลงเลย์เอาต์โดยอัตโนมัติ ไม่ว่าจะเป็นขนาดหรือตำแหน่งที่เกิดจากสถานะหรือการเปลี่ยนแปลงของ DOM โดยไม่ต้องกำหนดตำแหน่งด้วยตนเอง

<motion.div layout style={{ width: isExpanded ? 300 : 150 }}>
  {/* Width animates smoothly when isExpanded changes */}
</motion.div>

ค่าของพร็อพ Layout

พร็อพ layout รับค่า true (เลย์เอาต์ทั้งหมด), 'position' (เฉพาะตำแหน่ง) หรือ 'size' (เฉพาะขนาด) เพื่อจำกัดสิ่งที่จะแสดงแอนิเมชัน

<motion.div layout="position"> {/* only x/y positions animate */}
<motion.div layout="size">     {/* only width/height animate */}

layoutId สำหรับการเปลี่ยนผ่านองค์ประกอบร่วม

กำหนด layoutId เดียวกันให้กับองค์ประกอบสองรายการ แล้ว Framer Motion จะแสดงแอนิเมชันระหว่างองค์ประกอบทั้งสองราวกับเป็นองค์ประกอบเดียวกัน แม้จะอยู่คนละคอมโพเนนต์

// Thumbnail in list:
<motion.img layoutId={`photo-${id}`} src={src} className="thumbnail" />

// Full-screen view:
<motion.img layoutId={`photo-${id}`} src={src} className="fullscreen" />
// Framer Motion morphs one into the other automatically

AnimatePresence

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

import { AnimatePresence, motion } from 'framer-motion';

<AnimatePresence>
  {isVisible && (
    <motion.div
      key="notification"
      initial={{ opacity: 0, y: -20 }}
      animate={{ opacity: 1, y: 0 }}
      exit={{ opacity: 0, y: -20 }}
    />
  )}
</AnimatePresence>

ต้องมีพร็อพ key

AnimatePresence ต้องการให้คอมโพเนนต์ลูกแต่ละรายการมี key ที่คงที่ หากไม่มีคีย์ที่ไม่ซ้ำกัน React จะตรวจไม่พบว่าองค์ประกอบใดถูกถอดออกจากการแสดงผลหรือเพียงอัปเดต

// Animating between pages:
<AnimatePresence mode="wait">
  <motion.div key={pathname} ... />
</AnimatePresence>

โหมดของ AnimatePresence

mode ควบคุมการซ้อนทับกันขององค์ประกอบที่กำลังออกและกำลังเข้า 'wait' จะหน่วงแอนิเมชันตอนเข้าไว้จนกว่าแอนิเมชันตอนออกจะเสร็จ ส่วน 'sync' ซึ่งเป็นค่าเริ่มต้น จะทำงานทั้งสองอย่างพร้อมกัน

// Page transitions — wait for old page to exit:
<AnimatePresence mode="wait">
  <motion.main key={pathname} ... />
</AnimatePresence>

// Toast stack — new toasts appear while old ones exit:
<AnimatePresence mode="sync">
  {toasts.map(t => <motion.div key={t.id} ... />)}
</AnimatePresence>

การทำแอนิเมชันรายการด้วย Layout

ใช้ layout ร่วมกับ AnimatePresence เพื่อทำแอนิเมชันเมื่อรายการเปลี่ยนลำดับหรือถูกลบ

<motion.ul>
  <AnimatePresence>
    {items.map(item => (
      <motion.li
        key={item.id}
        layout
        initial={{ opacity: 0, height: 0 }}
        animate={{ opacity: 1, height: 'auto' }}
        exit={{ opacity: 0, height: 0 }}
      >
        {item.name}
      </motion.li>
    ))}
  </AnimatePresence>
</motion.ul>

LayoutGroup

LayoutGroup ประสานงานแอนิเมชันเลย์เอาต์ระหว่างคอมโพเนนต์ motion อิสระหลายรายการ เพื่อให้ทำแอนิเมชันร่วมกันเป็นกลุ่มเดียว

import { LayoutGroup } from 'framer-motion';

<LayoutGroup>
  <Sidebar />
  <MainContent />
  {/* Both animate layout changes together */}
</LayoutGroup>

การแก้ความผิดเพี้ยนของเลย์เอาต์

แอนิเมชันเลย์เอาต์อาจทำให้เส้นขอบ เงา และความโค้งของขอบผิดรูป ใช้พร็อพ layoutDependency หรือการแก้สเกลด้วย CSS เพื่อแก้สิ่งผิดปกติทางภาพ

<motion.div
  layout
  style={{ borderRadius: 12 }}
  // Framer Motion auto-corrects border-radius during scale changes
/>

รูปแบบการเปลี่ยนผ่านตามแกนร่วม

สำหรับขั้นตอนของวิซาร์ดหรือแท็บ ให้ทำแอนิเมชันตำแหน่งบนแกน X ตามทิศทาง เพื่อสร้างความสัมพันธ์เชิงพื้นที่ที่สื่อความหมายระหว่างหน้าจอ

const variants = {
  enter: (dir: number) => ({ x: dir > 0 ? '100%' : '-100%', opacity: 0 }),
  center: { x: 0, opacity: 1 },
  exit: (dir: number) => ({ x: dir < 0 ? '100%' : '-100%', opacity: 0 }),
};

<AnimatePresence custom={direction} mode="wait">
  <motion.div
    key={step}
    custom={direction}
    variants={variants}
    initial="enter"
    animate="center"
    exit="exit"
  />
</AnimatePresence>

ตรวจสอบอย่างรวดเร็ว

โหมดใดของ AnimatePresence ที่จะหน่วงแอนิเมชันการเข้าสู่หน้าจนกว่าแอนิเมชันการออกจากหน้าจะเสร็จสิ้น

สรุปทบทวน

layout จะทำให้การเปลี่ยนแปลงขนาดและตำแหน่งเกิดแอนิเมชันโดยอัตโนมัติ layoutId จะเปลี่ยนรูปร่างระหว่างองค์ประกอบสองรายการที่อยู่คนละตำแหน่งในโครงสร้าง AnimatePresence เปิดใช้แอนิเมชันการออกจากหน้า — อย่าลืมกำหนดพร็อพ key ที่คงที่ให้ลูกเสมอ และเลือก mode='wait' สำหรับการเปลี่ยนหน้า

คำถามที่พบบ่อย

บทเรียน “แอนิเมชันเลย์เอาต์และ AnimatePresence” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “แอนิเมชันเลย์เอาต์และ AnimatePresence” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส React Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “แอนิเมชันเลย์เอาต์และ AnimatePresence”

ทำให้การเปลี่ยนแปลงเลย์เอาต์เคลื่อนไหวโดยอัตโนมัติด้วย prop layout และจัดการการเมานต์หรือถอดเมานต์ด้วย AnimatePresence คุณปฏิบัติ React Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน React Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน React Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “แอนิเมชันเลย์เอาต์และ AnimatePresence” ใช้เวลานานแค่ไหน

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

ฉันเขียนและรันโค้ดในบทเรียน React Academy นี้ได้ไหม

ได้ บทเรียน React Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

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