」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > SVG 動畫藝術 |每個 UI 開發人員都應該掌握的技術

SVG 動畫藝術 |每個 UI 開發人員都應該掌握的技術

發佈於2024-08-22
瀏覽:429

Art of SVG Animation | Techniques Every UI Developer Should Master

SVG(可扩展矢量图形)提供了一种通过高质量、可扩展图形增强 Web 和应用程序界面的现代方法。与传统位图图形不同,SVG 由矢量数据组成,这意味着它们可以缩放到任何尺寸而不会损失质量。这种可扩展性使得 SVG 在希望创建动态、响应式且具有视觉吸引力的设计的 UI 开发人员中非常受欢迎。

在这篇博文中,我们将深入研究 SVG 动画的世界。无论您是想要探索这个令人兴奋的领域的初学者,还是旨在提高技能的经验丰富的开发人员,本指南都将引导您通过实用的代码示例了解十种不同的方法来制作 SVG 动画。最后,您将准备好在项目中实施这些技术,将您的 UI 设计提升到一个新的水平。

为什么要制作 SVG 动画?

在我们进入具体方法之前,有必要了解为什么 SVG 动画如此有益:

分辨率独立性:SVG 在任何屏幕密度下看起来都很清晰,这对于支持不同的设备分辨率至关重要。

小文件大小:与许多位图格式相比,SVG 通常具有较小的文件大小,特别是当动画涉及简单的几何形状和有限的颜色时。

可操作性:SVG 可以通过 CSS 和 JavaScript 进行操作,从而为动画的实现和控制提供了灵活性。

辅助功能:SVG 中的文本保持可选择和可搜索,从而增强可用性和可访问性。


方法 1:CSS 过渡

开始制作 SVG 动画最简单的方法之一是使用 CSS 过渡。 CSS 过渡允许您在指定的持续时间内平滑地更改 SVG 属性。

示例:旋转齿轮

假设您有一个齿轮的 SVG。您希望该齿轮连续旋转以表示过程或加载状态。


  

#gear {
  transition: transform 2s linear infinite;
}

#gear:hover {
  transform: rotate(360deg);
}

在 CSS 中,我们指定齿轮的变换属性应在两秒内线性且无限地转换。当用户将鼠标悬停在齿轮上时,它会旋转 360 度。


方法 2:CSS 关键帧

对于更复杂的动画,CSS 关键帧提供您所需的控制。关键帧允许您定义动画各个阶段的属性值。

示例:脉动圆

让我们制作一个圆圈的动画,使其不断脉动、增大和缩小。


  

@keyframes pulse {
  0%, 100% {
    r: 30;
  }
  50% {
    r: 40;
  }
}
circle {
  animation: pulse 2s infinite;
}

这里,@keyframes 定义了圆的半径 (r) 发生变化的脉冲动画。


方法 3:SVG SMIL 动画

SMIL(同步多媒体集成语言)是一种基于 XML 的语言,可直接在 SVG 文件中启用复杂的动画。

示例:沿路径移动

想象一下让一个对象沿着预定义的路径移动的动画。


  
  
    
  

由于 animateMotion 元素,圆沿着路径定义的曲线移动。


方法 4:JavaScript 库 (GreenSock)

许多 JavaScript 库,例如 GreenSock (GSAP),可以促进复杂的 SVG 动画。 GSAP 性能卓越,适用于所有主要浏览器。

示例:弹跳球

以下是如何使用 GSAP 创建弹跳球动画:


  

gsap.to("#ball", {
  y: 60,
  duration: 1,
  ease: "bounce.out",
  repeat: -1,
  yoyo: true
});

球不断弹跳,具有悠悠效果,使其前后移动。


方法 5:JavaScript 和 CSS 变量

将 JavaScript 与 CSS 变量(自定义属性)一起使用可以使 SVG 动画响应用户交互或其他动态条件。

示例:颜色偏移

假设您希望 SVG 元素的填充颜色根据光标位置而改变。


  

document.addEventListener("mousemove", function(e) {
  const color = e.clientX > window.innerWidth / 2 ? 'red' : 'blue';
  document.documentElement.style.setProperty('--color', color);
});

此处,当鼠标在屏幕上水平移动时,圆圈的颜色会发生变化。


方法 6:SVG 动画过滤器

SVG 过滤器是通过动画将复杂视觉效果应用于 SVG 元素的强大工具。

示例:模糊效果

动画模糊效果可以营造运动或变化的感觉。


  
    
      
    
  
  


@keyframes blur {
  from {
    stdDeviation: 0;
  }
  to {
    stdDeviation: 5;
  }
}
circle {
  animation: blur 8s infinite alternate;
}

