• SVG的常用元素和动画运用


    一、SVG 常用元素及其使用

    1、svg 标签

    1. // 第一行:包含了 XML 声明,XML 声明其实和 HTML 文档的 DTD 声明是类似的。
    2. // SVG 的文档声明方式(划重点:一般如果 SVG 运用在 HTML 里,我们可以不写这样的文档声明,但如果是单独的 SVG 文件,那就需要写了,否则浏览器可能会不认识)
    3. // standalone 属性是在表明该 xml 声明是否是独立的,如果不是即 standalone="no",那后面会引入外部的 dtd ,如第二行第三行所示。 version 属性用于指明 SVG 文档遵循规范的版本。 它只允许在根元素<svg> 上使用。 它纯粹是一个说明,对渲染或处理没有任何影响。虽然它接受任何数字,但是只有1.0 和 1.1.这两个有效的选择。
    4. <?xml version="1.0" standalone="no"?>
    5. <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
    6. // xmlns 属性是 SVG 的 XML 声明空间
    7. // width & height 属性,可以理解成画布的大小
    8. // viewBox 属性的四个参数,前两个表示截图起点,后面两个表示截图终点,均是以左上角定点为原点
    9. <svg width="300"
    10. height="300"
    11. viewBox="0, 0, 100, 200"
    12. xmlns="http://www.w3.org/2000/svg"
    13. version="1.1">
    14. <circle cx="100" cy="50" r="49" stroke="black"
    15. stroke-width="2" fill="red" />
    16. </svg>

    2、path 标签

    1. <path d="
    2. M73.8616812,68.8664775
    3. L74.5015359,74.5939423
    4. L68.1746283,71.7969507
    5. C66.2299599,72.4159872 64.1377269,72.7711218 61.9444643,72.7711218
    6. C51.9719158,72.7711218 43.8883163,65.7823167 43.8883163,57.1611168
    7. C43.8883163,48.5399169 51.9719158,41.5511118 61.9444643,41.5511118
    8. C71.9164005,41.5511118 80,48.5399169 80,57.1611168
    9. C80,61.8286883 77.6181486,66.006419 73.8616812,68.8664775"
    10. id="Fill-1"
    11. fill="#FFFFFF">
    12. </path>
    d属性里指令的含义
    指令参数含义
    Mx,y将画笔移动到点(x,y)
    Lx,y画笔从当前的点绘制线段到点(x,y)
    Hx画笔从当前的点绘制水平线段到点(x,y0),y0 表示绘制前画笔所在 y 轴坐标,也就是 y 轴不变
    Vy画笔从当前的点绘制竖直线段到点(x0,y),x0 表示绘制前画笔所在 x 轴坐标,也就是 x 轴不变
    Arx ry x-axis-rotation large-arc-flag sweep-flag x y画笔从当前的点绘制一段圆弧到点(x,y)
    Cx1 y1, x2 y2, x y画笔从当前的点绘制一段三次贝塞尔曲线到点(x,y)
    Sx2 y2, x y特殊版本的三次贝塞尔曲线(省略第一个控制点)
    Qx1 y1, x y绘制二次贝塞尔曲线到点(x,y)
    Tx y特殊版本的二次贝塞尔曲线(省略控制点)
    Z绘制闭合图形,如果 d 属性不指定Z命令,则绘制线段,而不是封闭图形

    每个指令都有对应的小写指令。例如M 10,10 有对应的 m 10,10。大写代表绝对位置,所谓绝对位置即对 SVG 画布左上角原点的绝对。小写代表相对位置,所谓相对位置是以当前画笔所在位置进行定位

    3、基本图形

    图形标签模板含义
    矩形< rect ><rect x="60" y="10" rx="10" ry="10" width="30" height="30" />x:起点横坐标,y:起点纵坐标,rx:倒角x轴方向半径,ry:倒角x轴方向半径,width:宽度,height:高度
    圆形< circle ><circle cx="100" cy="100" r="50" fill="#fff" />cx:圆心横坐标,cy:圆心纵坐标,r:半径
    椭圆< ellipse ><ellipse cx="75" cy="75" rx="20" ry="5" />cx:椭圆心横坐标,cy:椭圆心纵坐标,rx:椭圆x轴方向半径,ry:椭圆y轴方向半径
    直线< line ><line x1="10" x2="50" y1="110" y2="150" />x1,y1:起点,x2,y2:终点
    折线< polyline ><polyline points="60 110, 65 120, 70 115, 75 130, 80 125, 85 140, 90 135, 95 150, 100 145" />每两个点以空格配对为一个坐标点,逗号隔开形成坐标集合。连成折线。
    多边形< polygon ><polygon points="50 160, 55 180, 70 180, 60 190, 65 205, 50 195, 35 205, 40 190, 30 180, 45 180" />类似折线,不同的是,最后一个点会自动闭合第一个点,形成闭环。

    4、symbol标签

    symbol的作用就是相当于是一个元件,放在我们的工具箱里,放一份就可以无限引用。当它在工具箱里时,我们是看不到它的(页面不会渲染它),只有我们使用了<use>标签对其进行实例引用时,我们才可以在页面上看到它

    1. <svg class="svg-sprite">[工具箱]
    2. <symbol id="icon-wave_add" viewBox="0 0 76 76">
    3. <path d="M38 0a4 4 0 014 4v30h30a4 4 0 110 8H41.999L42 72a4 4 0 11-8 0l-.001-30H4a4 4 0 110-8h30V4a4 4 0 014-4z" fill="currentColor" fill-rule="evenodd" opacity="none"></path>
    4. </symbol>
    5. <symbol id="icon-time" viewBox="0 0 10 10">
    6. <path d="M5 0a5 5 0 110 10A5 5 0 015 0zm0 1.5a.5.5 0 00-.5.5v3.02l.008.088a.5.5 0 00.238.343L7.02 6.794l.082.039a.5.5 0 00.603-.215l.039-.082a.5.5 0 00-.216-.603L5.5 4.735V2l-.008-.09A.5.5 0 005 1.5z" fill="rgba(153,153,153,1)" fill-rule="evenodd" class=" "></path>
    7. </symbol>
    8. <symbol id="icon-wave_delete" viewBox="0 0 40 40">
    9. <g fill="none" fill-rule="evenodd">
    10. <circle fill="#000" opacity="0.2" cx="20" cy="20" r="20"></circle>
    11. <path stroke="#FFF" stroke-width="4" stroke-linecap="round" d="M13 13l14 14M27 13L13 27"></path>
    12. </g>
    13. </symbol>
    14. </svg>
    15. <use xlink:href="#icon-time"></use>

    二、动画及其运用

    SVG 中有很多属性我们是可以用 CSS 去描述的。在基于 CSS 动画三剑客(animation, transform, transition)的基础上。我们对一些属性进行控制,就达到我们想要的动画效果。

    1. // 行内的 transform 属性,他的执行基点是在我们 svg 元素的左上角也就是 svg 的坐标原点
    2. <rect transform="rotate(45deg) ..." ... />
    3. // CSS 的 transform 原点则在元素本身的中心点
    4. rect {
    5. transform: rotate(45deg)
    6. }

    也可以利用 SMIL 对 SVG 做动画处理

    1. <svg width="100%" height="100%" viewBox="0 0 100% 100%">
    2. {[1, 2, 3, 4, 5].map((it, index) => (
    3. <line
    4. key={index}
    5. stroke="#000"
    6. strokeWidth="2"
    7. x1={15 + index * 5}
    8. y1="8"
    9. x2={15 + index * 5}
    10. y2="22"
    11. >
    12. <animate
    13. attributeName="y1"
    14. values="8; 15; 8"
    15. dur="1s"
    16. begin={`${(5 % (index + 1)) * 0.2}s`}
    17. repeatCount="indefinite"
    18. />
    19. <animate
    20. attributeName="y2"
    21. values="22; 15; 22"
    22. dur="1s"
    23. begin={`${(5 % (index + 1)) * 0.2}s`}
    24. repeatCount="indefinite"
    25. />
    26. </line>
    27. ))}
    28. </svg>

    1、path 路径的变化(图形平滑变化)

    通过对<path/> d 属性的控制,我们可以实现很多动画效果

    1. path {
    2. transition: ease all 0.3s; // 就像对dom一样的对待svg
    3. &.play { // 这里是播放状态下的<path />路径
    4. d: path("M 12,26 18.5,22 18.5,14 12,10 z M 18.5,22 25,18 25,18 18.5,14 z");
    5. }
    6. &.pause { // 这里是播放状态下的<path />路径
    7. d: path(
    8. "M 12,26 16.33,26 16.33,10 12,10 z M 20.66,26 25,26 25,10 20.66,10 z"
    9. );
    10. }
    11. }
    1. const pathMap = {
    2. from: "M 12,26 16.33,26 16.33,10 12,10 z M 20.66,26 25,26 25,10 20.66,10 z",
    3. to: "M 12,26 18.5,22 18.5,14 12,10 z M 18.5,22 25,18 25,18 18.5,14 z"
    4. };
    5. <svg class="icon" viewBox="0 0 120 120" width="400" height="400">
    6. <path
    7. d="M 12,26 16.33,26 16.33,10 12,10 z M 20.66,26 25,26 25,10 20.66,10 z"
    8. fill="#000000"
    9. >
    10. <animate
    11. attributeName="d"
    12. from={play ? pathMap.from : pathMap.to}
    13. to={play ? pathMap.to : pathMap.from}
    14. dur="0.3s"
    15. begin="indefinite" // 这里设置开始时间为无限以达到不自动播放的效果
    16. fill="freeze"
    17. />
    18. </path>
    19. </svg>

    2、描边动画

    描边动画的核心点就在于 SVG 的两个显示属性分别是 stroke-dasharray、stroke-dashoffset

    属性描述支持范围
    stroke-dasharray1 3 4 4它的值是一个序列,可以传入多个值,分别指定描边短线的长度和描边线间距,多个值依次循环,如果传入3个值,类似于 stroke-dasharray: 1,2,3。则会自动复制一份再生效<circle>,<ellipse>,<line>,<mesh>,<path>,<polygon>,<polyline>,<rect>,<altGlyph>,<altGlyphDef>,<glyph>,<glyphRef>,<textPath>,<text>,<tref>,<tspan>
    stroke-dashoffset10描边线段的起始位置距离图形绘制起点的偏移量。正负值可以决定顺时针还是逆时针走向跟stroke-dasharray一致

     

    在实际开发中,我们会遇到一些比较复杂的图形需要做描边,这个时候我们没办法去得到它的周长是多少,这时候分两种场景处理。一种是在CSS里我们可以将stroke-dasharray的第二个值设置成一个非常大的数字,然后再去调整第一个值比如:

    1. path {
    2. stroke-dasharray: 0(调整到合适的值) 99999999999999
    3. }

    如果在js里我们需要动态去获取周长的话,SVG提供了原生的api可以去获取path的周长。

    1. const inPath = document.getElementById("inner-path");
    2. console.log(inPath.getTotalLength());

    3、轨迹运动动画

    1. // 我们将整个飞机图形元件用g标签包起
    2. <g transform="translate(-100, -35) scale(0.1)">
    3. <path
    4. d="M164.485419 578.709313L196.274694 794.731891c0.722484 5.53904 8.188147 7.224835 11.078081 2.408278l75.860772-121.377234 740.063969-363.409219L164.485419 578.709313z"
    5. fill="#F68206"
    6. ></path>
    7. <path
    8. d="M2.167451 440.233302l159.668861 132.214487 857.828787-260.334901zM289.475071 679.375353l191.217309 153.407337 542.344309-518.743179z"
    9. fill="#FF9900"
    10. ></path>
    11. <path
    12. d="M204.222013 800.030103l125.23048-80.677328-48.888053-39.014111-76.342427 118.4873"
    13. fill="#D3650B"
    14. ></path>
    15. // 然后在这里,我们利用animateMotion,去做这个轨迹运动
    16. <animateMotion
    17. path="M 0 450 Q 150 50 250 50 Q 350 0 400 50 Q 500 50 450 200 C 300 350 250 200 500 50 C 600 50 750 200 650 250 A 50 50 0 1 1 800 50 "
    18. begin="0s"
    19. rotate="auto"
    20. dur="20s"
    21. repeatCount="indefinite"
    22. />
    23. </g>

    三、第三方库

    GSAP、Snap.svg、SVG.js、Velocity.js、anime.js、D3

  • 相关阅读:
    重生奇迹mu格斗怎么加点
    Python笔记-从配置读取参数
    Python基于Flask的高校舆情分析,舆情监控可视化系统
    yolov5 + openvino + c++测试
    计算机毕业设计 基于微信小程序的校园商铺系统的设计与实现 Java实战项目 附源码+文档+视频讲解
    企业怎样选择适合的服务器租用?
    信钰证券:股票抵押是好还是坏?
    Vue技术-mapstart与mapGetters=》模块化+命名空间
    macOS 卸载被锁的FortiClient软件步骤
    GitHub上有助于开发微信小程序的仓库
  • 原文地址:https://blog.csdn.net/qq_31851435/article/details/125594112