SVG介绍

SVG(Scable vector Graphics 可缩放矢量图形), 是一种使用XML来描述2D图形的语言; 因为是基于XML,那么svg DOM中的每一个元素都可以,绑定上javascript事件处理器; 在svg中每一个绘制的图形都被视为对象,svg元素的属性发生变化那么浏览器也会重新渲染图形的。

注意:

1、SVG并不属于html5专有内容,在html5之前就有SVG。

2、SVG文件的扩展名是".svg"。

3、SVG绘制的图像在图片质量不下降的情况下被放大。

4、SVG图像经常在网页中制作小图标和一些动态效果图。

在html5中使用svg必须使用 <svg> 标签,它的其中一个强大之处在于<path>标签可以表示任意的矢量形状,利用好这个path可以做出很多传统html/css做不出来的效果。

通过<path>路径元素的d属性,分析如下:

(1).d属性值是两个图形绘制命令,分别以字母开头。

(2).每一组命令中的参数用逗号分隔,命令与命令之间可以用空格或者换行分隔。

(3).M是Move to的缩写,表示将笔触移动到指定坐标,也就是从指定位置开始绘制。

(4).L是Line的缩写,表示绘制一条直线,L后面的参数表示直线的终点坐标。

(5).命令区分大小写,这一点需要特别注意,大写表示绝对坐标,小写表示相对坐标。

(6).绝对坐标表示以坐标系原点(0,0)为参考点,相对坐标表示当前坐标值相对上一个控制点坐标的变化。

对上述代码的坐标分析如下:

(1).M50,50:M是大写,说明是绝对坐标,相对于当前用户坐标系原点进行定位。

(2).l150,50:l是小写,相对的是M50,50,此点的绝对坐标位置就是(50+150,50+50)。

主要命令列表如下:

(1).M(m):将画笔移动到点指定坐标。

(2).L(l):绘制一条直线。

(3).H(h):绘制一条水平线段。

(4).V(v):绘制一条垂直线段。

(5).A(a):绘制一段圆弧。

(6).C(c):绘制三次赛贝尔曲线。

(7).S(s):特殊版本的三次赛贝尔曲线。

(8).Q(q):绘制二次赛贝尔曲线。

(9).T(t):绘制特殊版本二次赛贝尔曲线。

(10).Z(z):绘制闭合图形,如果不指定z命令,那么不是绘制闭合图形,而是绘制线段。

1. 做路径动画

<svg viewBox="0 0 2706 2048" width="120" height="66" class="svg-hand"><g id="hand"><!--手上的圆圏--><circle cx="370" cy="90" r="210" fill="yellow"></circle><!--手的形状--><path d="..."></path></g><!--动画路径--><path id="animation-hand-arc" d="M-514,665c0,0,1378.463-1138.762,2891,0" stroke="transparent" fill="transparent"/><!--动画设置--><animateMotion id="arcmove" xlink:href="#hand" dur="1s" begin="0" fill="freeze" repeatCount="1"><mpath xlink:href="#animation-hand-arc" /></animateMotion>
</svg>

animateMotion标签,通过它的mpath指定一个动画的路径

2. 实现不规则形状的点击

<svg width="580" height="400" xmlns="http://www.w3.org/2000/svg"><!-- Created with Method Draw - http://github.com/duopixel/Method-Draw/ -->
​<path onclick='myclick()' stroke="#56ffaa" id="svg_9" d="m173.396883,254.591074c-4.797775,-2.156114 1.462953,-6.46692 3.833221,-8.373818c1.596577,-1.468559 -9.1501,0.206007 -4.612947,-4.891952c4.977919,-4.164754 3.097524,-11.210596 -1.87824,-14.485767c-6.847691,-4.607715 -15.633716,-8.551275 -18.163505,-17.155134c-2.557992,-5.358961 3.508329,-11.003041 -0.393495,-15.842324c-3.140618,-6.283297 0.528516,-12.835459 2.809148,-18.655957c1.048806,-8.051478 -5.37599,-14.418665 -8.909232,-21.0334c-4.374957,-6.32119 -6.896883,-13.686831 -7.259278,-21.362704c-0.951437,-3.276388 0.101487,-8.364528 3.900756,-3.947296c7.956237,6.348832 16.690848,12.373108 22.259278,21.063127c1.054047,3.138905 5.274647,12.236351 5.510329,3.998095c0.110382,-11.322907 3.580615,-23.672231 12.472816,-31.260015c6.04832,-5.492224 9.310155,4.124439 9.592366,9.011263c1.574265,9.615218 -1.035268,19.150273 -3.943199,28.233152c-1.067531,4.221106 -3.847653,15.788477 4.081291,11.523392c18.265441,-7.027611 40.395378,0.353271 52.292699,15.450067c5.469094,7.309682 7.864207,16.700923 7.810134,25.718097c-2.816157,5.297548 7.647371,-0.09924 3.855897,6.012534c-2.232001,6.77039 -8.538279,10.444081 -12.955643,15.554332c-4.49503,4.094914 -1.159853,12.850016 -8.59333,14.140072c-10.846346,3.33214 -22.235901,4.791741 -33.527327,5.641328c-6.318649,1.290056 -9.385122,-5.91026 -3.328921,-8.903615c2.903508,-4.460576 11.210362,-4.773166 13.678493,-5.479802c-5.898027,0.575096 -13.171764,-1.823925 -18.141722,1.816237c-3.009867,4.869309 -5.420508,11.278377 -11.732233,12.668223c-2.836476,0.785072 -5.752881,1.414646 -8.65735,0.56186l-0.000004,0.000004z" stroke-width="1.5" fill="#007fff"/>
​
</svg><script type="text/javascript">
function myclick(){
console.log(222);
}

