使用SVG基本操作API的实例讲解


Posted in Javascript onSeptember 14, 2017

前面的话

本文将详细介绍SVG基本操作API,并使用这些API制作实例效果

基础API

在javascript中,可以使用一些基本的API来对SVG进行操作

【NS地址】

因为SVG定义在其自身的命令空间下,而不是HTML的命名空间下,可以作为单独的XML文件存在。所以需要使用自身的NS地址

有两个常用的NS地址

var SVG_NS = "http://www.w3.org/2000/svg";
var XLINK_NS = http://www.w3.org/1999/xlink;

【创建图形】

document.createElementNS(SVG_NS,tagName);

【添加图形】

element.appendChild(childElement)

【设置/获取属性】

element.setAttribute(name,value);
element.getAttribute(name);

【设置xlink】

<a>、<textPath>等标签需要设置xlink属性

element.setAttributeNS(XLINK_NS,'xlink:href',value);

封装函数

将创建标签及添加属性的操作封闭成一个函数,方便复用

function createTag(tag,objAttr){
 var oTag = document.createElementNS('http://www.w3.org/2000/svg',tag);
  for(var attr in objAttr){
  if(attr == 'xlink:href'){
   oTag.setAttributeNS("http://www.w3.org/1999/xlink",attr,objAttr[attr]);
  }else{
   oTag.setAttribute(attr,objAttr[attr]);
  }  
  } 
 return oTag;
}

下面通过该函数,创建一个圆形

<script>
function createTag(tag,objAttr){
 var oTag = document.createElementNS('http://www.w3.org/2000/svg',tag);
  for(var attr in objAttr){
  if(attr == 'xlink:href'){
   oTag.setAttributeNS("http://www.w3.org/1999/xlink",attr,objAttr[attr]);
  }else{
   oTag.setAttribute(attr,objAttr[attr]);
  }  
  } 
 return oTag;
} 
var oSvg = createTag('svg',{'version':'1.1','xmls':'http://www.w3.org/2000/svg',height:'70'});
var oCircle = createTag('circle',{'cx':'25','cy':'25','r':20,'fill':'pink'});
oSvg.appendChild(oCircle);
document.body.appendChild(oSvg);
</script>

实例

下面通过SVG基本操作API,创建一个可交互的SVG实例

