همه چیز درباره انیمیشن های طرح بندی Framer Motion

Framer Motion از آخرین باری که نوشتم تغییر زیادی کرده است. به قدری که اخیراً در تلاش برای ساختن بتنی کمی گم شدم انیمیشن چیدمان و پست وبلاگ خود من که در واقع به این نوع خاص از انیمیشن نگاه می کرد چندان مفید نبود. با وجود بخش به روز شده ای که در ماه نوامبر اضافه کردم، هنوز احساس می کردم که چند نکته را در این موضوع از دست داده ام و برخی از آنها ناقص هستند.
علاوه بر تغییرات API و بسیاری از ویژگیهای جدید که تیم Framer به مجموعه پیرامون انیمیشنهای چیدمان اضافه کرده است، متوجه شدهام که ترفندهای کوچک زیادی وجود دارد که میتواند باعث شود انیمیشنهای چیدمان شما از احساس ناهنجاری به ✨کاملاً✨ تبدیل شوند. با این حال، آنها کمی پنهان هستند یا فاقد نمونه های عملی برای درک کامل آنها هستند.
بنابراین احساس کردم زمان نوشتن فرا رسیده است یک شیرجه عمیق ویژه به انواع مختلف انیمیشن های طرح بندی. هدف من این است که در مواقعی که به تجدید نظر در مورد انیمیشن های چیدمان نیاز دارید یا با مشکل مواجه هستید، این مقاله محل مراجعه شما باشد. من هم تعدادی از آنها را به شما می دهم نکات و ترفندهای خودم که من برای حل برخی از مشکلاتی که انیمیشن های چیدمان می توانند ایجاد کنند و مثال هایی از نحوه ترکیب آنها با ابزارهای دیگر در کتابخانه مانند AnimatePresence برای دستیابی به جلوه های کاملاً لذت بخش در پروژه های خود!
مبانی انیمیشن های چیدمان
قبل از اینکه به ویژگیهای جدید و نمونههای پیچیده انیمیشنهای چیدمان بپردازیم، بیایید نگاهی به اصول اولیه بیندازیم تا دوباره با نحوه کار آنها آشنا شویم.
تازه سازی مختصر انیمیشن های طرح بندی
در Framer Motion می توانید یک را متحرک کنید motion جزء بین تفاوت طرح بندی ها با تنظیم layout پشتیبانی از true. این منجر به چیزی می شود که ما الف می نامیم انیمیشن چیدمان.
ما نمی توانیم a را متحرک کنیم motion جزء بین طرح بندی با استفاده از ترکیبی از initial و animate مانند سایر انواع انیمیشن های Framer Motion. به همین دلیل ما نیاز دارند برای استفاده layout پشتیبانی کنید
در مثال زیر، اولین نمایش از یک انیمیشن چیدمان را خواهید دید:
-
می توانید موقعیت را تغییر دهید
motionجزء، مربع، در امتداد محور x. -
می توانید فعال یا غیرفعال کنید
layoutحمایت از اینmotionجزء
ما می توانیم ببینیم که هر بار که طرح را تغییر می دهیم یعنی. رندر مجدد رخ می دهد، layout prop کامپوننت را فعال می کند برای انتقال صاف از چیدمان قبلی به طرح جدید انتخاب شده. با این حال، بدون آن، هیچ انتقالی وجود ندارد: مربع به شدت حرکت خواهد کرد.
انیمیشن های چیدمان “چیزها را صاف می کنند” و سطح خاصی از فیزیکی را به برخی از تعاملات کاربر اضافه می کنند که در آن چیزها معمولاً به طور ناگهانی تغییر می کنند. یکی از مثالهایی که میتوانند در آن بدرخشند، زمانی است که آیتمها را از فهرست اضافه یا حذف میکنید. من تمایل دارم از انیمیشن های طرح بندی زیادی برای موارد استفاده مانند این استفاده کنم، به خصوص در ترکیب با سایر ویژگی های Framer Motion مانند AnimatePresence.
زمین بازی زیر یکی از زمین های بازی من را نشان می دهد NotificationList مؤلفه ای که از انیمیشن های طرح بندی استفاده می کند:
-
هر اعلان در یک بسته بندی شده است
motionجزء باlayoutپایه تنظیم شده بهtrue. -
لیست کلی پیچیده شده است
AnimatePresenceبنابراین به هر عنصر در لیست اجازه می دهد که داشته باشدexitانیمیشن -
با کلیک بر روی هر یک از اعلانهای موجود در لیست، آنها حذف میشوند و به لطف انیمیشنهای طرحبندی، پشته به زیبایی خود را تغییر میدهد.
import { motion, AnimatePresence } from 'framer-motion'; import React from 'react'; import { Wrapper, Toast } from './Components'; import './scene.css'; const ITEMS = ['Welcome 👋', 'An error occurred 💥', 'You did it 🎉!', 'Success ✅', 'Warning ⚠️']; const Notifications = () => { const [notifications, setNotifications] = React.useState(ITEMS) return ( Wrapper> AnimatePresence> {notifications.map((item) => motion.div key={item} onClick={() => setNotifications((prev) => prev.filter(notification => notification !== item))} layout initial={{ y: 150, x: 0, opacity: 0, }} animate={{ y: 0, x: 0, opacity: 1, }} exit={{ opacity: 0, }} > Toast>{item}Toast> motion.div> )} AnimatePresence> Wrapper> ); } export default Notifications
اصلاح تحریفات
هنگام اجرای یک انیمیشن طرحبندی که بر اندازه یک مؤلفه تأثیر میگذارد، ممکن است در طول انتقال برای برخی ویژگیها مانند borderRadius یا boxShadow. این اعوجاج ها حتی اگر این ویژگی ها بخشی از انیمیشن نباشند رخ خواهند داد.
خوشبختانه، یک راه حل آسان برای رفع این موارد وجود دارد: این ویژگی ها را به عنوان سبک های درون خطی تنظیم کنید، همانطور که در زیر نشان داده شده است:
10
.box[data-expanded="true"] {19
data-expanded={expanded}
اطلاعات بیشتر در مورد صفحه چیدمان
ما به تازگی این تنظیمات را دیدیم layout پشتیبانی از true ما را قادر میسازد تا با انتقال ویژگیهای مربوط به اندازه یا موقعیت، یک مؤلفه را بین طرحبندیها متحرک کنیم. من اخیراً متوجه شدم که ارزشهای بیشتری از آن وجود دارد layout پشتیبانی ممکن است:
-
layout="position": ما فقط خواص مربوط به موقعیت را به آرامی پاس می کنیم. ویژگی های مربوط به اندازه به طور ناگهانی از بین می روند. -
layout="size": ما فقط ویژگی های مربوط به اندازه را به آرامی انتخاب می کنیم. خواص مرتبط با موقعیت به طور ناگهانی عبور می کند.
برای نشان دادن این موضوع، ویجت زیر را ایجاد کردم که نحوه انتقال a را نشان می دهد motion مولفه بر اساس مقدار تغییر می کند layout پشتیبانی:
چرا باید از این دیگران استفاده کنیم layout خواص؟ فایده عملی چیست؟ ممکن است بپرسید گاهی اوقات، در نتیجه یک انیمیشن چیدمان، محتوای یک جزء تغییر اندازه ممکن است در نهایت “فشرده” یا “کشیده” شود. اگر هنگام کار بر روی یک انیمیشن چیدمان مشاهده کردید که این اتفاق می افتد، به احتمال زیاد می توان آن را به سادگی با تنظیم layout پشتیبانی از position.
در زیر نمونه ای از چنین موارد استفاده را خواهید دید:
-
حذف موارد در این لیست افقی بر اندازه هر جزء تأثیر می گذارد. بهطور پیشفرض، متوجه خواهید شد که وقتی یک آیتم حذف میشود، اجزاء کمی خرد میشوند.
-
محتوا را در یک بپیچید
motionجزء و تنظیمlayoutبهpositionبا چرخاندن سوئیچ هر گونه اعوجاجی که ممکن است در محتوای آن مشاهده کنید اصلاح می شودmotionمسدود کردن هر جزء به زیبایی با موارد بیشتری تغییر اندازه می دهد به طور طبیعی انتقال
نمونه ای از استفاده عملی از layout=”position”
2
Label variant="success">7
justifyContent: 'start',
Drag-to-reorder items in a list where each item then smoothly moves to its final position is perhaps the best in class use case when it comes to layout animations. It's actually the first use case I thought about when I discovered layout animations in the first place a year ago.
Lucky us, the developers at Framer gave us a ready-to-use set of components to handle that specific use case with ease 🎉. They provided 2 components that we're going to use in follow-up examples:
Reorder.Groupwhere we pass our list of items, the direction of the reorder (horizontal or vertical), and theonReordercallback which will return the latest order of the listReorder.Itemwhere we pass the value of an item in the list
Simple examples of drag-to-reorder list using Reorder
2
const [items, setItems] = React.useState(['Item 1', 'Item 2', 'Item 3']);15
{items.map((item) => (17
Reorder.Item key={item} value={item}>
تنها با چند خط کد، میتوانیم یک لیست آماده برای استفاده با افکت کشیدن مرتبسازی مجدد دریافت کنیم! و این همه ماجرا نیست:
-
همه
Reorder.Itemجزء حرکت است -
همه
Reorder.Itemجزء موجود در لیست میتواند، خارج از جعبه، انیمیشنهای طرحبندی را انجام دهد
بنابراین، اضافه کردن انیمیشن های بسیار بیشتر در بالای این مؤلفه برای ایجاد یک تجربه کاربری واقعاً لذت بخش بسیار آسان است. با این حال، دو صید کوچک وجود دارد که من فقط در زمان شروع کار با آنها کشف کردم Reorder اجزاء 👇
ترکیب همه چیز
در زمین بازی زیر، نمونه پیشرفته تری را خواهید دید که از آن استفاده می کند Reorder.Group و Reorder.Item به همراه برخی از جنبه های دیگر انیمیشن های طرح بندی که قبلاً دیدیم:
وقتی کارتان تمام شد، موارد فهرست را بررسی کنید!
-
layout="position"بر روی محتوای هر عنصر استفاده می شود تا هنگام انتخاب و اجرای انیمیشن طرح بندی از تحریف جلوگیری شود. -
استفاده از کامپوننت های سفارشی استایل React
Reorderاجزای چند شکلی
8
Card.Body as={motion.div} layout="position">10
id={`checkbox-${item.id}`}11
aria-label="Mark as done"12
checked={item.checked}13
onChange={() => completeItem(item.id)}
-
از سبک های درون خطی استفاده می شود
borderRadiusاز مورد برای جلوگیری از اعوجاج هنگام تغییر اندازه مورد -
position: relativeبه عنوان یک سبک درون خطی به اضافه شده استReorder.Itemبرای رفع مشکلات همپوشانی که هنگام کشیدن موارد لیست روی یکدیگر رخ می دهد -
AnimatePresenceهنگامی که موارد از لیست حذف می شوند، برای فعال کردن انیمیشن های خروجی استفاده می شود
5
exit={{ opacity: 0, transition: { duration: 0.2 } }}12
width: item.checked ? '70%' : '100%',
2
Reorder.Group axis="y" values={items} onReorder={setItems}>9
span>Check items off the list when you're done!span>
آیا می خواهید این مثال را اجرا کنید و خودتان آن را هک کنید؟ می توانید اجرای کامل این مثال را در مخزن Github وبلاگ من بیابید.
اکنون تقریباً همه چیزهایی را که باید در مورد انیمیشن های طرح بندی Framer Motion بدانید، می دانید. خواه این موارد استفاده اولیه مانند لیست اعلانهایی باشد که در قسمت اول دیدیم، اضافه کردن جزئیات کوچک مانند انیمیشنهای طرحبندی مشترک از اجزای برگه، برای ساخت لیستهای قابل مرتبسازی مجدد با انتقالهای پیچیده: انیمیشن های چیدمان دیگر هیچ رازی برای شما ندارند.
امیدوارم این پست وبلاگ بتواند به عنوان یک راهنما/کمک باشد تا انیمیشن های خود را کاملاً بی نقص جلوه دهد ✨ مخصوصاً زمانی که روی جزئیات دقیق تر انتقالات کار می کنید. ممکن است صرف زمان زیادی برای خواندن و کار کردن روی مشکلاتی که در این پست وبلاگ ارائه کرده ایم بسیار زیاد به نظر برسد، اما به من اعتماد کنید، ارزشش را دارد!
می خواهید بیشتر بروید؟
من پیشنهاد می کنم برخی از نمونه های پیچیده ارائه شده در مستندات Framer Motion را مشاهده کنید. تیم نمونههای خوب زیادی مانند این مؤلفه کشیدن و رها کردن برای مرتبسازی مجدد برگهها ارائه کرد که شامل هر مفهومی است که در مثال فهرست کارهایی که در این پست وبلاگ ارائه کردم، استفاده شده است.
سپس سعی می کنم ببینم کجا می توانید جادوی انیمیشن چیدمان را روی پروژه های خود بپاشید. هیچ راهی برای یادگیری بهتر از این نیست که چیزها را خودتان بسازید!




