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"></motion.div>
Initial 屬性在元件掛載時觸發,animate 在元件更新時觸發,exit 屬性在元件卸載時觸發。有關更多詳細信息,請參閱完整的 Framer Motion 動畫指南。
運動元件獨立於 React 生命週期或渲染週期,以提高效能。因此,我們應該依賴 React 狀態來實現動畫,而不是使用運動值來更新樣式而不觸發重新渲染。
<motion.button initial="{{opacity:" animate="{{opacity:" transition="{{duration:" exit="{{opacity:"> 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>ClickMe>/button>; }; const MotionComponent = motion.create(ReactComponent); const FadingButton2 = () => { return ( <motioncomponent initial="{{" opacity: animate="{{" exit="{{" transition="{{" duration:> Click Me </motioncomponent> ); }; </button>
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.div>
孩子被加入到清單中或從清單中刪除。
<motion.button initial="{{opacity:" animate="{{opacity:" transition="{{duration:" exit="{{opacity:"> 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>ClickMe>/button>; }; const MotionComponent = motion.create(ReactComponent); const FadingButton2 = () => { return ( <motioncomponent initial="{{" opacity: animate="{{" exit="{{" transition="{{" duration:> Click Me </motioncomponent> ); }; </button>
- 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中文網其他相關文章!

JavaScript字符串替換方法詳解及常見問題解答 本文將探討兩種在JavaScript中替換字符串字符的方法:在JavaScript代碼內部替換和在網頁HTML內部替換。 在JavaScript代碼內部替換字符串 最直接的方法是使用replace()方法: str = str.replace("find","replace"); 該方法僅替換第一個匹配項。要替換所有匹配項,需使用正則表達式並添加全局標誌g: str = str.replace(/fi

因此,在這裡,您準備好了解所有稱為Ajax的東西。但是,到底是什麼? AJAX一詞是指用於創建動態,交互式Web內容的一系列寬鬆的技術。 Ajax一詞,最初由Jesse J創造

10款趣味橫生的jQuery遊戲插件,讓您的網站更具吸引力,提升用戶粘性!雖然Flash仍然是開發休閒網頁遊戲的最佳軟件,但jQuery也能創造出令人驚喜的效果,雖然無法與純動作Flash遊戲媲美,但在某些情況下,您也能在瀏覽器中獲得意想不到的樂趣。 jQuery井字棋遊戲 遊戲編程的“Hello world”,現在有了jQuery版本。 源碼 jQuery瘋狂填詞遊戲 這是一個填空遊戲,由於不知道單詞的上下文,可能會產生一些古怪的結果。 源碼 jQuery掃雷遊戲

本教程演示瞭如何使用jQuery創建迷人的視差背景效果。 我們將構建一個帶有分層圖像的標題橫幅,從而創造出令人驚嘆的視覺深度。 更新的插件可與JQuery 1.6.4及更高版本一起使用。 下載

本文討論了在瀏覽器中優化JavaScript性能的策略,重點是減少執行時間並最大程度地減少對頁面負載速度的影響。

Matter.js是一個用JavaScript編寫的2D剛體物理引擎。此庫可以幫助您輕鬆地在瀏覽器中模擬2D物理。它提供了許多功能,例如創建剛體並為其分配質量、面積或密度等物理屬性的能力。您還可以模擬不同類型的碰撞和力,例如重力摩擦力。 Matter.js支持所有主流瀏覽器。此外,它也適用於移動設備,因為它可以檢測觸摸並具有響應能力。所有這些功能都使其值得您投入時間學習如何使用該引擎,因為這樣您就可以輕鬆創建基於物理的2D遊戲或模擬。在本教程中,我將介紹此庫的基礎知識,包括其安裝和用法,並提供一

本文演示瞭如何使用jQuery和ajax自動每5秒自動刷新DIV的內容。 該示例從RSS提要中獲取並顯示了最新的博客文章以及最後的刷新時間戳。 加載圖像是選擇


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Atom編輯器mac版下載
最受歡迎的的開源編輯器

Dreamweaver Mac版
視覺化網頁開發工具

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),