輕鬆的 React 動畫:Framer 運動指南
TL;DR: 這篇部落格文章提供了使用 React 動畫庫 Framer Motion 的全面指南。它涵蓋了運動組件、變體和過渡等關鍵概念,並提供了創建淡入淡出按鈕、滑入側邊欄、可拖曳模式和卡片翻轉動畫的實際範例。
身為前端開發人員,我們的首要任務是建立讓使用者參與的 Web 應用程式。這可以透過建立互動式頁面並提供更好的使用者體驗來實現。
動畫使您的頁面具有互動性;它們引導使用者並使互動變得有趣。頁面上的微小視覺動作,例如用戶互動或事件或頁面導航,給人一種活潑的感覺,就像我們正在與一個響應我們的動作的生物進行互動。
動畫,簡單來說,是一種透過在互動或某些事件上隨著時間的推移更新元素的屬性或尺寸來視覺上改變元素的方式。例如,顯示您的操作正在進行中的載入指示器。
有兩種方法可以為網頁上的元素設定動畫(兩種更改元素屬性的方法)。
- 透過 CSS,Animate.css 等函式庫提供了一組可以加入 HTML 元素的動畫類別。
- 透過 JavaScript,像 Framer Motion 這樣的函式庫可以在執行時透過程式碼操縱 DOM 元素的屬性。
在本文中,我們將探索 Framer Motion,這是最受歡迎的動畫庫之一。它提供簡單性和靈活性,旨在與 React 等現代前端框架配合使用。
為什麼選擇 Framer Motion?
Framer Motion 是一個用於 React 的生產就緒動畫庫,它透過其聲明性語法創建簡單的動畫(例如過渡)和複雜的基於手勢的互動。它的特點是:
- 易於使用: Framer Motion 憑藉其直覺的 API 和方法,非常簡單且易於使用。
- 靈活性:它可用於創建複雜的動畫,如平移、拖曳、捏合,或簡單的動畫,如淡入淡出、過渡。
- 效能:運動組件針對效能進行了最佳化,因為它們在 React 生命週期之外渲染,以平穩運行並確保無縫的使用者體驗。
- 社群與支援:廣泛的文件、大量範例以及社群的廣泛採用使入門變得更加容易。
Framer Motion 入門
使用 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>
變異體包括:
- listVariants: 定義整個清單的動畫行為,我們在將存取其觸發時的屬性的道具上傳遞變體值。 初始=「隱藏」和動畫=「可見」。 staggerChildren 確保子元素依序動畫。
- itemVariants: 定義清單項目的動畫行為。
- motion.ul 和 motion.li 組件繼承變體以創建協調的動畫。
自訂元件:任何 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
- initial: 當元素不是視口時,設定按鈕 opacity:0 的初始狀態。
- animate: 當元素位於視窗中時,將按鈕的狀態設為 opacity:1。
- transition: 配置動畫過渡;該按鈕將需要一秒鐘的時間從 opacity:0 變為 opacity:1
- exit: 設定元素離開視口時按鈕的狀態。
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 支援多種屬性以實現流暢的動畫。
- 持續時間: 動畫的長度(以秒為單位)
- 延遲: 延遲動畫的開始(以秒為單位)
- ease: 一組緩動函數,提倡動畫如何進行(‘ease’、‘easeIn’、‘easeInOut’)
可拖曳模態
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> ); };
- Page: 用運動動畫包裹子組件。
- Initial, animate, & exit: 處理動畫出現和消失頁導航上的組件。
感謝您的閱讀! Framer Motion 是一個功能強大的動畫庫,可以更輕鬆地在 React 元件中添加令人驚嘆的動畫。它可以幫助您創建簡單的動畫來處理複雜的基於手勢的互動。 Framer Motion 為您的 React 應用程式添加互動有無限的可能性。
Essential Studio® 的新版本可在許可證和下載頁面上供現有客戶使用。如果您是新用戶,請註冊我們的 30 天免費試用版以探索我們的功能。
請隨時透過我們的支援論壇、支援入口網站或回饋入口網站與我們聯繫。我們隨時為您提供協助!
相關部落格
- 可實現流暢文件處理的前 5 個 React PDF 檢視器
- 2025 年前 5 名的 React 圖表庫
- Vite.js:建立更快的前端
- React 的 RxJS:解鎖反應狀態
以上是輕鬆的 React 動畫:Framer 運動指南的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

JavaScript在Web開發中的主要用途包括客戶端交互、表單驗證和異步通信。 1)通過DOM操作實現動態內容更新和用戶交互;2)在用戶提交數據前進行客戶端驗證,提高用戶體驗;3)通過AJAX技術實現與服務器的無刷新通信。

JavaScript在現實世界中的應用包括前端和後端開發。 1)通過構建TODO列表應用展示前端應用,涉及DOM操作和事件處理。 2)通過Node.js和Express構建RESTfulAPI展示後端應用。

理解JavaScript引擎內部工作原理對開發者重要,因為它能幫助編寫更高效的代碼並理解性能瓶頸和優化策略。 1)引擎的工作流程包括解析、編譯和執行三個階段;2)執行過程中,引擎會進行動態優化,如內聯緩存和隱藏類;3)最佳實踐包括避免全局變量、優化循環、使用const和let,以及避免過度使用閉包。

Python和JavaScript在社區、庫和資源方面的對比各有優劣。 1)Python社區友好,適合初學者,但前端開發資源不如JavaScript豐富。 2)Python在數據科學和機器學習庫方面強大,JavaScript則在前端開發庫和框架上更勝一籌。 3)兩者的學習資源都豐富,但Python適合從官方文檔開始,JavaScript則以MDNWebDocs為佳。選擇應基於項目需求和個人興趣。

Python和JavaScript在開發環境上的選擇都很重要。 1)Python的開發環境包括PyCharm、JupyterNotebook和Anaconda,適合數據科學和快速原型開發。 2)JavaScript的開發環境包括Node.js、VSCode和Webpack,適用於前端和後端開發。根據項目需求選擇合適的工具可以提高開發效率和項目成功率。

C和C 在JavaScript引擎中扮演了至关重要的角色,主要用于实现解释器和JIT编译器。1)C 用于解析JavaScript源码并生成抽象语法树。2)C 负责生成和执行字节码。3)C 实现JIT编译器,在运行时优化和编译热点代码,显著提高JavaScript的执行效率。

Python更適合數據科學和自動化,JavaScript更適合前端和全棧開發。 1.Python在數據科學和機器學習中表現出色,使用NumPy、Pandas等庫進行數據處理和建模。 2.Python在自動化和腳本編寫方面簡潔高效。 3.JavaScript在前端開發中不可或缺,用於構建動態網頁和單頁面應用。 4.JavaScript通過Node.js在後端開發中發揮作用,支持全棧開發。