在此动画中,圆圈平滑地模糊和取消模糊,在提供动态视觉效果的同时吸引注意力。


示例:显示文本

可以使用动画剪切路径逐步显示文本。


  
    
      
    
  
  Hello!

@keyframes reveal {
  from {
    width: 0;
  }
  to {
    width: 100;
  }
}
rect {
  animation: reveal 5s forwards;
}

正文您好!从左到右逐渐显露出来。


方法 8:变形形状

形状变形可以使用多个库和本机 SVG 功能来实现,从而在不同形式之间创建无缝过渡。

示例:心转圆变形

一个常见的例子是将心形变成圆形。


  

/* Add keyframes for morphing */

使用 Flubber 甚至 CSS 等库,路径的“d”属性插值在心形和圆形之间。


方法 9:动画渐变

SVG 中的渐变也可以设置动画,对于充满活力的背景或引人注目的元素很有用。

示例:渐变背景动画

改变颜色的动画径向渐变可以用作动态背景。


  
    
  

这个矩形的填充在一系列颜色之间平滑过渡,创造出生动的背景效果。


示例:交互式颜色变化

一个简单的交互,其中 SVG 在单击时改变颜色。


  

功能改变巨大的数据库与示例代码,基于故事讲述
按钮,以及基于订阅的面板。按钮文本此处 JavaScript。

document.querySelector('svg').addEventListener('click', function() {
  this.querySelector('circle').setAttribute('fill', 'pink');
});

通过单击SVG,圆圈的填充颜色变为粉红色,演示了一个简单的交互式动画。

结论

SVG 动画为让您的 UI 更具吸引力和吸引力提供了多种可能性。从简单的 CSS 转换到交互式 JavaScript 驱动的动画,每种方法都提供独特的优点和功能。尝试各种技术并了解它们对性能和浏览器兼容性的影响是掌握 SVG 动画的关键。无论是增强用户体验还是简单地添加视觉效果,这十种方法都为任何想要深入 SVG 动画世界的 UI 开发人员提供了坚实的基础。

