svg高级应用及动画
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 添加到网页中有多种方法,最常见的是:
- 在 HTML 中内联
object、iframe或embed标签插入img标签- 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{
width: 50px;
height: 50px;
background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='80' height='80'%3E%3Cpath d='M10 40a30 30 0 1130 30' stroke-width='4' 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>
文字路径
I Love SVG
I Love SVG I Love SVG I Love SVG
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-width: 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线条动画也类似
Click Me
接着我们再基于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高级应用及动画的更多相关文章
- SVG 2D入门11 - 动画
交互性 SVG拥有良好的用户交互性,例如:1. SVG能响应大部分的DOM2事件.2. SVG能通过cursor良好的捕捉用户鼠标的移动.3. 用户可以很方便的通过设置svg元素的zoomA ...
- html5 canvas高级贝塞尔曲线运动动画(好吧这一篇被批的体无完肤!都说看不懂了!没办法加注释了!当然数学不好的我也没办法了,当然这还涉及到一门叫做计算机图形学的学科)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- css3 svg 物体跟随路径动画教程
css3 svg 物体跟随路径动画教程https://www.jianshu.com/p/992488f3f3fc
- 【Web动画】SVG 实现复杂线条动画
在上一篇文章中,我们初步实现了一些利用基本图形就能完成的线条动画: [Web动画]SVG 线条动画入门 当然,事物都是朝着熵增焓减的方向发展的,复杂线条也肯定比有序线条要多. 很多时候,我们无法人工去 ...
- 利用svg技术实现在线动画演示
搜索MDCC的论文,发现了这个站点,里面有演示动画,居然是通过svg来实现的. 分享给大家看看: 有空研究下,做一个类似的演示,展示一下OceanBase内部的常见操作. 展示一个svg做的游戏: h ...
- 纯SVG实现的Loading动画,拿走不谢
转载自:https://blog.csdn.net/wo_shi_ma_nong/article/details/88833828 话不多说,直接上代码. ( 到这里看效果: http://www.v ...
- CSS笔记 - SVG Polyline 图片绘制动画边框
<style> div{ width: 420px; height: 200px; background: url('./img/timg.jpg') no-repeat; } polyl ...
- 高级UI-自定义动画框架
有的时候会需要做一些自定义的动画效果,在会反复用到的动画效果可以考虑做成动画框架,方便使用,做成框架的话就需要考虑很多的问题,最典型的问题就是属性和方法必须要是可配置的,这里就来聊一聊自定义动画框架的 ...
- 高级UI-属性动画
在3.0以前,动画效果主要为补间动画(TweenAnimation)和帧动画(FrameAnimation),从3.0开始加入了属性动画,其本质就是不断地改变控件的属性,从而达到复杂的动画效果,其效果 ...
随机推荐
- python执行脚本报错: Non-ASCII character '\xe4' in file yang.py on line 1, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
这是因为我们在写python程序的时候,无论在注释里面出现中文,还是在代码里面出现中文,也就是说只要这个python程序里面有中文,我们就不能直接用python2来进行执行,如果安装是python3可 ...
- 【Linux系列汇总】小白博主的嵌入式Linux实战快速进阶之路(持续更新)
我把之前在学习嵌入式Linux和工作中遇到问题和相关经验等,一起整理到这里,方便自己查阅和学习,温故而知新,如果能帮助到您,请帮忙点个赞: 本文的宗旨 嵌入式Linux 的项目通常需要一个团队来开发, ...
- Jmeter-函数助手之${__RandomString(,,)}使用
${__RandomString(,,)}使用方法 1.在日常写脚本中,可以随机生成指定的几个字符串作为入参的value,那么jmeter 的这个工具就特别好用. 应用: 2.填写接口入参, 3.运 ...
- C++内存管理学习笔记(3)
/****************************************************************/ /* 学习是合作和分享式的! /* Auth ...
- html中require.config 缓存问题
在html中,require的官方基本用法如下: <!DOCTYPE html> <html> <head> <title>My Sample Proj ...
- Gradle 多环境URL请求设置
在开发过程中,多环境配置是经常遇到的,比如在Android开发过程中,在不同环境上请求服务器的URL是不同的,使用Gradle进行管理,是非常方便的. 首先查看工程目录结构: 使用AndroidStu ...
- python-修改文件
1.修改文件1 # fw = open('username','w')# fw.write('hhhh')# fw.flush() #强制把缓冲区里面的数据写到磁盘上1.简单粗暴直接# 1.打开一 ...
- react-router 4v 路由嵌套问题
嵌套的路由中,子级的Link跳转到父级时,页面无法整个渲染到父级. 原因:某一级的路由用了Router组件,导致内部Link的时候无法将整个页面渲染到“/” 解决方法:全局一个Router. 子级的兄 ...
- js性能优化之---防抖函数
使用场景 input的时时触发搜索功能 scroll事件的滚动条位置的监测 resize事件监听窗口变化等 举个栗子(input框时时触发搜索功能) 普通未防抖款 var textElement = ...
- 3.10 Go Map哈希表
3.10 Go Map哈希表 map是key-value类型数据结构,读作(哈希表.字典),是一堆未排序的键值对集合. map是引用类型,使用make函数或者初始化表达式创建. map的key必须是支 ...