Ushbu blogning video versiyasi
Framer Motion React bilan UI animatsiyasi uchun eng kuchli kutubxonalardan biri hisoblanadi. Yaqinda men Razorpay-da ishlayotgan ba'zi narsalarim uchun ushbu kutubxona bilan chuqur o'ynash imkoniyatiga ega bo'ldim. Ushbu video-blog postida men o'rganganlarimning bir qismini kengaytiriladigan teg komponentini yaratish orqali baham ko'rishni rejalashtirmoqdaman, uning mazmuni foydalanuvchi kursorning ustiga o'tganda o'zgaradi. Men shunga o'xshash komponentda turli xil chekka holatlarni muhokama qilaman, shuningdek, Framer Motion murakkab tartib animatsiyalarini qanday osonlashtiradi!
Foydalanuvchi sichqonchani ustiga olib kelganida element tarkibini o'zgartirish
:hover
psevdoselektori tufayli hover bilan bog'liq uslublar CSS bilan juda oddiy, ammo hoverda element tarkibini qanday o'zgartirish mumkinligi unchalik aniq emas. Yaxshiyamki, JavaScript ikkita hodisani ochib beradi - onMouseEnter
va onMouseLeave
, ular mos ravishda sichqoncha elementga kirganda yoki elementni tark etganda (ochib qo'yganda) ishga tushadi. Ushbu hodisalar React-dagi holat o'zgaruvchisini yangilash uchun ishlatilishi mumkin, keyin esa element mazmunini shartli ravishda ko'rsatish uchun ishlatiladi.
function ExpandableTag({ unhoveredText, hoveredText }) { const [isHovering, setIsHovering] = useState(false); return ( <div className="inline-block rounded-lg relative text-gray-300 bg-gray-900 ring-1 ring-gray-800 px-4 py-1.5 tracking-wider text-sm font-medium whitespace-nowrap" onMouseEnter={() => setIsHovering(true)} onMouseLeave={() => setIsHovering(false)} > {isHovering ? hoveredText : unhoveredText} </div> ); }
Bizda komponentning asosiy ilovasi tayyor, ammo ikkita muammo bor:
- Hech qanday animatsiya yo'q. Kontent bir zumda o'zgaradi, bu ushbu stsenariyda yaxshi UX bo'lmasligi mumkin va ba'zi nozik animatsiya ushbu komponentni yanada jilo qilishi mumkin.
- Qo'rqinchli miltillash. Buni ushlash qiyin, biroq agar sichqonchaga o'rnatilgan matn sichqonchaga tushirilmagan matndan kichikroq bo'lsa, foydalanuvchi komponentning miltillovchi holatga kirishiga olib kelishi mumkin. komponentlar doimiy ravishda o'zgarib turadi.
Tarkibga o'chadigan / o'chiruvchi animatsiya qo'shish
Birinchi muammoni hal qilish uchun teg ichidagi o'zgaruvchan tarkibga oddiy o'chirish va o'chirishni qo'shishdan boshlaylik. Foydalanuvchi sichqonchani teg ustiga olib kelganida, kursorsiz matn oʻchib ketadi va oʻrnatilgan matn ichkariga tushadi. Buni Framer Motion-da motion
komponenti va AnimatePresence
komponenti bilan bajarish juda oson. AnimatePresence
komponenti motion
komponenti uchun belgilangan chiqish animatsiyasi mavjud bo'lganda ishlatilishi kerak. Bizning holatda, bu kontent UIdanchiqishda o'chib ketadigan animatsiya bo'ladi.
function ExpandableTag({ unhoveredText, hoveredText }) { const [isHovering, setIsHovering] = useState(false); return ( <div className="inline-block rounded-lg relative text-gray-300 bg-gray-900 ring-1 ring-gray-800 px-4 py-1.5 tracking-wider text-sm font-medium whitespace-nowrap" onMouseEnter={() => setIsHovering(true)} onMouseLeave={() => setIsHovering(false)} > <AnimatePresence> <motion.span initial={{ opacity: 0 }} animate={{ opacity: 1 }} exit={{ opacity: 0 }}> {isHovering ? hoveredText : unhoveredText} </motion.span> </AnimatePresence> </div> ); }
Faqat bu muammoni hal qilmaydi, Framer Motion sizning animatsiyalaringiz qachon ishga tushishini bilmaydi, shuning uchun sukut bo'yicha u faqat komponent birinchi o'rnatilganda ishlaydi. Biz foydalanuvchi sichqonchani ko'tarib, elementni ochganda (masalan, tarkib o'zgarganda) animatsiya ishga tushishini xohlaymiz va bu allaqachon isHovering
holat o'zgaruvchisi tomonidan kuzatiladi. Framer Motion-ga animatsiyalarni ishga tushirishni aytish uchun biz shunchaki key
rekvizitini shunday o'rnatishimiz mumkinki, biz animatsiyalarni ishga tushirishni xohlaganimizda u o'zgaradi. Bizning holatda, bu key
ni isHovering
holat o'zgaruvchisiga asoslangan narsaga o'rnatish bo'ladi.
Bundan tashqari, komponent birinchi marta o'rnatilganda kirish animatsiyalari ishga tushishini istamaganimiz sababli, AnimatePresence
komponentidagi initial
propni false
ga o'rnatish orqali biz bu xatti-harakatdan voz kechishimiz mumkin.
function ExpandableTag({ unhoveredText, hoveredText }) { const [isHovering, setIsHovering] = useState(false); return ( <div className="inline-block rounded-lg relative text-gray-300 bg-gray-900 ring-1 ring-gray-800 px-4 py-1.5 tracking-wider text-sm font-medium whitespace-nowrap" onMouseEnter={() => setIsHovering(true)} onMouseLeave={() => setIsHovering(false)} > <AnimatePresence initial={false} > <motion.span initial={{ opacity: 0 }} animate={{ opacity: 1 }} exit={{ opacity: 0 }} key={isHovering ? 'hovering' : 'unhovering'} > {isHovering ? hoveredText : unhoveredText} </motion.span> </AnimatePresence> </div> ); }