3. 沿着路径拖拽的交互

<svg class="volumn-controller" width="580" height="400" xmlns="http://www.w3.org/2000/svg"><path class="volumn-path" stroke="#000" d="m100,247c93,-128 284,-129 388,6" opacity="0.5" stroke-width="1" fill="#fff"/><circle class="drag-button" r="12" cy="247" cx="100" stroke-width="1" stroke="#000" fill="#fff"/></g>
</svg>
​
<script type="text/javascript">let $volumnController = document.querySelector('.volumn-controller'),$volumnPath = $volumnController.querySelector('.volumn-path');// 得到当前路径的总长度let pathTotalLength = $volumnPath.getTotalLength() >> 0;let points = [];// 起始位置为长度为0的位置let startX = Math.round($volumnPath.getPointAtLength(0).x);// 每隔一个像素距离就保存一下路径上点的坐标for (let i = 0; i < pathTotalLength; i++) {let p = $volumnPath.getPointAtLength(i);// 保存的坐标用四舍五入,可以平衡误差points[Math.round(p.x) - startX] = Math.round(p.y);}
​let $dragButton = $volumnController.querySelector('.drag-button'),// 得到起始位置相对当前视窗的位置,相当于jQuery.fn.offsetdragButtonPos = $dragButton.getBoundingClientRect();function movePoint (event) {// 当前鼠标的位置减去圆心起始位置就得到移位偏差,12是半径值,这里先直接写死let diffX = event.clientX - Math.round(dragButtonPos.left + 12);// 需要做个边界判断diffX < 0 && (diffX = 0);diffX >= points.length && (diffX = points.length - 1);// startX是在上面的代码得到的长度为0的位置$dragButton.setAttribute('cx', diffX + startX);// 使用points数组得到y坐标$dragButton.setAttribute('cy', points[diffX]);}$dragButton.addEventListener('mousedown', function (event) {document.addEventListener('mousemove', movePoint);});document.addEventListener('mouseup', function () {document.removeEventListener('mousemove', movePoint);});
</script>

4. 路径的变形动画

<svg viewBox="0 0 10 10" class="svg-1"><path d="M2,2 L8,8" />
</svg>
<style>
.svg-1:hover path {d: path("M8,2 L2,8");
}
path {transition: d 0.5s linear;
}
</style>

5. 结合clip-path做遮罩效果

使用clip-path + svg的路径能够做出任意形状遮罩,如下做一个心形的:

<div style="width:200px;height:200px"><img src="photo.png" alt style="width:100%">
</div>
<svg xmlns="http://www.w3.org/2000/svg" width="0" height="0"><clipPath id="heart" clipPathUnits="objectBoundingBox"><path transform="scale(0.0081967, 0.0101010)" d="m61.18795,24.08746c24.91828,-57.29309 122.5489,0 0,73.66254c-122.5489,-73.66254 -24.91828,-130.95562 0,-73.66254z"/></clipPath>
</svg>
​
<style>
img {clip-path: url("#heart");
}
</style>

为了让这个path刚好能撑起div容器宽度的100%,需要设置:
clipPathUnits="objectBoundingBox"

这样会导致d属性里面的单位变成比例的0到1,所以需要把它缩小一下,原本的width是122,height是99,需要需要scale的值为(1 / 122, 1 / 99)。这样就达到100%占满的目的,如果一开始d属性坐标比例就是0到1,就不用这么搞了。

另外clip-path使用svg的path不支持变形动画。

做一个路径动画、不规则形状的点击、沿着路径拖拽、路径的变形动画以及和clip-path做一些遮罩效果。可以说svg的path效果还是很强大的,当你有些效果用html/css无法实现的时候,不妨往svg的方向思考。

  • SVG和Canvas的区别

    Canvas

    1.依赖分辨率 2.不支持事件绑定 3.弱的文本渲染能力 4.能够以.png和.jpg的格式保存结果图像 5.最适合图像密集的游戏,其中许多对象将会被频繁重绘

    SVG

    1.不依赖分辨率 2.支持事件处理器 3.最适合带有大型渲染区域的应用程序(比如谷歌地图) 4.复杂度高会减慢渲染速度(任何过度使用DOM的应用都不快) 5.不适合游戏应用

