”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > SVG 动画艺术 |每个 UI 开发人员都应该掌握的技术

SVG 动画艺术 |每个 UI 开发人员都应该掌握的技术

发布于2024-08-22
浏览:482

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]删除
最新教程 更多>
  • 如何从Google API中检索最新的jQuery库?
    如何从Google API中检索最新的jQuery库?
    从Google APIS 问题中提供的jQuery URL是版本1.2.6。对于检索最新版本,以前有一种使用特定版本编号的替代方法,它是使用以下语法:获取最新版本:未压缩)While these legacy URLs still remain in use, it is recommended ...
    编程 发布于2025-04-04
  • 如何有效地转换PHP中的时区?
    如何有效地转换PHP中的时区?
    在PHP 利用dateTime对象和functions DateTime对象及其相应的功能别名为时区转换提供方便的方法。例如: //定义用户的时区 date_default_timezone_set('欧洲/伦敦'); //创建DateTime对象 $ dateTime = ne...
    编程 发布于2025-04-04
  • 如何在其容器中为DIV创建平滑的左右CSS动画?
    如何在其容器中为DIV创建平滑的左右CSS动画?
    通用CSS动画,用于左右运动 ,我们将探索创建一个通用的CSS动画,以向左和右移动DIV,从而到达其容器的边缘。该动画可以应用于具有绝对定位的任何div,无论其未知长度如何。问题:使用左直接导致瞬时消失 更加流畅的解决方案:混合转换和左 [并实现平稳的,线性的运动,我们介绍了线性的转换。这...
    编程 发布于2025-04-04
  • 如何使用node-mysql在单个查询中执行多个SQL语句?
    如何使用node-mysql在单个查询中执行多个SQL语句?
    Multi-Statement Query Support in Node-MySQLIn Node.js, the question arises when executing multiple SQL statements in a single query using the node-mys...
    编程 发布于2025-04-04
  • 如何修复\“常规错误:2006 MySQL Server在插入数据时已经消失\”?
    如何修复\“常规错误:2006 MySQL Server在插入数据时已经消失\”?
    How to Resolve "General error: 2006 MySQL server has gone away" While Inserting RecordsIntroduction:Inserting data into a MySQL database can...
    编程 发布于2025-04-04
  • 如何将MySQL数据库添加到Visual Studio 2012中的数据源对话框中?
    如何将MySQL数据库添加到Visual Studio 2012中的数据源对话框中?
    在Visual Studio 2012 尽管已安装了MySQL Connector v.6.5.4,但无法将MySQL数据库添加到实体框架的“ DataSource对话框”中。为了解决这一问题,至关重要的是要了解MySQL连接器v.6.5.5及以后的6.6.x版本将提供MySQL的官方Visual...
    编程 发布于2025-04-04
  • 如何使用替换指令在GO MOD中解析模块路径差异?
    如何使用替换指令在GO MOD中解析模块路径差异?
    在使用GO MOD时,在GO MOD 中克服模块路径差异时,可能会遇到冲突,其中3个Party Package将另一个PAXPANCE带有导入式套件之间的另一个软件包,并在导入式套件之间导入另一个软件包。如回声消息所证明的那样: go.etcd.io/bbolt [&&&&&&&&&&&&&&&&...
    编程 发布于2025-04-04
  • 为什么PYTZ最初显示出意外的时区偏移?
    为什么PYTZ最初显示出意外的时区偏移?
    与pytz 最初从pytz获得特定的偏移。例如,亚洲/hong_kong最初显示一个七个小时37分钟的偏移: 差异源利用本地化将时区分配给日期,使用了适当的时区名称和偏移量。但是,直接使用DateTime构造器分配时区不允许进行正确的调整。 example pytz.timezone(...
    编程 发布于2025-04-04
  • 如何在GO编译器中自定义编译优化?
    如何在GO编译器中自定义编译优化?
    在GO编译器中自定义编译优化 GO中的默认编译过程遵循特定的优化策略。 However, users may need to adjust these optimizations for specific requirements.Optimization Control in Go Compi...
    编程 发布于2025-04-04
  • 为什么使用Firefox后退按钮时JavaScript执行停止?
    为什么使用Firefox后退按钮时JavaScript执行停止?
    导航历史记录问题:JavaScript使用Firefox Back Back 此行为是由浏览器缓存JavaScript资源引起的。要解决此问题并确保在后续页面访问中执行脚本,Firefox用户应设置一个空功能。 警报'); }; alert('inline Alert')...
    编程 发布于2025-04-04
  • 在GO中构造SQL查询时,如何安全地加入文本和值?
    在GO中构造SQL查询时,如何安全地加入文本和值?
    在go中构造文本sql查询时,在go sql queries 中,在使用conting and contement和contement consem per时,尤其是在使用integer per当per当per时,per per per当per. [&​​&&&&&&&&&&&&&&&默元组方法在...
    编程 发布于2025-04-04
  • 如何从PHP中的Unicode字符串中有效地产生对URL友好的sl。
    如何从PHP中的Unicode字符串中有效地产生对URL友好的sl。
    为有效的slug生成首先,该函数用指定的分隔符替换所有非字母或数字字符。此步骤可确保slug遵守URL惯例。随后,它采用ICONV函数将文本简化为us-ascii兼容格式,从而允许更广泛的字符集合兼容性。接下来,该函数使用正则表达式删除了不需要的字符,例如特殊字符和空格。此步骤可确保slug仅包含...
    编程 发布于2025-04-04
  • 如何使用不同数量列的联合数据库表?
    如何使用不同数量列的联合数据库表?
    合并列数不同的表 当尝试合并列数不同的数据库表时,可能会遇到挑战。一种直接的方法是在列数较少的表中,为缺失的列追加空值。 例如,考虑两个表,表 A 和表 B,其中表 A 的列数多于表 B。为了合并这些表,同时处理表 B 中缺失的列,请按照以下步骤操作: 确定表 B 中缺失的列,并将它们添加到表的末...
    编程 发布于2025-04-04
  • 为什么Microsoft Visual C ++无法正确实现两台模板的实例?
    为什么Microsoft Visual C ++无法正确实现两台模板的实例?
    The Mystery of "Broken" Two-Phase Template Instantiation in Microsoft Visual C Problem Statement:Users commonly express concerns that Micro...
    编程 发布于2025-04-04
  • Android如何向PHP服务器发送POST数据?
    Android如何向PHP服务器发送POST数据?
    在android apache httpclient(已弃用) httpclient httpclient = new defaulthttpclient(); httppost httppost = new httppost(“ http://www.yoursite.com/script.p...
    编程 发布于2025-04-04

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3