掃盲貼:Svg動畫和Canvas動畫有什么區別

hello,我是貝格前端工場,網頁中動畫的實現有N種方式,比如css動畫,js動畫,svg動畫,canvas動畫等等,每一種動畫都有對應的場景,本問重點介紹一下svg和canvas動畫的異同點,歡迎友友們關注、評論。

一、什么是SVG動畫

SVG(Scalable Vector Graphics)動畫是指使用SVG技術創建的可縮放矢量圖形進行動畫效果的展示。SVG動畫可以通過CSS或JavaScript來實現,常見的SVG動畫包括以下幾種類型:


?


?

  1. CSS動畫:使用CSS的@keyframes規則和animation屬性來定義和控制SVG元素的動畫效果。可以通過指定關鍵幀和動畫屬性來實現平移、旋轉、縮放、淡入淡出等動畫效果。
  2. SMIL動畫:SMIL(Synchronized Multimedia Integration Language)是一種XML語言,用于定義多媒體的時間和空間關系。通過在SVG文檔中使用SMIL元素(如animate、animateTransform等),可以實現SVG元素的動畫效果。
  3. JavaScript動畫:使用JavaScript編寫代碼來控制SVG元素的屬性和狀態,從而實現動畫效果。可以通過操作SVG元素的屬性(如位置、大小、顏色等)和使用定時器(如setTimeout、setInterval)來實現動畫效果。
  4. 庫和框架動畫:有一些專門用于創建SVG動畫的庫和框架,如Snap.svg、GreenSock Animation Platform(GSAP)等。這些庫和框架提供了更豐富的動畫效果和更便捷的API,可以簡化SVG動畫的開發過程。

SVG動畫可以實現各種各樣的效果,如形狀變換、路徑動畫、顏色漸變、透明度變化等。通過結合CSS、SMIL、JavaScript以及相關的庫和框架,可以創造出豐富多樣、生動有趣的SVG動畫效果。


二、什么是canvas動畫

Canvas動畫是指使用HTML5中的Canvas元素以及JavaScript編程來創建動畫效果。Canvas是一個基于像素的畫布,可以使用JavaScript通過繪制像素點、線條、圖形等來實現動畫效果。

Canvas動畫的實現過程通常包括以下幾個步驟:

  1. 獲取Canvas元素:通過JavaScript代碼獲取HTML中的Canvas元素,并獲取對應的上下文(context)。
  2. 繪制初始狀態:使用上下文對象的方法(如fillRect、strokeRect)來繪制Canvas的初始狀態,即動畫的起點。
  3. 更新畫面:使用定時器(如requestAnimationFrame或setTimeout/setInterval)來定期觸發繪制畫面的函數,從而實現動畫效果。在每次繪制前,通常需要清除之前的繪制內容(如使用clearRect方法)。
  4. 更新狀態:在每次繪制前,更新需要變化的圖形屬性,如位置、大小、顏色等。可以通過改變屬性值,實現圖形的移動、變形、漸變等效果。
  5. 繪制畫面:在每次繪制時,使用上下文對象的方法來繪制圖形,如繪制路徑、填充顏色、繪制文本等。可以使用循環、條件判斷等控制語句來實現復雜的動畫邏輯。


?

可視化圖表就是canvas生成的動畫

通過不斷地更新狀態和繪制畫面,Canvas動畫可以實現各種各樣的效果,如物體的移動、形狀的變換、顏色的漸變等。同時,Canvas動畫也可以結合其他技術和庫,如CSS動畫、WebGL等,實現更豐富的動畫效果。

需要注意的是,Canvas動畫的性能較高,適合處理大量動態圖形,但相對于SVG動畫,Canvas動畫無法直接添加事件監聽器,需要通過計算像素位置來實現交互。


三、二者的區別

SVG(Scalable Vector Graphics)和Canvas是兩種常用的HTML5圖形繪制技術,它們在實現方式、使用場景和特點上有一些區別。

  1. 實現方式:SVG使用XML描述圖形,通過DOM操作實現圖形繪制和交互;而Canvas則是基于JavaScript的繪圖API,使用JavaScript代碼直接操作畫布進行繪制。
  2. 圖形質量:SVG繪制的圖形是矢量圖形,可以無限放大而不失真,圖形質量高;而Canvas繪制的圖形是位圖,放大會出現鋸齒,圖形質量相對較低。
  3. 渲染方式:SVG圖形是基于文檔對象模型(DOM)的,每個圖形元素都是一個DOM節點,可以通過CSS樣式進行渲染和動畫;而Canvas是基于像素的,通過繪制像素點來創建圖形,無法直接應用CSS樣式和動畫效果。
  4. 動態性能:由于SVG使用DOM操作,每個圖形元素都是一個DOM節點,當圖形數量較多時,會增加DOM操作的開銷,導致性能下降;而Canvas使用JavaScript直接操作像素,繪制速度較快,適合處理大量動態圖形。
  5. 交互性能:由于SVG使用DOM操作,可以為每個圖形元素添加事件監聽器,實現交互效果;而Canvas繪制的圖形是位圖,無法直接添加事件監聽器,需要通過計算像素位置來實現交互。


