有个项目需要在某个坐标显示一个声波扩散(不知道这个表达对不对)的动画。

  

  这种需求一般做法有几种,一种做成gif图片,然后贴上去,一种是用html+css3完成,要么就是画上去,这画又分两种,一种是Canvas画布来画,另一种用svg来画。

  制作成gif图片往上贴,如果有ui负责做图,这对于前端来说是最省事的方法,只要贴上去就完了,不过这种方法有一个缺点,你能控制的有限,如果要用另一种颜色,或者改变圈数,只能重新制作一张图片,重复替换,而且动画的重复次数也不好控制。pass

  html+css3完成,这个简单,不过效果有限,看这里。pass

  画上去分两种,一种canvas画布,一种svg画布,关于两者的优劣比较不是这里的主体,在这里不讨论。而且对于小需求来说,两者的资源消耗差异其实也可以忽略不计。关于canvas的声波扩散实现,看这里。


  好吧,言归正传,既然选择了方向,那便开始。

  首先,写一个svg画布,宽高200px

<svg id="svgView" width="200" height="200"></svg>

  然后在里面画一个圆。

<svg id="svgView" width="200" height="200">
<circle cx="80" cy="80" r="50" stroke="#555" fill-opacity="0"></circle>
</svg>

  这里circle表示一个圆,圆心坐标以svgView画布左上角为原点,向右偏移cx个单位,向下偏移cy个单位,r为圆半径,stroke表示圆边框填充颜色,fill表示圆内填充颜色,fill-opacity表示圆内填充透明度。完整API

  效果:

  接下来添加动画效果。这里用到了svg的SMIL animation

<svg id="svgDom" width="200" height="200">
  <circle cx="80" cy="80" r="50" stroke="#555" fill-opacity="0">
    <animate attributeName="r" begin="0" from="0" to="50" dur="2s"></animate>
  </circle>
</svg>

  attributeName表示动画进行改变的是图像的什么属性;begin为开始时间,单位为秒;from为开始值,to为目标值,其中from可选,dur表示动画持续时间。如果不添加repeatCount属性,表示动画执行一次便结束。

  效果:

  我们的图片是需要不停的扩散的,于是添加repeatCount属性,让其无限循环。

<svg id="svgDom" width="200" height="200">
  <circle cx="80" cy="80" r="50" stroke="#555" fill-opacity="0">
    <animate attributeName="r" begin="0" from="0" to="50" dur="2s" repeatCount="indefinite"></animate>
  </circle>
</svg>

  indefiniter表示无限循环至电脑死机。

  效果:

  设计里,我们的扩散环有三环,然后每环延迟0.5s释放,当释放至最大消失,由此循环。

<svg id="svgDom" width="200" height="200">
  <circle cx="80" cy="80" r="50" stroke="#555" fill-opacity="0">
    <animate attributeName="r" id="ani1" begin="0" from="0" to="50" dur="1.5s" repeatCount="indefinite"></animate>
  </circle>
  <circle cx="80" cy="80" r="50" stroke="#555" fill-opacity="0">
    <animate attributeName="r" begin="ani1.begin + 0.5s" from="0" to="50" dur="1.5s" repeatCount="indefinite"></animate>
  </circle>
  <circle cx="80" cy="80" r="50" stroke="#555" fill-opacity="0">
    <animate attributeName="r" begin="ani1.begin + 1s" from="0" to="50" dur="1.5s" repeatCount="indefinite"></animate>
  </circle>
</svg>

  其中,begin为动画开始时间,可以设置具体的时间秒数,也可以根据animate 的id值,来获取该id的animate动画开始结束时间,然后添加偏移数据,来控制多个动画的依序进行。

  效果:

  到这里,其实已经达到效果了,不过我们可以进一步添加一个效果,让圆环在扩散过程中慢慢消失。并且将圆环宽度设置为5px。

<svg id="svgDom" width="200" height="200">
  <circle cx="80" cy="80" r="0" stroke="#555" stroke-width="5" fill-opacity="0">
    <animate attributeName="r" id="ani1" begin="0" from="0" to="50" dur="1.5s" repeatCount="indefinite"></animate>
    <animate attributeName="opacity" begin="0" from="1" to="0" dur="1.5s" repeatCount="indefinite"></animate>
  </circle>
  <circle cx="80" cy="80" r="0" stroke="#555" stroke-width="5" fill-opacity="0">
    <animate attributeName="r" begin="ani1.begin + 0.5s" from="0" to="50" dur="1.5s" repeatCount="indefinite"></animate>
    <animate attributeName="opacity" begin="ani1.begin + 0.5s" from="1" to="0" dur="1.5s" repeatCount="indefinite"></animate>
  </circle>
  <circle cx="80" cy="80" r="0" stroke="#555" stroke-width="5" fill-opacity="0">
    <animate attributeName="r" begin="ani1.begin + 1s" from="0" to="50" dur="1.5s" repeatCount="indefinite"></animate>
    <animate attributeName="opacity" begin="ani1.begin + 1s" from="1" to="0" dur="1.5s" repeatCount="indefinite"></animate>
  </circle>
</svg>

  最终效果:

 

  到这里,这个svg版声纹扩散动画已经做完了。

 

      

