แอนิเมชันเลย์เอาต์และ 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 automaticallyAnimatePresence
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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- คอมโพเนนต์ Motion และแอนิเมชันพื้นฐาน
- Variants สำหรับแอนิเมชันที่ประสานกัน
- แอนิเมชันจากท่าทาง: Hover, Tap และ Drag
- แอนิเมชันเลย์เอาต์และ AnimatePresence