?

canvas動畫

綜上所述,SVG適用于需要高質量矢量圖形、可縮放和交互性強的場景,如圖標、地圖等;而Canvas適用于需要高性能繪制大量動態圖形的場景,如游戲、數據可視化等。選擇使用哪種技術取決于具體需求和優化目標。


四、如何在網頁中使用svg動畫

在網頁中使用SVG動畫可以通過以下步驟實現:

  1. 創建SVG元素:在HTML文檔中使用<svg>標簽創建SVG元素,并設置相應的寬度、高度和視口(viewport)大小。
<svg width="500" height="500" viewBox="0 0 500 500"><!-- SVG內容 -->
</svg>
  1. 定義SVG圖形:在SVG元素內部使用不同的SVG元素(如<rect>、<circle>、<path>等)來定義需要展示的圖形。
<svg width="500" height="500" viewBox="0 0 500 500"><rect x="100" y="100" width="200" height="200" fill="red" /><circle cx="250" cy="250" r="100" fill="blue" /><path d="M100 100 L300 300" stroke="black" />
</svg>
  1. 添加動畫效果:使用CSS或JavaScript來為SVG元素添加動畫效果。
  • CSS動畫:使用@keyframes規則和animation屬性來定義和控制SVG元素的動畫效果。可以通過指定關鍵幀和動畫屬性來實現平移、旋轉、縮放、淡入淡出等動畫效果。
@keyframes move {0% { transform: translate(0, 0); }50% { transform: translate(200px, 200px); }100% { transform: translate(0, 0); }
}
rect {animation: move 3s infinite;
}
  • JavaScript動畫:使用JavaScript編寫代碼來控制SVG元素的屬性和狀態,從而實現動畫效果。可以通過操作SVG元素的屬性(如位置、大小、顏色等)和使用定時器(如setTimeout、setInterval)來實現動畫效果。
const rect = document.querySelector('rect');
function move() {let x = 0;let y = 0;setInterval(() => {rect.setAttribute('x', x);rect.setAttribute('y', y);x += 5;y += 5;}, 100);
}
move();
  1. 將SVG動畫嵌入網頁:將完成的SVG動畫代碼嵌入到網頁中的適當位置,可以直接在HTML文件中編寫SVG代碼,也可以將SVG代碼保存為獨立的SVG文件,然后使用<img>標簽或CSS的background-image屬性來引入和顯示SVG文件。
<!DOCTYPE html>
<html>
<head><link rel="stylesheet" href="styles.css"><script src="script.js"></script>
</head>
<body><svg width="500" height="500" viewBox="0 0 500 500"><!-- SVG內容 --></svg>
</body>
</html>

以上是一種基本的使用SVG動畫的方法,你可以根據需求和實際情況使用不同的技術和庫來實現更復雜的SVG動畫效果。

五、如何在網頁中使用canvas動畫

在網頁中使用Canvas動畫可以通過以下步驟實現:


?


?

  1. 創建Canvas元素:在HTML文檔中使用<canvas>標簽創建Canvas元素,并設置相應的寬度和高度。
<canvas id="myCanvas" width="500" height="500"></canvas>
  1. 獲取Canvas上下文:使用JavaScript獲取Canvas元素的上下文對象,可以通過getContext方法來獲取2D或WebGL上下文。
const canvas = document.getElementById('myCanvas');
const ctx = canvas.getContext('2d');
  1. 繪制動畫:使用Canvas上下文對象的方法來繪制動畫,可以使用循環、條件判斷等控制語句來實現復雜的動畫邏輯。
function draw() {// 清除畫布ctx.clearRect(0, 0, canvas.width, canvas.height);// 繪制圖形ctx.beginPath();ctx.arc(250, 250, 100, 0, 2 * Math.PI);ctx.fillStyle = 'blue';ctx.fill();// 更新狀態// ...// 循環調用繪制函數requestAnimationFrame(draw);
}draw();
  1. 更新狀態和繪制畫面:通過不斷地更新狀態和繪制畫面,實現Canvas動畫的效果。可以使用requestAnimationFrame方法來循環調用繪制函數,以達到持續更新畫面的效果。
