亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

首頁 web前端 js教程 輕松的 React 動畫:Framer 運動指南

輕松的 React 動畫:Framer 運動指南

Jan 23, 2025 pm 10:39 PM

Effortless React Animation: A Guide to Framer Motion

TL;DR: 這篇博文提供了使用 React 動畫庫 Framer Motion 的全面指南。它涵蓋了運動組件、變體和過渡等關(guān)鍵概念,并提供了創(chuàng)建淡入淡出按鈕、滑入側(cè)邊欄、可拖動模式和卡片翻轉(zhuǎn)動畫的實際示例。

作為前端開發(fā)人員,我們的首要任務是創(chuàng)建讓用戶參與的 Web 應用程序。這可以通過創(chuàng)建交互式頁面并提供更好的用戶體驗來實現(xiàn)。

動畫使您的頁面具有互動性;它們引導用戶并使交互變得有趣。頁面上的微小視覺動作,例如用戶交互或事件或頁面導航,給人一種活潑的感覺,就像我們正在與一個響應我們的動作的生物進行交互。

動畫,簡單來說,是一種通過在交互或某些事件上隨著時間的推移更新元素的屬性或尺寸來視覺上改變元素的方式。例如,顯示您的操作正在進行中的加載指示器。

有兩種方法可以為網(wǎng)頁上的元素設置動畫(兩種更改元素屬性的方法)。

  1. 通過 CSS,Animate.css 等庫提供了一組可以添加到 HTML 元素的動畫類。
  2. 通過 JavaScript,像 Framer Motion 這樣的庫可以在運行時通過代碼操縱 DOM 元素的屬性。

在本文中,我們將探索 Framer Motion,這是最流行的動畫庫之一。它提供簡單性和靈活性,旨在與 React 等現(xiàn)代前端框架配合使用。

為什么選擇 Framer Motion?

Framer Motion 是一個用于 React 的生產(chǎn)就緒動畫庫,它通過其聲明性語法創(chuàng)建簡單的動畫(例如過渡)和復雜的基于手勢的交互。它的特點是:

  • 易于使用: Framer Motion 憑借其直觀的 API 和方法,非常簡單且易于使用。
  • 靈活性:它可用于創(chuàng)建復雜的動畫,如平移、拖動、捏合,或簡單的動畫,如淡入淡出、過渡。
  • 性能:運動組件針對性能進行了優(yōu)化,因為它們在 React 生命周期之外渲染,以平穩(wěn)運行并確保無縫的用戶體驗。
  • 社區(qū)和支持:廣泛的文檔、大量示例以及社區(qū)的廣泛采用使入門變得更加容易。

Framer Motion 入門

使用 npmyarn 包管理器將 Framer Motion 庫添加到您的項目中。

npm install framer-motion

或者

npm install framer-motion

加載依賴項后,您可以將其包含在項目中以創(chuàng)建交互式動畫。

yarn add framer-motion

基本概念

運動組件:

Framer Motion 附帶一系列運動組件來創(chuàng)建 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、animateexit。

<motion.div className="card" />

Initial 屬性在組件掛載時觸發(fā),animate 在組件更新時觸發(fā),exit 屬性在組件卸載時觸發(fā)。有關(guān)更多詳細信息,請參閱完整的 Framer Motion 動畫指南。

運動組件獨立于 React 生命周期或渲染周期,以提高性能。因此,我們應該依賴 React 狀態(tài)來實現(xiàn)動畫,而不是使用運動值來更新樣式而不觸發(fā)重新渲染。

<motion.button
  initial={{opacity: 0}}
  animate={{opacity: 1}}
  transition={{duration: 1}}
  exit={{opacity: 0}}
>
  Click Me
</motion.button>

變體包括:

  • listVariants: 定義整個列表的動畫行為,我們在將訪問其觸發(fā)時的屬性的道具上傳遞變體值。 初始=“隱藏”動畫=“可見”。 staggerChildren 確保子元素按順序動畫。
  • itemVariants: 定義列表項的動畫行為。
  • motion.ulmotion.li 組件繼承變體以創(chuàng)建協(xié)調(diào)的動畫。

自定義組件:任何 React 組件都可以通過將其傳遞給 motion.create() 函數(shù)來轉(zhuǎn)換為運動組件。

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。

要訪問運動道具,請在創(chuàng)建運動組件時傳遞標志 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() 函數(shù)還接受一個字符串,該字符串將創(chuàng)建自定義 DOM 元素的運動組件。

const MotionComponent = motion.create(ReactComponent, {
  forwardMotionProps: true,
});

