简单聊一聊那些svg的沿路径运动

之前遇见动画就很想用css实现,显然有些效果是我们力所不能及,实现起来麻烦,效果不好,让人捉急。其实归结起来,不同的动画有自己的优势,根据实际情况进行取舍。本文就告诉大家如何用SVG写出个简单动画。就让我们以路径动画为例来说明吧。



类似于下面动画,这种之前就觉得好炫酷

好吧,就算不说这个,没学习之前,svg实现的loading我也不知道怎么搞得。

当然SVG肯定不是只是来做这个的啦,这只是人家神奇的一部分。SVG的优势是 跨设备能力强、体积小、图像可透明,可以与js交互等等等等,在这里不一一介绍啦。我们直接从小例子开始,动手实现个按路径运动的动画。



首先让我们来实现一个描绘图形边框的小例子,如下图:

要描绘如上图的五角星图形,我们首先应该确定各个角的坐标,然后将它们连接起来就好了。说起来简单,做起来其实更简单,简单代码实现如下:

  1. <svg version="1.1"
  2. xmlns="http://www.w3.org/2000/svg" width="500" height="500" viewbox="-500 -500 2500 2500">
  3.    <polygon points="-12 -69,-58 85,64 -14,-81 -14,41 85"  class="star-path"></polygon>
  4.    <polygon points="-12 -69,-58 85,64 -14,-81 -14,41 85"  class="star-fill"></polygon >
  5. </svg>

在以上的代码中,polygon 标签是svg多边形标签,points 属性定义多边形每个角的 x 和 y 坐标。通过class为star-path的标签来实现我们图中的灰色轨迹,通过class为star-fill的标签来实现描绘的动画。

上边我们实现了五角星的图形,下面我们就结合css,来完成这个完整的描绘动画:

  1. .star-path{
  2.    fill: none;
  3.    stroke-width:10;
  4.    stroke:#d3dce6;
  5.    stroke-linejoin:round;
  6.    stroke-linecap:round;
  7. }
  8. .star-fill{
  9.    fill: none;
  10.    stroke-width:10;
  11.    stroke:#ff7700;
  12.    stroke-linejoin:round;
  13.    stroke-linecap:round;
  14.    stroke-dasharray: 782;
  15.    stroke-dashoffset: 0;
  16.    animation: starFill 2s ease-out infinite;
  17. }
  18. @keyframes starFill {
  19.    0%{
  20.        stroke-dashoffset:782;
  21.    }
  22.    100%{
  23.        stroke-dashoffset: 0;
  24.    }
  25. }

在上面的代码中,最核心的属性就是 stroke-dasharray和stroke-dashoffset 。 stroke-dasharray:定义描边的虚线长度,如果提供奇数个,则会自动复制该值成偶数。 stroke-dashoffset:定义虚线描边的偏移量。 在上面代码中,stroke-dasharray代表虚线之间的间距大小。当我们设置了间距足够长的时候,以至于大于我们图形的总边长,就会达到我们想要的效果。一开始我们的短划线是0,缺口是全部长度,随动画的进行,短划线的长度慢慢增长为图形总边长的全部长度,达到了慢慢充满全部的效果。另外,我们要知道路径长度也可以借助 如下代码path.getTotalLength() 函数获取路径的长度。

  1. document.querySelector(‘.star-path‘).getTotalLength();

除此之外,我们还可以改变偏移 stroke-dashoffset 来达到效果,将虚线的偏移量设置为 0,此时我们看到的路径描边就是没有间断的连续曲线,通过设置虚线偏移量等于曲线的长度,那该曲线恰好“消失”,代码如下:

  1.  .star-path{
  2.    fill: none;
  3.    stroke-width:10;
  4.    stroke:#d3dce6;
  5.    stroke-linejoin:round;
  6.    stroke-linecap:round;
  7. }
  8. .star-fill{
  9.    fill: none;
  10.    stroke-width:10;
  11.    stroke:#ff7700;
  12.    stroke-linejoin:round;
  13.    stroke-linecap:round;
  14.    stroke-dasharray: 1340;
  15.    stroke-dashoffset: 0;
  16.    animation: starFill 2s ease-out infinite;
  17. }
  18. @keyframes starFill {
  19.    0%{
  20.        stroke-dashoffset:1340;
  21.    }
  22.    100%{
  23.        stroke-dashoffset: 0;
  24.    }
  25. }