<style>
#box{
 height: 300px;
 width: 300px;
 background: hsl(20,40%,90%);
 background-image:linear-gradient(90deg,#fb3 11px,transparent 0),
 linear-gradient(90deg,#ab4 23px,transparent 0),
 linear-gradient(90deg,#655 41px,transparent 0);
 background-size: 41px 100%,61px 100%,83px 100%; 
} 
</style>
<div id="box"></div>
<script>
var oSvg = createTag('svg',{'version':'1.1','xmls':'http://www.w3.org/2000/svg',height:'100%',width:'100%'});
var oBox = document.getElementById('box');
var W = parseInt(getComputedStyle(oBox).width);
var H = parseInt(getComputedStyle(oBox).height);
var appearance = {
 'dis':H/3,
 'r0':H/8,'r':H/10,
 'x0':W/2,'y0':H/2,
 'fontSize':H/20,
 'bg0':'hsla(0,0%,100%,.6)','bg':'hsla(0,0%,100%,.3)',
 'color0':'hsl(210,13%,30%)','color':'hsl(210,13%,30%)',
 'borderColor0':'rgba(0,0,0,0.3)','bordercolor':'rgba(0,0,0,0.3)',
 'strokWidth0':3,'strokWidth':2,
 'lineColor':'rgba(0,0,0,0.3)','lineWidth':1,'lineDashed':'5,5'
}
var data = {
 text:'前端开发',
 children:[
  {text:'HTML',url:'http://www.cnblogs.com/xiaohuochai/p/5203223.html'},
  {text:'CSS',url:'http://www.cnblogs.com/xiaohuochai/p/5249139.html'},
  {text:'JS',url:'http://www.cnblogs.com/xiaohuochai/p/5613593.html'},
  {text:'ES6',url:'http://www.cnblogs.com/xiaohuochai/p/7233392.html'},
  {text:'HTTP',url:'http://www.cnblogs.com/xiaohuochai/p/6392010.html'},
  {text:'NodeJS',url:'http://www.cnblogs.com/xiaohuochai/p/6940560.html'},
  {text:'前端工具',url:'http://www.cnblogs.com/xiaohuochai/p/6666415.html'},
 ], 
}
addChildenTags();
addCenterTag();
oBox.appendChild(oSvg);
function createTag(tag,objAttr){
 var oTag = document.createElementNS('http://www.w3.org/2000/svg',tag);
  for(var attr in objAttr){
  if(attr == 'xlink:href'){
   oTag.setAttributeNS("http://www.w3.org/1999/xlink",attr,objAttr[attr]);
  }else{
   oTag.setAttribute(attr,objAttr[attr]);
  }  
  } 
 return oTag;
} 
function addCenterTag(){
 var oG = createTag('g',{'style':'cursor:default'});
 var oCircle = createTag('circle',{'cx':appearance.x0,'cy':appearance.y0,'r':appearance.r0,'fill':appearance.bg0,'stroke':appearance.borderColor0,'stroke-width':appearance.strokWidth0});
 var oText = createTag('text',{'x':appearance.x0,'y':appearance.y0,'font-size':appearance.fontSize,'text-anchor':'middle','dominant-baseline':'middle','stroke-width':appearance.strokWidth0});
 oText.innerHTML = data.text;
 oG.appendChild(oCircle);
 oG.appendChild(oText);
 oSvg.appendChild(oG);
}
function addChildenTags(){
 var children = data.children;
 var length = children.length;
 var deg = (360/length)*(2*Math.PI)/360;
 for(var i = 0; i < children.length;i++){
  var cos = Math.cos(deg*i - 90);
  var sin = Math.sin(deg*i - 90);
  var x = appearance.x0 + appearance.dis*cos;
  var y = appearance.y0 + appearance.dis*sin;
  var oA = createTag('a',{'xlink:href':children[i].url,'target':'_black'}); 
  var oG = createTag('g',{'style':'cursor:pointer'}); 
  oG.index = i;    
  var oLine = createTag('line',{'x1':x-appearance.r*cos,y1:y-appearance.r*sin,x2:appearance.x0+appearance.r0*cos,y2:appearance.y0+appearance.r0*sin,'stroke':appearance.lineColor,'stroke-width':appearance.lineWidth,'stroke-dasharray':appearance.lineDashed,'style':'transition:.5s'});
  var oLineHelper = createTag('line',{'x1':x-appearance.r*cos,y1:y-appearance.r*sin,x2:appearance.x0+appearance.r0*cos,y2:appearance.y0+appearance.r0*sin,'stroke':'transparent','stroke-width':10});  
  var oCircle = createTag('circle',{'cx':x,'cy':y,'r':appearance.r,'fill':appearance.bg,'stroke':appearance.bordercolor,'stroke-width':appearance.strokWidth,'class':'frostedglass'});
  var oText = createTag('text',{'x':x,'y':y,'font-size':appearance.fontSize,'text-anchor':'middle','dominant-baseline':'middle','stroke-width':appearance.strokWidth,fill:appearance.color});
  oText.innerHTML = children[i].text; 
  oG.appendChild(oLine);
  oG.appendChild(oLineHelper);   
  oG.appendChild(oCircle);     
  oG.appendChild(oText);
  oA.appendChild(oG);
  oSvg.appendChild(oA);
  oG.onmouseenter = function(){
   elasticMove(this,appearance.r*1.2);
   var line = this.children[0];
   line.removeAttribute('stroke-dasharray');
   line.setAttribute('stroke-width',appearance.lineWidth*3);
   line.setAttribute('x1',appearance.x0+(appearance.dis - appearance.r0)*Math.cos(deg*this.index - 90));
   line.setAttribute('y1',appearance.y0+(appearance.dis - appearance.r0)*Math.sin(deg*this.index - 90));
  }
  oG.onmouseleave = function(){
   elasticMove(this,appearance.r);
   var line = this.children[0];
   line.setAttribute('stroke-width',appearance.lineWidth);
   line.setAttribute('stroke-dasharray',appearance.lineDashed);
   line.setAttribute('x1',appearance.x0+(appearance.dis - appearance.r)*Math.cos(deg*this.index - 90));
   line.setAttribute('y1',appearance.y0+(appearance.dis - appearance.r)*Math.sin(deg*this.index - 90));   
  }   
 }
}
function elasticMove(obj,str){
 var circle = obj.getElementsByTagName('circle')[0];
 var r0 = circle.getAttribute('r');
 var r = Number(str);
 //声明步长值
 var step = 0;
 //声明弹性距离
 var len = r - r0;
 //声明弹性系数
 var k = 0.7;
 //声明损耗系数
 var z= 0.7;
 //声明当前值
 var cur = r0;
 clearInterval(circle.timer);
 circle.timer = setInterval(function(){
  //获取当前值cur
  cur = circle.getAttribute('r');
  //更新弹性距离
  len = r - cur;
  //弹力影响
  step += len*k;
  //阻力影响
  step = step*z;
  //赋值
  circle.setAttribute('r',Number(cur) + step);
  //当元素的步长值接近于0,并且弹性距离接近于0时,停止定时器
  if(Math.round(step) == 0 && Math.round(len) == 0){
   circle.setAttribute('r',r);
   clearInterval(circle.timer); 
  } 
 },30);
}
</script>

以上这篇使用SVG基本操作API的实例讲解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery实用代码片段集合
Aug 12 Javascript
Javascript new关键字的玄机 以及其它
Aug 25 Javascript
基于jquery的$.ajax async使用
Oct 19 Javascript
js中单引号与双引号冲突问题解决方法
Oct 04 Javascript
javascript随机将第一个dom中的图片添加到第二个div中示例
Oct 08 Javascript
JQuery ztree 异步加载实例讲解
Feb 25 Javascript
JavaScript中windows.open()、windows.close()方法详解
Jul 28 Javascript
jQuery插件HighCharts绘制简单2D折线图效果示例【附demo源码】
Mar 21 jQuery
Vue利用canvas实现移动端手写板的方法
May 03 Javascript
layui中的switch开关实现方法
Sep 03 Javascript
Vue移动端项目实现使用手机预览调试操作
Jul 18 Javascript
jquery插件懒加载的示例
Oct 24 jQuery
JSON 数据格式详解
Sep 13 #Javascript
JS库 Highlightjs 添加代码行号的实现代码
Sep 13 #Javascript
详解动画插件wow.js的使用方法
Sep 13 #Javascript
JS库之Highlight.js的用法详解
Sep 13 #Javascript
详解wow.js中各种特效对应的类名
Sep 13 #Javascript
强大的JavaScript响应式图表Chartist.js的使用
Sep 13 #Javascript
JS库之Waypoints的用法详解
Sep 13 #Javascript
You might like
Php中文件下载功能实现超详细流程分析
2012/06/13 PHP
php检查字符串中是否包含7位GSM字符的方法
2015/03/17 PHP
php实现图片等比例缩放代码
2015/07/23 PHP
PHP的RSA加密解密方法以及开发接口使用
2018/02/11 PHP
js null,undefined,字符串小结
2010/08/21 Javascript
关闭页面window.location事件未执行的原因及解决方法
2014/09/01 Javascript
node.js中的fs.truncateSync方法使用说明
2014/12/15 Javascript
Javascript实现可旋转的圆圈实例代码
2015/08/04 Javascript
关于JavaScript的单双引号嵌套问题
2017/08/20 Javascript
浅谈Vue数据绑定的原理
2018/01/08 Javascript
vue-router 组件复用问题详解
2018/01/22 Javascript
Vue 路由切换时页面内容没有重新加载的解决方法
2018/09/01 Javascript
ajax与jsonp的区别及用法
2018/10/16 Javascript
nodejs搭建本地服务器并访问文件操作示例
2019/05/11 NodeJs
koa router 多文件引入的方法示例
2019/05/22 Javascript
JavaScript实现单英文金山打字通
2020/07/24 Javascript
Vue中错误图片的处理的实现代码
2019/11/07 Javascript
js中关于Blob对象的介绍与使用
2019/11/29 Javascript
JS运算符简单用法示例
2020/01/19 Javascript
python字符串连接方式汇总
2014/08/21 Python
python异常触发及自定义异常类解析
2019/08/06 Python
pytorch ImageFolder的覆写实例
2020/02/20 Python
如何基于python实现年会抽奖工具
2020/10/20 Python
Willer台湾:日本高速巴士/夜行巴士预约
2017/07/09 全球购物
建筑工程管理专业自荐信范文
2013/12/28 职场文书
经济管理专业毕业生自荐信范文
2014/01/02 职场文书
大学生活动策划方案
2014/02/10 职场文书
幼儿园消防演练方案
2014/02/13 职场文书
出纳员的岗位职责
2014/02/22 职场文书
《我不是最弱小的》教学反思
2014/02/23 职场文书
吃空饷专项治理工作实施方案
2014/03/04 职场文书
年度考核自我鉴定
2014/03/19 职场文书
业务内勤岗位职责
2014/04/30 职场文书
幼儿园教师节演讲稿
2014/09/03 职场文书
企业培训简报范文
2015/07/20 职场文书
任命书格式范文
2015/09/22 职场文书