目錄
創建SVG文檔
繪製模型
第一個模型
第二和第三個模型
開發環境
我們開始吧!
首頁 web前端 css教學 用反應彈簧變形SVG

用反應彈簧變形SVG

Apr 02, 2025 pm 06:08 PM

Morphing SVG With react-spring

自小我就被變形效果所吸引。形狀變化的動畫總能抓住我的注意力。第一次看到變形效果讓我不禁疑惑“哇,他們是怎麼做到的?”從那時起,我就創建了演示程序並撰寫了一篇關於這種效果的文章。

在支持變形的不同動畫庫方面,有很多選擇。它們中的許多都很好,並提供了許多功能。最近,我迷上了react-spring。 React-spring是一個基於React構建的簡潔的物理動畫庫。 Adam Rackis最近發布了一個不錯的概述。該庫具有許多功能,包括(以及許多其他功能)SVG變形。事實上,react-spring的美妙之處在於它如何支持變形。它允許您直接在定義SVG路徑描述符的標記中進行變形。從簿記的角度來看,這是很好的。 SVG路徑描述符通常位於您預期它們所在的位置。

以下是本文探討內容的視頻:

這是一個入職序列中的變形效果。在這裡,它用作背景效果。它旨在補充前景動畫;使其更突出,而不是佔據場景。

創建SVG文檔

我們要做的第一件事是創建底層模型。通常,一旦我對我想做什麼有了清晰的認識,我就會創建某種設計。我的大多數探索都始於模型,並以演示結束。在大多數情況下,這意味著在我的矢量編輯器中創建一個SVG文檔。我使用Inkscape繪製我的SVG。

創建SVG文檔時,我使用精確的比例。我發現精確一點更好。對我來說,當我使用與瀏覽器和代碼編輯器中相同的坐標係時,它有助於我感知我想創建的內容。例如,假設您即將創建一個24px ✕ 30px的SVG圖標,包括填充。最好的方法是使用完全相同的尺寸——一個寬24像素,高30像素的SVG文檔。如果比例結果不正確,則可以隨時稍後調整。從這個意義上說,SVG是寬容的。它是可縮放的,無論你做什麼。

我們創建的SVG文檔寬度為256像素,高度為464像素。

繪製模型

創建模型時,我們需要考慮放置節點的位置以及使用多少個節點。這很重要。這是我們為動畫奠定基礎的地方。建模就是變形的全部內容。我們有一組節點轉換為另一組節點。這些節點集合必須具有完全相同的節點數。其次,這些集合應該以某種方式相關聯。

如果矢量形狀之間的關係沒有經過仔細考慮,動畫將不完美。每個節點都會影響動畫。它們的位置和曲率必須恰到好處。有關SVG路徑中節點構造方式的更多詳細信息,請參閱MDN上貝塞爾曲線的解釋。

其次,我們需要同時考慮兩種形狀。其中一個向量可能包含在另一個向量中找不到的部分。或者,兩個模型之間可能存在其他差異。對於這些情況,最好在某些地方插入額外的節點。最好制定策略。例如,這個角在那裡,這條直線膨脹成曲線等等。

我整理了一個筆來說明當集合相關性差與準確設計時的情況。在下面的示例中,左側的變形效果中的節點是隨機放置的。構成數字一和二的節點沒有關係。在正確的示例中,節點的放置計劃更仔細。這帶來了更連貫的體驗。

第一個模型

線條工具是我們用來繪製第一個矢量形狀的工具。由於我們創建的模型更抽象,因此它稍微寬容一些。我們仍然需要考慮位置和曲率,但這允許更大的隨意性。

至於向量和大小,創建變形模型也是如此。這是一個迭代過程。如果第一次不正確,我們總是可以返回並進行調整。通常需要一到兩次迭代才能使動畫閃耀。以下是完成後的模型外觀。

結果是一個具有八個節點的平滑抽象SVG形狀。

第二和第三個模型

第一個模型完成後,就可以繪製第二個模型(我們也可以將其視為狀態)。這是第一組將變形到的形狀。這可能是最終狀態,即單個變形效果。或者它可能是沿途的一步,就像一個關鍵幀。在我們正在查看的情況下,有三個步驟。同樣,每個模型都必須與前一個模型相關聯。確保模型匹配的一種方法是將第二個向量創建為第一個向量的副本。這樣,我們就知道模型具有相同的節點數以及相同的外觀和感覺。

小心編輯器。矢量編輯器通常針對文件大小和格式進行優化。保存更改時,它很可能會使模型不兼容。我已經養成在保存文件後檢查SVG代碼的習慣。如果您熟悉路徑描述符格式,這也有幫助。如果您不習慣它,它有點神秘。在矢量編輯器的首選項中禁用優化也是一個好主意。

對第三個形狀重複上述過程。複製、重新定位所有節點並設置第三種顏色。

燈光、攝像機……動作!

