svg高级应用及动画

摘要:
Canvas和webGL结合css3,可以完成大部分动画和需求。Svg在解决排版、图标和相关动画方面非常有效,而且Svg也是矢量图形。各种屏幕尺寸的高清还原设计简直就是一个法宝。svg的基本知识将不再解释。结合svg的特点和应用场景,主要介绍了以下几个方面:svgsprices背景图像插入svg文本路径动画SVGspriteSVGsprite相对于字体的优势是矢量图形的抗锯齿效果,您不再需要担心适应高清屏幕。

canvas 和 webGL 这两项图形技术结合 css3 可以说能完成绝大部分的动画和需求。但 canvas 和 webGL 毕竟是偏向底层的绘制引擎,某些场景使用起来还是过于繁琐的,不分场合一律使用锤子解决的行为不值得提倡。svg 在解决排版,图标,相关动画还是非常高效的,而且 svg 还是矢量图形,高清还原各种屏幕尺寸的设计简直就是神器。

svg 基础知识不再讲解,结合svg特点和应用场景,主要介绍如下几方面的内容

  • svg sprite
  • css background-image 插入svg
  • 文字路径
  • 路径动画

SVG sprite

SVG sprite 之于 font-face 的优势就是矢量图的抗锯齿效果,再也不需要为适配高清屏而操心。使用方式就是 svg 标签结合 symbol元素即可,其中 svg 是容器,而symbol 则是组件模板。怎么把svg组件显示出来呢?使用 use 元素指向组件的id即可,如下所示:

<svg>
    <symbol id="ok">
        <!-- svg元素或组合 -->
    </symbol>
    <!-- ... -->
</svg>

<use href="#ok"/>

当然网上有很多工具可以帮我们把图标自动sprite,比如:iconfot,gulp-svg-symbols

在css中插入svg

SVG 添加到网页中有多种方法,最常见的是:

  1. 在 html 中内联
  2. object、 iframe 或 embed 标签插入
  3. img 标签
  4. CSS background-image 属性

html 内联方式

<svg>
  <title>line</title>
  <line x1="20" y1="20" x2="100" y2="100">
</svg>

使用 object、iframe 或 embed 标签插入

<object data="flag.svg" type="image/svg+xml"></object>
<iframe src="flag.svg" frameborder="0"></iframe>
<embed src="flag.svg" type="" />

使用img标签插入

<img src="flag.svg"/>

现在重点介绍一下使用 css background属性插入的方式;既可以使用图片路径也可以使用 base64 格式的data URI 方式

.svg-bg {
  background-image: url("./bg.svg");
}
.svg-background {
  background-image: url("data:image/svg+xml;<DATA>");
}

我认为使用 background base64 引入svg是最具灵活性的一种方式,还可以加入svg动画,不需要额外加载图标,只需引入css即可。同时跟普通图片相比它又有着抗锯齿的优势,因此元素尺寸随意调整不担心失真。比如下面使用background data URI 引入的加载动画css:

<style>
.loading{
   50px;
  height: 50px;
  background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg'   height='80'%3E%3Cpath d='M10 40a30 30 0 1130 30' stroke-  stroke='hsl(220,90%,60%)' fill='none'%3E%3CanimateTransform attributeName='transform' begin='0s' dur='1.4s' type='rotate' from='0 40 40' to='360 40 40' repeatCount='indefinite'/%3E%3C/path%3E%3C/svg%3E")
  no-repeat center / cover;
}
</style>

<body>
<div class="loading"></div>
</body>

文字路径

svg 除了绘制图形,插入文字也是很方便的,方式也简单,使用 text 元素包裹文本内容即可

<text fill="hsla(260,80%,50%,1)" x="10" y="40" font-size="30"> I Love SVG </text>

还有一种很实用的效果就是文字路径,也就是文字按照定义好的 path 进行排列显示,这需要使用到另一个标签 textPath。实现方式:首先定义一个path元素(这里使用三次贝塞尔曲线),然后 textPath元素使用 xlink:href 属性引入path,最后再用 text标签包裹。

<g>
  <title> 文字路径 </title>
  <path id="path" d="M 10 100 C 100 0 150 300 250 100" fill="none" stroke="#555"/>
  <text x="10" y="100" stroke="hsl(280,100%,50%)">
    <textPath xlink:href="#path">I Love SVG I Love SVG I Love SVG</textPath>
  </text>
</g>

https://www.tmojm.com创业加盟网

svg路径动画

svg动画既可以使用 css3 相关属性实现,也可以使用自己独有的api实现。svg方式主要用以下标签:

  • animate:基础动画元素,实现单属性的动画过渡效果

  • animateTransform: 实现transform变换动画效果

  • animateMotion:路径动画效果