很多时候我们可以运用这种方法到我们运营活动项目中,stroke-dasharray 和 stroke-dashoffset 是创造大量 SVG 路径动画所要用到的两个重要属性,掌握原理就可以给各种图形描边



另外我们再实现个根据运动路径运动的小例子,这里要涉及到svg的 path属性实现,如下图:

  1. <svg width="500" height="500">
  2.  <path d="M100 150 L200 50 L300 150 L400 50 Z"
  3.        stroke="#ccc" stroke-width="2"
  4.        fill="none"
  5.  />
  6.  <circle r="20" x="150" y="0" style="fill:#336622;">
  7.    <animateMotion
  8.      dur="3s"
  9.      repeatCount="indefinite"
  10.      rotate="auto"
  11.      path="M100 150 L200 50 L300 150 L400 50 Z" />
  12.  </circle>
  13. </svg>

path标签用于指定一条运动路径,从点(100,150)到(200,50)再到(300,150)再到(400,50)最后再链接起点。 我们用了svg的animateMotion动画标签。repeatCount属性描述动画的重复次数,indefinite是无限循环,dur属性描述动画的持续时间,我们这里让整个动画持续3秒。 我们用start和end可以控制整个动画的开始结束时间,而且如果我们想点击控制运动的开始可以加入begin="click"。

当然我们实现的很简单的效果,如果涉及到想元素自动根据运动路径的角度来改变它的运动方向,我们可以使用rotate设置为auto,想让元素在外围运动,可以设置rotate="auto-reverse"。

另外,当路径复杂的时候再用path属性来描述就显得很多余和麻烦,这时候我们可以使用标签来指定运动路径:

  1. <svg width="500" height="500">
  2.  <path d="M100 150 L200 50 L300 150 L400 50 Z"
  3.        stroke="#ccc" stroke-width="2"
  4.        fill="none"
  5.        id="myPath"
  6.  />
  7.  <circle r="20" x="150" y="0" style="fill:#336622;">
  8.    <animateMotion
  9.      dur="6s"
  10.      begin="click"
  11.      repeatCount="indefinite"
  12.      rotate="auto">
  13.      <mpath xlink:href="#myPath" />
  14.    </animateMotion>
  15.  </circle>
  16. </svg>

以上是svg按路径运动的典型例子,我们用代码方式进行剖析。svg很多属性和当时学习css动画属性很相似,很方便学习。很多时候动画就是简单组成了复杂,或者没有从简单思考显得复杂。我们看到酷炫的动效可能要复杂一些,但看完本文你是不是也能完成自己的小动画了呢?

原文地址:https://www.cnblogs.com/zhuanzhuanfe/p/8596545.html

时间: 2024-10-11 09:26:49

简单聊一聊那些svg的沿路径运动的相关文章

u3d 逐个点运动,路径运动。 U3d one by one, path motion.

u3d 逐个点运动,路径运动. U3d one by one, path motion. 作者:韩梦飞沙 Author:han_meng_fei_sha 邮箱:[email protected] E-mail: 313134555 @qq.com 逐个点运动,路径运动. I'm going to do some motion and path. 如果是动态增加,就不要用数组,用list.这种.动态增加.点击一个点,加入列表. If it's a dynamic increase, don't u

WPF编程,通过Path类型制作沿路径运动的动画一种方法。

原文:WPF编程,通过Path类型制作沿路径运动的动画一种方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/article/details/87339456 From/To/By 类型动画的输入是From.To和By参数: KeyFrame类型动画的输入是关键帧: 而Path类型的动画输入则是PathGeometry,这是其最大特点. ?Path类型的动画是一种可以沿指定路径运动的动画, 使用DoubleAnimationU

WPF编程,通过Path类型制作沿路径运动的动画另一种方法。

