使用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 相关文章推荐
javascript将数组插入到另一个数组中的代码
Jan 10 Javascript
基于jQuery中对数组进行操作的方法
Apr 16 Javascript
javascript面向对象之this关键词用法分析
Jan 13 Javascript
jquery制做精致的倒计时特效
Jun 13 Javascript
JavaScript实现多栏目切换效果
Dec 12 Javascript
基于vue.js实现侧边菜单栏
Mar 20 Javascript
详解Next.js页面渲染的优化方案
Jan 27 Javascript
javascript的this关键字详解
May 20 Javascript
24行JavaScript代码实现Redux的方法实例
Nov 17 Javascript
node.js中module模块的功能理解与用法实例分析
Feb 14 Javascript
全局安装 Vue cli3 和 继续使用 Vue-cli2.x操作
Sep 08 Javascript
解决Vue+SpringBoot+Shiro跨域问题
Jun 09 Vue.js
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 $_FILES函数详解
2011/03/09 PHP
PHP实现按之字形顺序打印二叉树的方法
2018/01/16 PHP
PHP For循环字母A-Z当超过26个字母时输出AA,AB,AC
2020/02/16 PHP
javascript &amp;&amp;和||运算法的另类使用技巧
2009/11/28 Javascript
jQuery easyui datagrid动态查询数据实例讲解
2013/02/26 Javascript
基于jquery的9行js轻松实现tab控件示例
2013/10/12 Javascript
让table变成exls的示例代码
2014/03/24 Javascript
浅析基于WEB前端页面的页面内容搜索的实现思路
2014/06/10 Javascript
Javascript前端UI框架Kit使用指南之kitjs的对话框组件
2014/11/28 Javascript
JavaScript时间转换处理函数
2015/04/14 Javascript
js拆分字符串并将分割的数据放到数组中的方法
2015/05/06 Javascript
php 修改密码实现代码
2017/05/24 Javascript
关于Vue Webpack2单元测试示例详解
2017/08/14 Javascript
turn.js异步加载实现翻书效果
2019/07/25 Javascript
JavaScript多种图形实现代码实例
2020/06/28 Javascript
[04:20]DOTA2-DPC中国联赛 正赛 VG vs LBZS 选手采访 1月19日
2021/03/11 DOTA
python中元类用法实例
2014/10/10 Python
Python封装shell命令实例分析
2015/05/05 Python
python在Windows下安装setuptools(easy_install工具)步骤详解
2016/07/01 Python
Python调用C# Com dll组件实战教程
2017/10/12 Python
python抓取网页中链接的静态图片
2018/01/29 Python
解决pycharm回车之后不能换行或不能缩进的问题
2019/01/16 Python
python 怎样将dataframe中的字符串日期转化为日期的方法
2019/09/26 Python
Python dict和defaultdict使用实例解析
2020/03/12 Python
python实现快速文件格式批量转换的方法
2020/10/16 Python
纯CSS3打造属于自己的“小黄人”
2016/03/14 HTML / CSS
金宝贝童装官网:Gymboree
2016/08/31 全球购物
为什么说Ruby是一种真正的面向对象程序设计语言
2012/10/30 面试题
化工机械应届生求职信
2013/11/04 职场文书
大学毕业通用个人的求职信
2013/12/08 职场文书
反腐倡廉警示教育活动心得体会
2014/09/04 职场文书
南京导游词
2015/02/03 职场文书
志愿者服务活动总结报告
2015/05/06 职场文书
2016应届毕业生就业指导课心得体会
2016/01/15 职场文书
高中化学教学反思
2016/02/22 职场文书
js 实现Material UI点击涟漪效果示例
2022/09/23 Javascript