这里只介绍路径动画,基础动画和变换动画与css动画相似,就不再介绍。来看一个基于 css3 的 animation 实现百分比加载的动画。这里用到了两个关键属性:

  • stroke-dasharray:设置线条断开为虚线,数值越大,线就越长

  • stroke-dashoffset:设置线条的偏移,设置后,线段就会偏移相应的值,实现线条动画只要动态改变这个偏移值就好

首先需要通过js获取路径的总长度

//获取路径长度
const arc = document.getElementById('circle');
console.log(arc.getTotalLength()); //250.92141723632812

接着编写svg相关

<style>
  circle {
    fill: transparent;
    stroke- 10px;
  }
  #circle {
    stroke-dasharray: 250.921;
    stroke-dashoffset: 250.921;
    animation: round 3s linear infinite;
  }
  @keyframes round {
    to {
      stroke-dashoffset: 0;
    }
  }
</style>
<g>
  <circle cx="100" cy="60" r="40" stroke="#ccc" />
  <circle id="circle" cx="100" cy="60" r="40" stroke="hsl(160,80%,50%)" />
</g>

当然其他stroke线条动画也类似

接着我们再基于svg animateMotion标签来实现path路径动画,其中path是运动路径,dur 是持续时间,repeatCount设置是否循环

<g id="pathAnimate">
<title> 路径动画 </title>
<path stroke="hsl(0,0%,60%)" d="M 10 300 Q 150 100 300 300 T 490 300Z" stroke-width="2" fill="none"/>
<circle cx="0" cy="0" r="8" stroke-width="1" stroke="hsl(300,10%,40%)" fill="hsl(300,100%,50%)">
<animateMotion path="M 10 300 Q 150 100 300 300 T 500 300Z" dur="4s" repeatCount="indefinite"/>
</circle>
</g>

使用svg实现路径动画真是性价比超高。

免责声明:文章转载自《svg高级应用及动画》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇在发布ASP.NET网站的时候,出现state server错误Newifi Mini安装PandoraBox下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

位置动画Android的Activity屏幕切换动画(一)左右滑动切换

查了好多资料,发现还是不全,干脆自己理整吧,至少保证在我的做法正确的,以免误导读者,也是给自己做个记录吧!     在Android发开中程过,经常会到碰Activity之间的换切效果的题问,上面绍介一下如何实现阁下滑动的换切效果,首先懂得一下Activity换切的实现,从Android2.0开始在Activity增加了一个方法:     public v...

UE4_武器4_武器切换(下)

添加长剑的动画混合空间 添加人物摩擦力/惯性: 注意闪避时要把摩擦力系数暂时改回2.0,最后别忘了在结束时改成0 继续, 把其他的状态动画修改为长剑的相应动画 创建长剑攻击的动画蒙太奇,添加音效和通知 另,因为找到了两个比较不错的普通攻击动画,一个是向左砍一个是向右砍,所以打算做成像出拳时那样,随机播放一个 所以改了一下结构体,新加了一个。逻...

Ogre骨骼动画

转自:http://blog.csdn.net/yanonsoftware/article/details/1281516 OGRE的基本动画控制是很简单的,设置一个动画的操作是这样: // Set idle animation mAnimationState = ent->getAnimationState( "Idle" ); mAnimatio...

Android 三种动画详解

Android 三种动画详解 1 背景 不能只分析源码呀,分析的同时也要整理归纳基础知识,刚好有人微博私信让全面说说Android的动画,所以今天来一发Android应用的各种Animation大集合。英文厉害的请直接移步参考Android Developer。 Android系统提供了很多丰富的API去实现UI的2D与3D动画,最主要的划分可以分为如...

帧动画和骨骼json、极速、二进制对比

对比总结: 1. 帧动画的效率最高,但是图片超过一定帧数,资源图片非常大。比较适合帧数少,大量动画存在,要求效率高的场合。 骨骼json效率较低,已经不推荐使用。 骨骼极速,不支持网格等。 骨骼二进制,最新的格式。资源小,效率高。导出时将骨骼跑一遍,将计算数据序列化成二进制,使用时反序列化,节约了大量cpu运算,所以效率较json格式高。  (我猜是这样...

一些炫酷的css效果

前言 本文是笔者写CSS时常用的套路。不论效果再怎么华丽,万变不离其宗。 之前发的CSS技巧大部分都是依照本文的套路来写的 有人问我为什么我能想出这么多的动画?笔者阅番百部,对常用的动画技巧了如指掌,同样那些酷炫的网站只要细心观察,也会给笔者带来很多设计上的灵感。 一言以蔽之:只有多欣赏动画,才能写出好的动画。 小提示:本文会不定期更新哦!每打开一次可...