前端SVG实现各式图片和动画相关推荐

  1. 前端开发中常用图片格式

    前端开发中常用图片格式 在我们的日常开发中.必不可少会使用很多种图片. 我们需要根据业务场景来选择所使用的图片类型. 这里我整理了一些常用图片类型.他们的优缺点以及建议的使用场景. 如何在计算机中显示 ...

  2. html流程svg动画,12款基于SVG的HTML5应用和动画

    本文作者html5tricks,转载请注明出处 SVG是HTML的扩展标记语言,利用SVG可以做非常多的矢量动画,结合 1.HTML5 SVG 3D蝴蝶飞舞动画 逼真超酷 这次我们要分享的这款HTML ...

  3. 10个超赞的jQuery图片滑块动画

    在前端开发过程中,图片特效都十分绚丽,比如抢红包特效,时间轴等,接下来分享10款效果惊艳的HTML5图片特效分享给大家. 1.HTML5 3D正方体旋转动画 很酷的3D特效 之前我们分享过很多非常不错 ...

  4. 拐道交叉的css3动画,CSS3图片翻转动画技术详解

    CSS动画非常的有趣:这种技术的美就在于,通过使用很多简单的属性,你能创建出漂亮的消隐效果.其中代表性的一种就是CSS图片翻转效果,能让你看到一张卡片的正反两面上的内容.本文就是要用最简单的方法向大家 ...

  5. 秀米SVG点击图片换图

    [文章推荐]流动爱心(求点击) 点击[SVG]-[点击换图]-[把SVG放在推文中] 点击右边的方块[布局模式]-[点击最外边的边框]直到出现动画-点击[动画] 点击大图可以更换图片,点击[+]号可以 ...

  6. Android svg矢量图实现心跳动画

    文章目录 将svg转化为xml文件 给每个path设置动画 要实现的效果如下: 将svg转化为xml文件 阿里巴巴矢量图标库iconfont:https://www.iconfont.cn/ 我们需要 ...

  7. android 动态生成直线,Android SVG技术入门:线条动画实现原理

    SVG技术入门:线条动画实现原理 这是一个有点神奇的技术:一副线条构成的画能自动画出自己,非常的酷.SVG 意为可缩放矢量图形(Scalable Vector Graphics),是使用 XML 来描 ...

  8. html图片向下浮动,css3图片上下浮动动画

    一.float定义float属性定义元素在哪个方向浮动.以往这个属性总应用于图像,使文本围绕在图像周围,不过在CSS中,任何元素都可以浮动.浮动元素会生成一个块级框,而不论它本身是何种元素.按照张鑫旭 ...

  9. 前端SVG基础与深入01

    SVG入门01 引言 图形图像入门 1. 在前端中 我们通常说的像素是什么 2. 为什么使用svg,栅格化图片与矢量图的区别 SVG入门 1. 坐标系统 1.1. 视图 1.2 viewport与vi ...

最新文章

  1. R语言dataframe(data.table)使用用最近的前一个非NA值向前填充缺失值NA实战
  2. 开发者需要知道的有关软件架构的五件事
  3. android 开启一个定时线程_Android中定时执行任务的3种实现方法
  4. python与c语言在语法上的区别-python和c语言的区别是什么
  5. linux监控nmon和analyser的使用
  6. MyBatis总结五:#{}和${}的用法和区别
  7. iframe 去除边框 背景透明等设置 待修改
  8. 电脑编辑安卓分区_如何使用手机APP,编辑文字给屏幕发送节目。
  9. matlab 中的元组(cell)
  10. jQuery javaScript js 判断浏览器的类型、版本的方法
  11. 2019 related conferences 相关会议 ISMAR, VRST, UIST
  12. 图解tcpip 第5版 pdf_现代实用气动技术 第2版 pdf下载 0776
  13. JAVA计算机毕业设计民航售票管理系统(附源码、数据库)
  14. 家庭宽带相关知识及工具
  15. JavaMail详解
  16. 长时间戴太阳镜可使视力下降
  17. 实验报告五201521460014 综合渗透
  18. zigbee RSSI 定位
  19. 真知识,也会成为毒药
  20. 邮件、短信验证码和邮箱认证服务方案选型全指南

热门文章

  1. python使用pillow生成纯透明png图片
  2. 纯CSS实现立体感圆盘(立体化按钮),点击有图
  3. java注册账号_Java实现简单登录注册账号操作
  4. YP.2.7 Other Representations(双语)
  5. win7网络里的计算机,win7看不到局域网计算机怎么办
  6. 什么类型的APP适合推广
  7. 【Spring Cloud 基础设施搭建系列】Spring Cloud Demo项目 将微服务运行在Docker上
  8. python有什么特点有什么应用方向_你知道吗?python特点+可以做什么+就业前景(附30G学习资料)...
  9. express跨域配置
  10. Beacon API的应用