原文:WPF编程,通过Path类型制作沿路径运动的动画另一种方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/article/details/87358989 上一篇文章给了一个这方面的例子,那个文章里是通过后台按钮事件进行动画的开始.停止.继续等. 这里给出的是通过前台XAML来实现. 1.前台 定义路径.定义运动的主体,这里是一圆. <Path Stroke="Black" StrokeThickness

SVG格式图片转成HTML中SVG的Path路径

AI图标制作完成之后,保存的svg文件包含许多AI的信息,如果要在HTML中使用,我们需要在svg文件中提取/修改信息,重新保存. 1.在AI中已经完成图标,要保存SVG文件,点击"文件(File)"-"另存为(Save As)",在弹出的对话框中保存类型选择SVG(*.svg). 2.svg文件保存后,用文本编辑器打开,找到<path>这一个节点,d属性里面就是这个图片的路径数据[注:在保存svg图标的时候需要使用路径查找器工具将图标制作为复合路径,不

简单聊一聊Ansible自动化运维

一.Ansible概述 Ansible是今年来越来越火的一款开源运维自动化工具,通过Ansible可以实现运维自动化,提高运维工程师的工作效率,减少人为失误.Ansible通过本身集成的非常丰富的模块可以实现各种管理任务,其自带模块超过上千个.更为重要的是,它操作非常简单,即使小白也可以轻松上手,但它提供的功能又非常丰富,在运维领域,几乎可以做任何事. 1.Ansible特点 Ansible自2012年发布以来,很快在全球流行,其特点如下: Ansible基于Python开发,运维工程师对其二次

简单聊一聊PRINCE2与PMP的区别

PMP与PRINCE2的主要区别,那我想先说下认证情况: PMP(项目管理专业人士资格认证)是PMI的产品,PMBOK是PMP的认证标准,是事实上的美国项目管理标准,PMI资格成员70%集中在北美,中国在全球认证人数仅次于美国等少数国家,这项成绩源于PMI.国家外国专家局(考试组织单位)及在中国众多REP(注册的教育机构)的10年共同努力. PRINCE2(受控环境下的项目管理资格认证)是OGC的产品,是英国项目管理标准,它流行于英国及欧洲.澳大利亚等国家,联合国将其作为项目管理的推荐标准,PR

简单聊一聊直播开发需要掌握的一些基本知识

现如今的直播行业如日中天,火爆程度以往如前,从2016年至今.其火爆程度依旧未减,原因就在于直播行业的多变化.在人们厌倦了一对多直播的枯燥无聊后,开发程序员们立刻根据一对多行业衍生出一对一的私密直播系统,它结合了一对多的优缺点,完美的把缺点化为优点,这也是它能够受到广大用户喜爱的重要原因.那么小编今天就跟大家概聊一下关于直播行业研发的这点技术性问题!简单说一下在拥有优质的直播源码的条件下需要准备什么才能够开发一对一直播软件呢???1.首先得选择好直播流媒体服务.??2.选择好以后呢开始研究直播接

简单聊一聊JS中的循环引用及问题

本文主要从 JS 中为什么会出现循环引用,垃圾回收策略中引用计数为什么有很大的问题,以及循环引用时的对象在使用 JSON.stringify 时为什么会报错,怎样解决这个问题简单谈谈自己的一些理解. 1. 什么是循环引用 当对象 1 中的某个属性指向对象 2,对象 2 中的某个属性指向对象 1 就会出现循环引用,(当然不止这一种情况,不过原理是一样的)下面通过代码和内存示意图来说明一下. function circularReference() { let obj1 = { }; let obj

坐标转换成SVG的path路径

function svgPathCurv(a,b,curv) { /* * 弯曲函数. * a:a点的坐标{x:10,y:10} * b:b点的坐标{x:10,y:20} * curv:弯曲程度 取值 -5 到 5 */ curv = curv ? curv : 0; var s, k2, controX, controY, q, l, path = ''; var s = 'M' + a.x + ',' + a.y + ' '; /* * 控制点必须在line的中垂线上 * **求出k2的中垂