注意:避免在 React 生命周期方法中使用 motion.create(),因為這會每次觸發(fā)生命周期方法時都會創(chuàng)建一個新組件。

現(xiàn)在您已經(jīng)了解了 Framer Motion 的工作原理及其 API,讓我們看一些如何將其用于常見動畫的示例。

示例

褪色按鈕

npm install framer-motion
  • initial: 當元素不是視口時,設置按鈕 opacity:0 的初始狀態(tài)。
  • animate: 當元素位于視口中時,將按鈕的狀態(tài)設置為 opacity:1。
  • transition: 配置動畫過渡;該按鈕將需要一秒鐘的時間從 opacity:0 變?yōu)?opacity:1
  • exit: 設置元素離開視口時按鈕的狀態(tài)。

exit 屬性僅在封裝在 AnimatePresence 組件中時才生效。

yarn add framer-motion

AnimatePresence 影響直接子組件,這些子組件是從 React 組件樹中刪除的運動組件。

這可能是當組件根據(jù)生命周期更改(安裝、更新、卸載)進行更新時

// 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>

滑入式側(cè)邊欄

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>
  );
};

過渡 道具在動畫中起著至關(guān)重要的作用。它們控制動畫隨時間的進展方式。 Framer Motion 支持多種屬性以實現(xiàn)流暢的動畫。

  • 持續(xù)時間: 動畫的長度(以秒為單位)
  • 延遲: 延遲動畫的開始(以秒為單位)
  • ease: 一組緩動函數(shù),提倡動畫如何進行(‘ease’、‘easeIn’、‘easeInOut’)

可拖動模態(tài)

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: 處理動畫的出現(xiàn)和消失頁面導航上的組件。

結(jié)論

感謝您的閱讀! Framer Motion 是一個功能強大的動畫庫,可以更輕松地向 React 組件添加令人驚嘆的動畫。它可以幫助您創(chuàng)建簡單的動畫來處理復雜的基于手勢的交互。 Framer Motion 為您的 React 應用程序添加交互有無限的可能性。

Essential Studio? 的新版本可在許可證和下載頁面上供現(xiàn)有客戶使用。如果您是新用戶,請注冊我們的 30 天免費試用版以探索我們的功能。

請隨時通過我們的支持論壇、支持門戶或反饋門戶與我們聯(lián)系。我們隨時為您提供幫助!

相關(guān)博客

  • 可實現(xiàn)流暢文檔處理的前 5 個 React PDF 查看器
  • 2025 年排名前 5 的 React 圖表庫
  • Vite.js:構(gòu)建更快的前端
  • React 的 RxJS:解鎖反應狀態(tài)

以上是輕松的 React 動畫:Framer 運動指南的詳細內(nèi)容。更多信息請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻,版權(quán)歸原作者所有,本站不承擔相應法律責任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動的應用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機

Video Face Swap

Video Face Swap

使用我們完全免費的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級代碼編輯軟件(SublimeText3)

熱門話題

Laravel 教程
1597
29
PHP教程
1488
72
如何在node.js中提出HTTP請求? 如何在node.js中提出HTTP請求? Jul 13, 2025 am 02:18 AM

在Node.js中發(fā)起HTTP請求有三種常用方式:使用內(nèi)置模塊、axios和node-fetch。1.使用內(nèi)置的http/https模塊無需依賴,適合基礎場景,但需手動處理數(shù)據(jù)拼接和錯誤監(jiān)聽,例如用https.get()獲取數(shù)據(jù)或通過.write()發(fā)送POST請求;2.axios是基于Promise的第三方庫,語法簡潔且功能強大,支持async/await、自動JSON轉(zhuǎn)換、攔截器等,推薦用于簡化異步請求操作;3.node-fetch提供類似瀏覽器fetch的風格,基于Promise且語法簡單

JavaScript數(shù)據(jù)類型:原始與參考 JavaScript數(shù)據(jù)類型:原始與參考 Jul 13, 2025 am 02:43 AM

JavaScript的數(shù)據(jù)類型分為原始類型和引用類型。原始類型包括string、number、boolean、null、undefined和symbol,其值不可變且賦值時復制副本,因此互不影響;引用類型如對象、數(shù)組和函數(shù)存儲的是內(nèi)存地址,指向同一對象的變量會相互影響。判斷類型可用typeof和instanceof,但需注意typeofnull的歷史問題。理解這兩類差異有助于編寫更穩(wěn)定可靠的代碼。

React與Angular vs Vue:哪個JS框架最好? React與Angular vs Vue:哪個JS框架最好? Jul 05, 2025 am 02:24 AM

