使用SVG基本操作API的实例讲解
程序员文章站
2022-04-29 07:51:17
前面的话
本文将详细介绍svg基本操作api,并使用这些api制作实例效果
基础api
在javascript中,可以使用一些基本的api来对svg进行操作
【ns...
前面的话
本文将详细介绍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的实例讲解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
上一篇: 推荐VSCode 上特别好用的 Vue 插件之vetur
下一篇: 微信小程序之蓝牙的链接