版本聲明 本文轉載於:https://dev.to/nnnirajn/art-of-svg-animation-10-techniques-every-ui-developer-should-master-3bkh?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 如何使用PHP將斑點(圖像)正確插入MySQL?
    如何使用PHP將斑點(圖像)正確插入MySQL?
    essue VALUES('$this->image_id','file_get_contents($tmp_image)')";This code builds a string in PHP, but the function call fil...
    程式設計 發佈於2025-07-14
  • Java字符串非空且非null的有效檢查方法
    Java字符串非空且非null的有效檢查方法
    檢查字符串是否不是null而不是空的 if(str!= null && str.isementy())二手: if(str!= null && str.length()== 0) option 3:trim()。 isement(Isement() trim whitespace whites...
    程式設計 發佈於2025-07-14
  • 如何高效地在一個事務中插入數據到多個MySQL表?
    如何高效地在一個事務中插入數據到多個MySQL表?
    mySQL插入到多個表中,該數據可能會產生意外的結果。雖然似乎有多個查詢可以解決問題,但將從用戶表的自動信息ID與配置文件表的手動用戶ID相關聯提出了挑戰。 使用Transactions和last_insert_id() 插入用戶(用戶名,密碼)值('test','tes...
    程式設計 發佈於2025-07-14
  • 如何從PHP中的Unicode字符串中有效地產生對URL友好的sl。
    如何從PHP中的Unicode字符串中有效地產生對URL友好的sl。
    為有效的slug生成首先,該函數用指定的分隔符替換所有非字母或數字字符。此步驟可確保slug遵守URL慣例。隨後,它採用ICONV函數將文本簡化為us-ascii兼容格式,從而允許更廣泛的字符集合兼容性。 接下來,該函數使用正則表達式刪除了不需要的字符,例如特殊字符和空格。此步驟可確保slug僅包...
    程式設計 發佈於2025-07-14
  • 如何干淨地刪除匿名JavaScript事件處理程序?
    如何干淨地刪除匿名JavaScript事件處理程序?
    刪除匿名事件偵聽器將匿名事件偵聽器添加到元素中會提供靈活性和簡單性,但是當要刪除它們時,可以構成挑戰,而無需替換元素本身就可以替換一個問題。 element? element.addeventlistener(event,function(){/在這里工作/},false); 要解決此問題,請考...
    程式設計 發佈於2025-07-14
  • PHP未來:適應與創新
    PHP未來:適應與創新
    PHP的未來將通過適應新技術趨勢和引入創新特性來實現:1)適應云計算、容器化和微服務架構,支持Docker和Kubernetes;2)引入JIT編譯器和枚舉類型,提升性能和數據處理效率;3)持續優化性能和推廣最佳實踐。 引言在編程世界中,PHP一直是網頁開發的中流砥柱。作為一個從1994年就開始發展...
    程式設計 發佈於2025-07-14
  • PHP陣列鍵值異常:了解07和08的好奇情況
    PHP陣列鍵值異常:了解07和08的好奇情況
    PHP數組鍵值問題,使用07&08 在給定數月的數組中,鍵值07和08呈現令人困惑的行為時,就會出現一個不尋常的問題。運行print_r($月)返回意外結果:鍵“ 07”丟失,而鍵“ 08”分配給了9月的值。 此問題源於PHP對領先零的解釋。當一個數字帶有0(例如07或08)的前綴時,PHP將...
    程式設計 發佈於2025-07-14
  • 如何從Python中的字符串中刪除表情符號:固定常見錯誤的初學者指南?
    如何從Python中的字符串中刪除表情符號:固定常見錯誤的初學者指南?
    從python import codecs import codecs import codecs 導入 text = codecs.decode('這狗\ u0001f602'.encode('utf-8'),'utf-8') 印刷(文字)#帶有...
    程式設計 發佈於2025-07-14
  • 如何實時捕獲和流媒體以進行聊天機器人命令執行?
    如何實時捕獲和流媒體以進行聊天機器人命令執行?
    在開發能夠執行命令的chatbots的領域中,實時從命令執行實時捕獲Stdout,一個常見的需求是能夠檢索和顯示標準輸出(stdout)在cath cath cant cant cant cant cant cant cant cant interfaces in Chate cant inter...
    程式設計 發佈於2025-07-14
  • 如何將多種用戶類型(學生,老師和管理員)重定向到Firebase應用中的各自活動?
    如何將多種用戶類型(學生,老師和管理員)重定向到Firebase應用中的各自活動?
    Red: How to Redirect Multiple User Types to Respective ActivitiesUnderstanding the ProblemIn a Firebase-based voting app with three distinct user type...
    程式設計 發佈於2025-07-14
  • 版本5.6.5之前,使用current_timestamp與時間戳列的current_timestamp與時間戳列有什麼限制?
    版本5.6.5之前,使用current_timestamp與時間戳列的current_timestamp與時間戳列有什麼限制?
    在時間戳列上使用current_timestamp或MySQL版本中的current_timestamp或在5.6.5 此限制源於遺留實現的關注,這些限制需要對當前的_timestamp功能進行特定的實現。 創建表`foo`( `Productid` int(10)unsigned not ...
    程式設計 發佈於2025-07-14
  • 在JavaScript中如何並發運行異步操作並正確處理錯誤?
    在JavaScript中如何並發運行異步操作並正確處理錯誤?
    同意操作execution 在執行asynchronous操作時,相關的代碼段落會遇到一個問題,當執行asynchronous操作:此實現在啟動下一個操作之前依次等待每個操作的完成。要啟用並發執行,需要進行修改的方法。 第一個解決方案試圖通過獲得每個操作的承諾來解決此問題,然後單獨等待它們: c...
    程式設計 發佈於2025-07-14
  • 為什麼我的CSS背景圖像出現?
    為什麼我的CSS背景圖像出現?
    故障排除:CSS背景圖像未出現 ,您的背景圖像儘管遵循教程說明,但您的背景圖像仍未加載。圖像和样式表位於相同的目錄中,但背景仍然是空白的白色帆布。 而不是不棄用的,您已經使用了CSS樣式: bockent {背景:封閉圖像文件名:背景圖:url(nickcage.jpg); 如果您的html,cs...
    程式設計 發佈於2025-07-14
  • 如何在Chrome中居中選擇框文本?
    如何在Chrome中居中選擇框文本?
    選擇框的文本對齊:局部chrome-inly-ly-ly-lyly solument 您可能希望將文本中心集中在選擇框中,以獲取優化的原因或提高可訪問性。但是,在CSS中的選擇元素中手動添加一個文本 - 對屬性可能無法正常工作。 初始嘗試 state)</option> < o...
    程式設計 發佈於2025-07-14
  • Go語言垃圾回收如何處理切片內存?
    Go語言垃圾回收如何處理切片內存?
    Garbage Collection in Go Slices: A Detailed AnalysisIn Go, a slice is a dynamic array that references an underlying array.使用切片時,了解垃圾收集行為至關重要,以避免潛在的內存洩...
    程式設計 發佈於2025-07-14

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3