選哪個JavaScript框架最好?答案是根據(jù)需求選擇最適合的。1.React靈活自由,適合需要高度定制、團隊有架構(gòu)能力的中大型項目;2.Angular提供完整解決方案,適合企業(yè)級應用和長期維護的大項目;3.Vue上手簡單,適合中小型項目或快速開發(fā)。此外,是否已有技術(shù)棧、團隊規(guī)模、項目生命周期及是否需要SSR也都是選擇框架的重要因素。總之,沒有絕對最好的框架,適合自己需求的就是最佳選擇。

JavaScript時間對象,某人構(gòu)建了一個eactexe,在Google Chrome上更快的網(wǎng)站等等 JavaScript時間對象,某人構(gòu)建了一個eactexe,在Google Chrome上更快的網(wǎng)站等等 Jul 08, 2025 pm 02:27 PM

JavaScript開發(fā)者們,大家好!歡迎閱讀本周的JavaScript新聞!本周我們將重點關(guān)注:Oracle與Deno的商標糾紛、新的JavaScript時間對象獲得瀏覽器支持、GoogleChrome的更新以及一些強大的開發(fā)者工具。讓我們開始吧!Oracle與Deno的商標之爭Oracle試圖注冊“JavaScript”商標的舉動引發(fā)爭議。Node.js和Deno的創(chuàng)建者RyanDahl已提交請愿書,要求取消該商標,他認為JavaScript是一個開放標準,不應由Oracle

什么是緩存API?如何與服務人員使用? 什么是緩存API?如何與服務人員使用? Jul 08, 2025 am 02:43 AM

CacheAPI是瀏覽器提供的一種緩存網(wǎng)絡請求的工具,常與ServiceWorker配合使用,以提升網(wǎng)站性能和離線體驗。1.它允許開發(fā)者手動存儲如腳本、樣式表、圖片等資源;2.可根據(jù)請求匹配緩存響應;3.支持刪除特定緩存或清空整個緩存;4.通過ServiceWorker監(jiān)聽fetch事件實現(xiàn)緩存優(yōu)先或網(wǎng)絡優(yōu)先等策略;5.常用于離線支持、加快重復訪問速度、預加載關(guān)鍵資源及后臺更新內(nèi)容;6.使用時需注意緩存版本控制、存儲限制及與HTTP緩存機制的區(qū)別。

處理諾言:鏈接,錯誤處理和承諾在JavaScript中 處理諾言:鏈接,錯誤處理和承諾在JavaScript中 Jul 08, 2025 am 02:40 AM

Promise是JavaScript中處理異步操作的核心機制,理解鏈式調(diào)用、錯誤處理和組合器是掌握其應用的關(guān)鍵。1.鏈式調(diào)用通過.then()返回新Promise實現(xiàn)異步流程串聯(lián),每個.then()接收上一步結(jié)果并可返回值或Promise;2.錯誤處理應統(tǒng)一使用.catch()捕獲異常,避免靜默失敗,并可在catch中返回默認值繼續(xù)流程;3.組合器如Promise.all()(全成功才成功)、Promise.race()(首個完成即返回)和Promise.allSettled()(等待所有完成)

利用Array.Prototype方法用于JavaScript中的數(shù)據(jù)操作 利用Array.Prototype方法用于JavaScript中的數(shù)據(jù)操作 Jul 06, 2025 am 02:36 AM

JavaScript數(shù)組內(nèi)置方法如.map()、.filter()和.reduce()可簡化數(shù)據(jù)處理;1).map()用于一對一轉(zhuǎn)換元素生成新數(shù)組;2).filter()按條件篩選元素;3).reduce()用于聚合數(shù)據(jù)為單一值;使用時應避免誤用導致副作用或性能問題。

JS綜述:深入研究JavaScript事件循環(huán) JS綜述:深入研究JavaScript事件循環(huán) Jul 08, 2025 am 02:24 AM

JavaScript的事件循環(huán)通過協(xié)調(diào)調(diào)用棧、WebAPI和任務隊列來管理異步操作。1.調(diào)用棧執(zhí)行同步代碼,遇到異步任務時交由WebAPI處理;2.WebAPI在后臺完成任務后將回調(diào)放入相應的隊列(宏任務或微任務);3.事件循環(huán)檢查調(diào)用棧是否為空,若為空則從隊列中取出回調(diào)推入調(diào)用棧執(zhí)行;4.微任務(如Promise.then)優(yōu)先于宏任務(如setTimeout)執(zhí)行;5.理解事件循環(huán)有助于避免阻塞主線程并優(yōu)化代碼執(zhí)行順序。

See all articles