一步步用svg做一个声波扩散动画的更多相关文章

  1. 用css3做一个求婚小动画

    概述 本案例主要是运用到了css3的animation.keyframes.transform等属性,熟悉了,就可以做更多的其他动画效果,这几个属性功能非常强大. 详细 代码下载:http://www ...

  2. Python做一个计时器的动画

    一.问题在做连连看的时候需要加一个计时器的动画,这样就完成了计时功能的设计. 二.解决主要思路: 1.先产生一个画布,用深颜色填充满. 2.产生一个新的矩阵用来覆盖画布,背景用白色,就可以渲染出来递减 ...

  3. unity使用Animator做一个简单的动画

    1.在unity的物体上添加Animator组件 2.在Project下的Assets下添加Animator Controller 3.在Animator Controller添加动作 4.在动作之间 ...

  4. anime.js 实战:实现一个带有描边动画效果的复选框

    在网页或者是APP的开发中,动画运用得当可以起到锦上添花的作用.正确使用动画,不但可以有助于用户理解交互的作用,还可以大大提高网页应用的魅力和使用体验.并且在现在的网页开发中,动画已经成为了一个设计的 ...

  5. 【 D3.js 入门系列 --- 5.1 】 做一个带坐标轴和标签的图表

    前面几节讲解了图标.坐标轴.比例等等,这一节整合这些内容做一个实用的图表.结果图如下: 代码如下所示: <html> <head> <meta charset=" ...

  6. 做一个会PS切图的前端开发

    系列链接 做一个会使用PS的前端开发 做一个会PS切图的前端开发 切图方法分类 PhotoShop从CS版本演变到现在的CC版本,切图功能发生了比较大的变化,我们可以把PhotoShop CS版本时的 ...

  7. 【 D3.js 入门系列 --- 3 】 做一个简单的图表!

    前面说了几节,都是对文字进行处理,这一节中将用 D3.js 做一个简单的柱形图. 做柱形图有很多种方法,比如用 HTML 的 div 标签,或用 svg . 推荐用 SVG 来做各种图形.SVG 意为 ...

  8. 【 D3.js 入门系列 — 3 】 做一个简单的图表!

    图1. 柱形图 1. 柱形图 前几章的例子,都是对文字进行处理.本章中将用 D3 做一个简单的柱形图.制作柱形图有很多种方法,比如用 HTML 的 <div> 标签,或在 SVG 上绘制 ...

  9. [转]jsPlumb插件做一个模仿viso的可拖拉流程图

    原贴:https://www.cnblogs.com/sggx/p/3836432.html 前言 这是我第一次写博客,心情还是有点小小的激动!这次主要分享的是用jsPlumb,做一个可以给用户自定义 ...

随机推荐

  1. MySQL 分表和分区

    1.为什么需要分表和分区 在开发的过程中,经常会遇到大表的情况,所谓的大表是指存储了百万级乃至千万级条记录的表.这样的表过于庞大,导致数据库在查询和插入的时候耗时太长,如果涉及联合查询的情况,性能更加 ...

  2. Paxos与zookeeper

    1,什么是Paxos算法? Paxos算法是分布式计算领域中一个非常重要的算法,主要解决分布式系统如何就某个值(决议)达成一致的问题.一个典型的场景是分布式数据库的一致问题:如果分布式数据库的各个节点 ...

  3. 【LeetCode】 Valid Sudoku

    Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board could be ...

  4. 用C#开发的双色球走势图(原创)值得园友拥有(二)接上一篇

    昨晚由于时间的原因只写了一部分内容,今天将这一部分内容补充完毕,多谢各位园友的支持. 这是用C#开发的双色球走势图(原创)值得园友拥有 新的园友可以看昨晚写的内容,以免脱节.首先回复园友的评论,有说好 ...

  5. 手动处理TFS数据仓库服务和分析服务

    当您需要报告中最新的数据时,当发生错误时,或者在解决了模式冲突之后,您可以手动处理Team Foundation Server(TFS)关系数据库(TFSHStor)或SQLServer Analys ...

  6. Angular6 学习笔记——组件详解之模板语法

    angular6.x系列的学习笔记记录,仍在不断完善中,学习地址: https://www.angular.cn/guide/template-syntax http://www.ngfans.net ...

  7. Oracle数据库设置Scott登录

    Oracle数据库Scott登录 在安装数据库时,用户登录选项中,Scott用户默认是未解锁的. 用户名填写as sysdba:密码是原来设置的,登录进去,新建SQL窗口,输入命令: alert us ...

  8. nginx 场景业务汇总 (初)

    本文链接:http://www.cnblogs.com/zhenghongxin/p/8891385.html 在下面的测试中,建议每次修改nginx配置文件后,都用此命令检查一下语法是否正确: [r ...

  9. 配置国内的maven仓库

    MAVEN中央仓库 国内 配置Maven中央仓库路径的方法如下: 在Maven文件的conf目录中打开settings.xml文件 在文件中的servers节点和mirror节点中加入如下内容 华为云 ...

  10. 七,apache配置域名

    配置域名服务器流程: (1)在httpd.conf中启用虚拟主机,Include conf/extra/httpd-vhosts.conf前面的#去掉. (2)在httpd.conf中修改项目路径为自 ...