function draw() {// ...// 更新狀態// ...// 繪制畫面// ...// 循環調用繪制函數requestAnimationFrame(draw);
}draw();
  1. 添加交互和事件:可以通過添加事件監聽器來實現Canvas動畫的交互效果,如鼠標點擊、鍵盤按鍵等。需要注意的是,Canvas動畫的交互相對于SVG動畫較為復雜,需要通過計算像素位置來實現。
canvas.addEventListener('click', function(event) {const rect = canvas.getBoundingClientRect();const mouseX = event.clientX - rect.left;const mouseY = event.clientY - rect.top;// 處理鼠標點擊事件// ...
});

通過以上步驟,你可以在網頁中使用Canvas動畫來實現各種各樣的效果,如物體的移動、形狀的變換、顏色的漸變等。同時,你也可以結合其他技術和庫,如CSS動畫、WebGL等,來實現更豐富的動畫效果。


?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/696174.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/696174.shtml
英文地址,請注明出處:http://en.pswp.cn/news/696174.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

大工程 從0到1 數據治理 數倉篇(sample database classicmodels _No.7)

大工程 從0到1 數據治理 之數倉篇 我這里還是sample database classicmodels為案列&#xff0c;可以下載&#xff0c;我看 網上還沒有類似的 案列&#xff0c;那就 從 0-1開始吧&#xff01; 提示&#xff1a;寫完文章后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參…

TRS 2024 論文閱讀 | 基于點云處理和點Transformer網絡的人體活動連續識別

