使用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 相关文章推荐
$()JS小技巧
Jul 21 Javascript
jquery实现通用版鼠标经过淡入淡出效果
Jun 15 Javascript
完美实现bootstrap分页查询
Dec 09 Javascript
详解Javascript继承的实现
Mar 25 Javascript
JavaScript 判断一个对象{}是否为空对象的简单方法
Oct 09 Javascript
JS DOMReady事件的六种实现方法总结
Nov 23 Javascript
Angular2 组件通信的实例代码
Jun 23 Javascript
js实现会跳动的日历效果(完整实例)
Oct 18 Javascript
微信小程序实现的日期午别医生排班表功能示例
Jan 09 Javascript
vue动态路由:路由参数改变,视图不更新问题的解决
Nov 05 Javascript
vue搜索页开发实例代码详解(热门搜索,历史搜索,淘宝接口演示)
Apr 11 Javascript
Vue包大小优化的实现(从1.72M到94K)
Feb 18 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
MySQL连接数超过限制的解决方法
2011/07/17 PHP
如何使用jQuery+PHP+MySQL来实现一个在线测试项目
2015/04/26 PHP
php写入txt乱码的解决方法
2019/09/17 PHP
Visual Studio中的jQuery智能提示设置方法
2010/03/27 Javascript
ExtJs GridPanel简单的增删改实现代码
2010/08/26 Javascript
通过JS动态创建一个html DOM元素并显示
2014/10/15 Javascript
jQuery中eq()方法用法实例
2015/01/05 Javascript
实例详解JSON数据格式及json格式数据域字符串相互转换
2016/01/07 Javascript
JS实现把鼠标放到链接上出现滚动文字的方法
2016/04/06 Javascript
动态更新highcharts数据的实现方法
2016/05/28 Javascript
JS基于HTML5的canvas标签实现炫目的色相球动画效果实例
2016/08/24 Javascript
JS中数组重排序方法
2016/11/11 Javascript
微信小程序 弹窗自定义实例代码
2017/03/08 Javascript
详解Web使用webpack构建前端项目
2017/09/23 Javascript
ES6学习笔记之map、set与数组、对象的对比
2018/03/01 Javascript
JS中注入eval, Function等系统函数截获动态代码
2019/04/03 Javascript
微信小程序 bindtap 传参的实例代码
2020/02/21 Javascript
基于javascript处理nginx请求过程详解
2020/07/07 Javascript
[02:41]DOTA2英雄基础教程 亚巴顿
2014/01/02 DOTA
Python导入oracle数据的方法
2015/07/10 Python
Python调用百度根据经纬度查询地址的示例代码
2019/07/07 Python
python3中rank函数的用法
2019/11/27 Python
使用python 的matplotlib 画轨道实例
2020/01/19 Python
Pycharm plot独立窗口显示的操作
2020/12/11 Python
Python非单向递归函数如何返回全部结果
2020/12/18 Python
如何查找和删除数据库中的重复数据
2014/11/05 面试题
室内设计专业学生的自我评价分享
2013/11/27 职场文书
操行评语大全
2014/04/30 职场文书
学校花圃的标语
2014/06/18 职场文书
怎样写离婚协议书
2014/09/10 职场文书
2014年保险公司工作总结
2014/11/22 职场文书
2014年行政后勤工作总结
2014/12/06 职场文书
求职自荐信怎么写
2015/03/04 职场文书
入党积极分子考察意见
2015/06/02 职场文书
2016年清明节寄语
2015/12/04 职场文书
大学社团活动总结怎么写
2019/06/21 职场文书