之前遇见动画就很想用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动画属性很相似,很方便学习。很多时候动画就是简单组成了复杂,或者没有从简单思考显得复杂。我们看到酷炫的动效可能要复杂一些,但看完本文你是不是也能完成自己的小动画了呢?

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

  1. canvas 实现光线沿不规则路径运动

    canvas 实现光线沿不规则路径运动 此文章为原创,请勿转载 1.svg实现 2.canvas实现 3.坑点 svg让动画沿着不规则路径运动 查阅svg文档后发现,svg动画运动有两种实现方式,且都 ...

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

    u3d 逐个点运动,路径运动. U3d one by one, path motion. 作者:韩梦飞沙 Author:han_meng_fei_sha 邮箱:313134555@qq.com E-m ...

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

    原文:WPF编程,通过Path类型制作沿路径运动的动画一种方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/article/de ...

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

    原文:WPF编程,通过Path类型制作沿路径运动的动画另一种方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/article/d ...

  5. css3 svg 物体跟随路径动画教程

    css3 svg 物体跟随路径动画教程https://www.jianshu.com/p/992488f3f3fc

  6. OpenLayer实现路径运动

    近期由于业务的需求,让我这从未想过要碰Web Gis的业余前端开发者,走了Web Gis的开发道路.功能需求很简单,但却也是让自己难为了好几天.如,应该选择那个Gis框架,Gis框架的兼容性如何,直接 ...

  7. svg(1) path路径

    注: 笔记来自于http://www.jb51.net/html5/72250.html  以及http://blog.csdn.net/u013291076/article/details/2707 ...

  8. 6. svg学习笔记-路径

    路径相比于多边形<polygon>元素具有更强绘图能力,<polygon>元素可以绘制任意的多边形,而路径可以绘制任意的轮廓线,是线段,曲线,圆弧的组合形式.svg中可以使用& ...

  9. ThreeJS模拟人沿着路径运动-路径箭头使用纹理offset偏移

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

随机推荐

  1. 涂色(CQOI2007)

    --BZOJ1260_区间dp Description 假设你有一条长度为5的木版,初始时没有涂过任何颜色.你希望把它的5个单位长度分别涂上红.绿.蓝.绿.红色,用一个长度为5的字符串表示这个目标:R ...

  2. dubbo入门学习 二 RPC框架

    rpc框架解释 谁能用通俗的语言解释一下什么是 RPC 框架? - 远程过程调用协议RPC(Remote Procedure Call Protocol) 首先了解什么叫RPC,为什么要RPC,RPC ...

  3. Java程序设计(第二版)复习 第二章

    1.Java使用Unicode字符集,一般用16位二进制表示一个字符.且Java中午sizeof关键字,因为所有基本数据类型长度是确定的,不依赖执行环境. 2. Java变量在声明时并没有分配内存,真 ...

  4. 偏差(Bias)和方差(Variance)——机器学习中的模型选择zz

    模型性能的度量 在监督学习中,已知样本 ,要求拟合出一个模型(函数),其预测值与样本实际值的误差最小. 考虑到样本数据其实是采样,并不是真实值本身,假设真实模型(函数)是,则采样值,其中代表噪音,其均 ...

  5. docker + spring boot 打包 部署。

    docker 安装 什么的 就不一一介绍了 不会安装百度一找一堆. 我这直接上代码. 首先你要有个spring boot项目. 然后打包.打包很简单 我打包的是 jar文件.直接在pom.xml文件里 ...

  6. freeType移植总结①——使用keil编译freeType2库

    在各个技术博客搜索相关资料后,终于将freeType的源码用keil工程编译通过,这里记录一下步骤和遇到的问题. 因为网上的资料都是旧版本freeType的工程,这里博主使用的是freeType2.9 ...

  7. 反编译看java for-each循环

    java 1.5发行版引入的for-each循环.(引自<Effective Java>中文版第二版 第46条) 如以下对数组列表的for-each循环示例: public class F ...

  8. linux下使用iptables统计ip/端口流量

    1.添加ip/端口的流量统计 入网流量: iptables -A INPUT -d 出网流量: iptables -A OUTPUT -s 2.查看流量统计信息 iptables -L -v -n - ...

  9. h5上传视频文件

    从一开始我就掉坑里了,<input type="file" style="display: block;" id="img-upload&quo ...

  10. C#使用Dotfuscator混淆代码的加密方法

    C#编写的代码如果不进行一定程度的混淆和加密,那么是非常容易被反编译进行破解的,特别是对于一些商业用途的C#软件来说,因为盯着的人多,更是极易被攻破.使用VS自带的Dotfuscator可以实现混淆代 ...