视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
使用SVG基本操作API的实例讲解
2020-11-27 22:30:21 责编:小采
文档

前面的话

本文将详细介绍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/66615.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的实例讲解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

下载本文
显示全文
专题