TL;DR: 这篇博文提供了使用 React 动画库 Framer Motion 的全面指南。它涵盖了运动组件、变体和过渡等关键概念,并提供了创建淡入淡出按钮、滑入侧边栏、可拖动模式和卡片翻转动画的实际示例。
作为前端开发人员,我们的首要任务是创建让用户参与的 Web 应用程序。这可以通过创建交互式页面并提供更好的用户体验来实现。
动画使您的页面具有互动性;它们引导用户并使交互变得有趣。页面上的微小视觉动作,例如用户交互或事件或页面导航,给人一种活泼的感觉,就像我们正在与一个响应我们的动作的生物进行交互。
动画,简单来说,是一种通过在交互或某些事件上随着时间的推移更新元素的属性或尺寸来视觉上改变元素的方式。例如,显示您的操作正在进行中的加载指示器。
有两种方法可以为网页上的元素设置动画(两种更改元素属性的方法)。
在本文中,我们将探索 Framer Motion,这是最流行的动画库之一。它提供简单性和灵活性,旨在与 React 等现代前端框架配合使用。
Framer Motion 是一个用于 React 的生产就绪动画库,它通过其声明性语法创建简单的动画(例如过渡)和复杂的基于手势的交互。它的特点是:
使用 npm 或 yarn 包管理器将 Framer Motion 库添加到您的项目中。
npm install framer-motion
或者
npm install framer-motion
加载依赖项后,您可以将其包含在项目中以创建交互式动画。
yarn add framer-motion
运动组件:
Framer Motion 附带一系列运动组件来创建 120fps 动画。它提供手势支持,其中包含所有可以使用的特殊 React 组件的 HTML 元素(如motion.div)和常见的 SVG 元素(如motion.square)。
// On Client side import { motion } from "motion/react" // On Server-side import * as motion from "motion/react-client"
道具和 API:
Framer Motion 提供了一系列 API 作为 props,例如定义动画行为的 initial、animate 和 exit。
<motion.div className="card" />
Initial 属性在组件挂载时触发,animate 在组件更新时触发,exit 属性在组件卸载时触发。有关更多详细信息,请参阅完整的 Framer Motion 动画指南。
运动组件独立于 React 生命周期或渲染周期,以提高性能。因此,我们应该依赖 React 状态来实现动画,而不是使用运动值来更新样式而不触发重新渲染。
<motion.button initial={{opacity: 0}} animate={{opacity: 1}} transition={{duration: 1}} exit={{opacity: 0}} > Click Me </motion.button>
变体包括:
自定义组件:任何 React 组件都可以通过将其传递给 motion.create() 函数来转换为运动组件。
import { motion, useMotionValue } from "framer-motion"; const MotionState = () => { const xPosition = useMotionValue(0); useEffect(() => { // It won’t trigger a re-render on the component const interval = setInterval(() => { xPosition.set(xPosition.get() + 100); }, 1000); return () => clearInterval(interval); }, []); return ( <motion.div > <p>In the previous example, the <strong>motion.div</strong> element will be translated by 100px on the x position (horizontally, translateX(100px)) at an interval of 1s.</p> <p><strong>Variants:</strong> framer-motion provides support for the variants, which allows the reuse of animation configurations across multiple elements.<br> </p> <pre class="brush:php;toolbar:false">const AnimatedList = () => { const listVariants = { hidden: { opacity: 0, y: 20 }, visible: { opacity: 1, y: 0, transition: { staggerChildren: 0.2, }, }, }; const itemVariants = { visible: { opacity: 1 }, hidden: { opacity: 0 }, }; return ( <motion.ul initial="hidden" animate="visible" variants={listVariants}> {[1, 2, 3].map((item) => ( <motion.li key={item} variants={itemVariants}> Item {item} </motion.li> ))} </motion.ul> ); };
默认情况下,所有运动道具在传递给 React 组件时都会被过滤掉。动画将应用于组件,但您无法访问 React 中的 props。
要访问运动道具,请在创建运动组件时传递标志 forwardMotionProps: true。
const ReactComponent = (props) => { return <button {...props}>ClickMe>/button>; }; const MotionComponent = motion.create(ReactComponent); const FadingButton2 = () => { return ( <MotionComponent initial={{ opacity: 0 }} animate={{ opacity: 1 }} exit={{ opacity: 0 }} transition={{ duration: 3 }} > Click Me </MotionComponent> ); };
motion.create() 函数还接受一个字符串,该字符串将创建自定义 DOM 元素的运动组件。
const MotionComponent = motion.create(ReactComponent, { forwardMotionProps: true, });
注意:避免在 React 生命周期方法中使用 motion.create(),因为这会每次触发生命周期方法时都会创建一个新组件。
现在您已经了解了 Framer Motion 的工作原理及其 API,让我们看一些如何将其用于常见动画的示例。
npm install framer-motion
exit 属性仅在封装在 AnimatePresence 组件中时才生效。
yarn add framer-motion
AnimatePresence 影响直接子组件,这些子组件是从 React 组件树中删除的运动组件。
这可能是当组件根据生命周期更改(安装、更新、卸载)进行更新时
// On Client side import { motion } from "motion/react" // On Server-side import * as motion from "motion/react-client"
其键更改
<motion.div className="card" />
孩子被添加到列表中或从列表中删除。
<motion.button initial={{opacity: 0}} animate={{opacity: 1}} transition={{duration: 1}} exit={{opacity: 0}} > Click Me </motion.button>
import { motion, useMotionValue } from "framer-motion"; const MotionState = () => { const xPosition = useMotionValue(0); useEffect(() => { // It won’t trigger a re-render on the component const interval = setInterval(() => { xPosition.set(xPosition.get() + 100); }, 1000); return () => clearInterval(interval); }, []); return ( <motion.div > <p>In the previous example, the <strong>motion.div</strong> element will be translated by 100px on the x position (horizontally, translateX(100px)) at an interval of 1s.</p> <p><strong>Variants:</strong> framer-motion provides support for the variants, which allows the reuse of animation configurations across multiple elements.<br> </p> <pre class="brush:php;toolbar:false">const AnimatedList = () => { const listVariants = { hidden: { opacity: 0, y: 20 }, visible: { opacity: 1, y: 0, transition: { staggerChildren: 0.2, }, }, }; const itemVariants = { visible: { opacity: 1 }, hidden: { opacity: 0 }, }; return ( <motion.ul initial="hidden" animate="visible" variants={listVariants}> {[1, 2, 3].map((item) => ( <motion.li key={item} variants={itemVariants}> Item {item} </motion.li> ))} </motion.ul> ); };
过渡 道具在动画中起着至关重要的作用。它们控制动画随时间的进展方式。 Framer Motion 支持多种属性以实现流畅的动画。
Framer Motion 还支持悬停、点击和拖动等手势的交互式动画。
const ReactComponent = (props) => { return <button {...props}>ClickMe>/button>; }; const MotionComponent = motion.create(ReactComponent); const FadingButton2 = () => { return ( <MotionComponent initial={{ opacity: 0 }} animate={{ opacity: 1 }} exit={{ opacity: 0 }} transition={{ duration: 3 }} > Click Me </MotionComponent> ); };
感谢您的阅读! Framer Motion 是一个功能强大的动画库,可以更轻松地向 React 组件添加令人惊叹的动画。它可以帮助您创建简单的动画来处理复杂的基于手势的交互。 Framer Motion 为您的 React 应用程序添加交互有无限的可能性。
Essential Studio® 的新版本可在许可证和下载页面上供现有客户使用。如果您是新用户,请注册我们的 30 天免费试用版以探索我们的功能。
请随时通过我们的支持论坛、支持门户或反馈门户与我们联系。我们随时为您提供帮助!
以上是轻松的 React 动画:Framer 运动指南的详细内容。更多信息请关注PHP中文网其他相关文章!