創建模型後,我們完成了大部分工作。現在是時候查看動畫部分了。 React-spring帶有一組我們可以用於動畫和變形的鉤子。 useSpring是此示例中效果的理想選擇。它旨在用於像我們正在創建的這樣的單個動畫。以下是使用useSpring鉤子啟動動畫的方法。

 <code>const [{ x }, set] = useSpring(() => ({ x: 0, }));</code>
登入後複製

以上為我們提供了一個動畫屬性x,圍繞它構建我們的變形效果。這些動畫屬性的一大優點是我們可以更改它們來創建幾乎任何類型的動畫。如果值不正確,我們可以通過插值來更改它。

第二個參數,set函數,允許我們觸發更新。下面是一段代碼片段,展示了它的用法。它使用來自react-use-gesture庫的手勢處理程序useDrag更新動畫值x。我們可以在react-spring中觸發動畫的方式有很多。

 <code>const bind = useDrag( ({ movement: [x] }) => {  // ...  set({ x }); }, );</code>
登入後複製

我們現在已經準備好將我們的模型(路徑描述符)與標記組合起來。通過將animated關鍵字添加到JSX代碼中,我們激活了react-spring的動畫系統。通過對先前命名的interpolate進行插值調用,我們將拖動距離轉換為變形形狀。輸出數組包含前面討論過的模型。為了將它們放在適當的位置,我們只需將路徑描述符從SVG文件複製到標記中。現在,三個不同的描述符d,來自三個不同的路徑元素,從三個不同的SVG文件複製,組合成一個。以下是使用react-spring動畫驅動的JSX節點的外觀。

<code><svg ...="">
<animated.path c="" d="{x.to({" first="" model="" output:="" range:="" second="" third="" z=""></animated.path></svg></code>
登入後複製

讓我們看看標準JSX路徑元素與我們當前擁有的元素之間的區別。為了獲得變形動畫,我們有:

  • 添加了animated關鍵字以使JSX路徑元素與React spring一起動畫,
  • 將描述符d從字符串更改為React spring插值,以及
  • 將距離x轉換為三個路徑描述符之間的關鍵幀動畫。

開發環境

我還沒有找到用於處理SVG的完美開發環境。目前,我在矢量編輯器、IDE和瀏覽器之間來回切換。涉及一些複製和一些冗餘。它並不完美,但它有效。我過去曾嘗試過解析SVG的腳本。我仍然沒有找到可以應用於所有場景的東西。也許只是我做錯了。如果不是,如果使用SVG的Web開發能夠更無縫一些,那就太好了。

我們開始吧!

最後但並非最不重要的是,演示!

感謝您的閱讀!

以上是用反應彈簧變形SVG的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

熱門話題

Java教學
1666
14
CakePHP 教程
1426
52
Laravel 教程
1328
25
PHP教程
1273
29
C# 教程
1253
24
靜態表單提供商的比較 靜態表單提供商的比較 Apr 16, 2025 am 11:20 AM

讓我們嘗試在這裡造成一個術語:“靜態表單提供商”。你帶上html

使Sass更快的概念證明 使Sass更快的概念證明 Apr 16, 2025 am 10:38 AM

在一個新項目開始時,Sass彙編發生在眼睛的眨眼中。感覺很棒,尤其是當它與browsersync配對時,它重新加載

每周平台新聞:HTML加載屬性,主要的ARIA規格以及從iframe轉移到Shadow dom 每周平台新聞:HTML加載屬性,主要的ARIA規格以及從iframe轉移到Shadow dom Apr 17, 2025 am 10:55 AM

在本週的平台新聞綜述中,Chrome引入了一個用於加載的新屬性,Web開發人員的可訪問性規範以及BBC Move

帶有HTML對話框元素的一些動手 帶有HTML對話框元素的一些動手 Apr 16, 2025 am 11:33 AM

這是我第一次查看HTML元素。我已經意識到了一段時間,但是尚未將其旋轉。它很酷,

紙張形式 紙張形式 Apr 16, 2025 am 11:24 AM

購買或建造是技術的經典辯論。自己構建東西可能會感覺更便宜,因為您的信用卡賬單上沒有訂單項,但是

'訂閱播客”鏈接應在哪裡? '訂閱播客”鏈接應在哪裡? Apr 16, 2025 pm 12:04 PM

有一段時間,iTunes是播客中的大狗,因此,如果您將“訂閱播客”鏈接到喜歡:

它全部都在頭上:管理帶有React頭盔的React Power Site的文檔頭 它全部都在頭上:管理帶有React頭盔的React Power Site的文檔頭 Apr 15, 2025 am 11:01 AM

該文檔負責人可能不是網站上最迷人的部分,但是其中所處的內容對於您的網站的成功也一樣重要

託管您自己的非JavaScript分析的選項 託管您自己的非JavaScript分析的選項 Apr 15, 2025 am 11:09 AM

有很多分析平台可幫助您跟踪網站上的訪問者和使用數據。也許最著名的是Google Analytics(廣泛使用)

See all articles