無線感知/雷達成像部分最新工作<持續更新>: 鏈接地址 注1:本文系“無線感知論文速遞”系列之一,致力于簡潔清晰完整地介紹、解讀無線感知領域最新的頂會/頂刊論文(包括但不限于 Nature/Science及其子刊; MobiCom, Sigcom, MobiSys, NSDI, SenSys, Ubicomp; JSAC, 雷達學…

提高代碼質量的 10 條編碼原則

提高代碼質量的 10 條編碼原則 本文轉自 公眾號 ByteByteGo&#xff0c;如有侵權&#xff0c;請聯系&#xff0c;立即刪除 今天來聊聊提高代碼質量的 10 條編碼原則。 軟件開發需要良好的系統設計和編碼標準。我們在下圖中列出了 10 條良好的編碼原則。 01 遵循代碼規范 我們…

Studio One破解版和正版的區別 Studio One購買是永久的嗎

在過去的很長一段時間里&#xff0c;很多小伙伴想要使用一款軟件時&#xff0c;可能第一時間就去網上尋找破解版的資源&#xff0c; 白嫖的資源固然很香&#xff0c;但隨著法制的健全和人們版權意識的增強&#xff0c;現在破解版的資源是越來越少了。同時破解版的資源也會伴隨著…

大數據計算技術秘史(上篇)

在之前的文章《2024 年&#xff0c;一個大數據從業者決定……》《存儲技術背后的那些事兒》中&#xff0c;我們粗略地回顧了大數據領域的存儲技術。在解決了「數據怎么存」之后&#xff0c;下一步就是解決「數據怎么用」的問題。 其實在大數據技術興起之前&#xff0c;對于用戶…

react實現拖拽的插件

插件一&#xff1a;dnd-kit 插件官網鏈接https://docs.dndkit.com/introduction/installation 插件二&#xff1a;react-beautiful-dnd https://github.com/atlassian/react-beautiful-dnd/tree/master 兩個插件的區別&#xff1a; 插件一可以做到從區域A拖住到區域B 插件二…

平臺組成-門戶服務

整體是從用戶視角&#xff0c;從外往內介紹。前面講了平臺的幾個模塊&#xff08;就是前端部署包&#xff09;。今天開始介紹后臺服務&#xff08;微服務&#xff0c;SpringCloud&#xff0c;通過-jar 參數啟動的jar包&#xff09;。 門戶服務完成登錄、注冊、界面配置、功能鏈…

java面試JVM虛擬機篇

1 JVM組成 1.1 JVM由那些部分組成&#xff0c;運行流程是什么&#xff1f; 難易程度&#xff1a;☆☆☆ 出現頻率&#xff1a;☆☆☆☆ JVM是什么 Java Virtual Machine Java程序的運行環境&#xff08;java二進制字節碼的運行環境&#xff09; 好處&#xff1a; 一次編寫&a…

Go 原子操作有哪些?

Go atomic包是最輕量級的鎖&#xff08;也稱無鎖結構&#xff09;&#xff0c;可以在不形成臨界區和創建互斥量的情況下完成并發安全的值替換操作&#xff0c;不過這個包只支持int32/int64/uint32/uint64/uintptr這幾種數據類型的一些基礎操作&#xff08;增減、交換、載入、存…

Excel之index、MATCH面試題、VLOOKUP函數,

VLOOKUP() 在表格的首列查找指定的數值&#xff0c;并返回表格當前行中指定列處的數值。 結構&#xff1a;VLOOKUP(查找值,查找區域,列序數,匹配條件) 解釋&#xff1a;VLOOKUP(找誰,在哪里找,第幾列,0或1) 1.目的&#xff1a;根據【產品】查找【銷量】 公式&#xff1a;V…

pikachu靶場-XSS

XSS&#xff1a; XSS&#xff08;跨站腳本&#xff09;概述 Cross-Site Scripting 簡稱為“CSS”&#xff0c;為避免與前端疊成樣式表的縮寫"CSS"沖突&#xff0c;故又稱XSS。一般XSS可以分為如下幾種常見類型&#xff1a; 1.反射性XSS; 2.存儲型XSS; 3.DOM型XSS; …

QT的UI入門

二、UI入門 QWidget類&#xff08;熟悉&#xff09; QWidget類是所有組件和窗口的基類&#xff0c;內部包含了一些基礎的界面特性。 常用屬性&#xff1a; 修改坐標 x : const int 橫坐標&#xff0c;每個圖形的左上角為定位點&#xff0c;橫軸的零點在屏幕的最左邊&#xff0c…

js實現復制功能

一、具體場景 前端有時需要實現點擊按鈕復制的功能&#xff0c;這個時候就不能讓用戶去手動選擇內容右鍵復制了。 二、實現方式 1. document.execCommand &#xff08;1&#xff09;具體實現 復制時&#xff0c;先選中文本&#xff0c;然后調用document.execCommand(‘copy’)…

171基于matlab的隨機共振微弱信號檢測

基于matlab的隨機共振微弱信號檢測&#xff0c;隨機共振描述了過阻尼布朗粒子受周期性信號和隨機噪聲的共同作用下,在非線性雙穩態系統中所發生的躍遷現象. 隨機共振可用于弱信號的檢測。程序已調通&#xff0c;可直接運行。

共享之力:分布式計算的奇跡

在信息時代的浪潮中&#xff0c;分布式計算作為一種革命性的技術&#xff0c;已經深刻地改變了我們對計算和數據處理的理解方式。其發展歷程既是一段精彩的科技史&#xff0c;也是一段充滿探索與突破的冒險故事&#xff0c;從最初的概念探索到如今的普及應用&#xff0c;分布式…

HashMap 源碼學習-jdk1.8

1、一些常量的定義 這里針對MIN_TREEIFY_CAPACITY 這個值進行解釋一下。 java8里面&#xff0c;HashMap 的數據結構是數組 &#xff08;鏈表或者紅黑樹&#xff09;&#xff0c;每個數組節點下可能會存在鏈表和紅黑樹之間的轉換&#xff0c;當同一個索引下面的節點超過8個時…

【Webpack】處理字體圖標和音視頻資源

處理字體圖標資源 1. 下載字體圖標文件 打開阿里巴巴矢量圖標庫open in new window選擇想要的圖標添加到購物車&#xff0c;統一下載到本地 2. 添加字體圖標資源 src/fonts/iconfont.ttf src/fonts/iconfont.woff src/fonts/iconfont.woff2 src/css/iconfont.css 注意字體…

[計算機網絡]---TCP協議

前言 作者&#xff1a;小蝸牛向前沖 名言&#xff1a;我可以接受失敗&#xff0c;但我不能接受放棄 如果覺的博主的文章還不錯的話&#xff0c;還請點贊&#xff0c;收藏&#xff0c;關注&#x1f440;支持博主。如果發現有問題的地方歡迎?大家在評論區指正 目錄 一 、TCP協…

Java并發基礎:原子類之AtomicBoolean全面解析

本文概要 AtomicBoolean類優點在于能夠確保布爾值在多線程環境下的原子性操作&#xff0c;避免了繁瑣的同步措施&#xff0c;它提供了高效的非阻塞算法實現&#xff0c;可以大大提成程序的并發性能&#xff0c;AtomicBoolean的API設計非常簡單易用。 AtomicBoolean核心概念 …

P1024 [NOIP2001 提高組] 一元三次方程求解

P1024 [NOIP2001 提高組] 一元三次方程求解 純代碼記錄 #include <iostream> #include <math.h> using namespace std; double a,b,c,d; double res[3];//用于存放三個解 int resCount;inline double F(double x)//三次函數 {return a*pow(x,3)b*pow(x,2)c*xd; }//…