SVG 案例:动态去创建分支节点,当鼠标经过某个节点时,分支线会高亮
css:
<style>
#div1{ width:780px; height:400px; background:#fff; margin:20px auto; overflow:hidden;}
body{ background:black;}
</style>
html:
<div id="div1"></div>
js:
var svgNS = 'http://www.w3.org/2000/svg';
var oParent = document.getElementById('div1');
var centerX = oParent.offsetWidth/;
var centerY = oParent.offsetHeight/; var circleNum = ;
var angleNum = /circleNum;
var centerR = ;
var otherData = []; for(var i=;i<circleNum;i++){
var y = Math.sin(i**Math.PI/)*centerR + centerY;
var x = Math.cos(i**Math.PI/)*centerR + centerX;
otherData.push({x : x , y : y , text : i});
} var data = {
centerNode : { text : '凤凰网' },
otherNode : otherData
}; function createTag(tag,objAttr){
var oTag = document.createElementNS(svgNS , tag);
for(var attr in objAttr){
oTag.setAttribute(attr , objAttr[attr]);
}
return oTag;
} function addTag(){ var oSvg = createTag('svg',{'xmlns':svgNS,'width':'100%','height':'100%'}); for(var i=;i<data.otherNode.length;i++){
addOtherTag( data.otherNode[i] , oSvg );
} var oG = createTag('g',{'style':'cursor:pointer'});
var oCircle = createTag('circle',{'cx':centerX,'cy':centerY,'r':'','fill':'white','stroke':'red','stroke-width':''});
var oText = createTag('text',{'x':centerX,'y':centerY+,'font-size':'','text-anchor':'middle'});
oText.innerHTML = data.centerNode.text; oG.appendChild(oCircle);
oG.appendChild(oText); oSvg.appendChild(oG);
oParent.appendChild(oSvg);
} addTag(); function addOtherTag(otherAttr , oSvg){ var oG = createTag('g',{'style':'cursor:pointer','class':'lineStyle'});
var oLine1 = createTag('line',{'x1':otherAttr.x,'y1':otherAttr.y,'x2':centerX,'y2':centerY,'stroke':'#ccc'});
var oLine2 = createTag('line',{'x1':otherAttr.x,'y1':otherAttr.y,'x2':centerX,'y2':centerY,'stroke':'transparent','stroke-width':''});
var oRect = createTag('rect',{'x': (otherAttr.x + centerX)/ - ,'y': (otherAttr.y + centerY)/ - ,'fill':'#999','width':'','height':'','rx':''});
var oText = createTag('text',{'x':(otherAttr.x + centerX)/,'y':(otherAttr.y + centerY)/ + ,'fill':'white','font-size':'','text-anchor':'middle'});
oText.innerHTML = '?'; oG.appendChild(oLine1);
oG.appendChild(oLine2);
oG.appendChild(oRect);
oG.appendChild(oText); oSvg.appendChild(oG); var oG = createTag('g',{'style':'cursor:pointer','class':'circleStyle'});
var oCircle = createTag('circle',{'cx':otherAttr.x,'cy':otherAttr.y,'r':'','fill':'white','stroke':'red','stroke-width':''});
var oText = createTag('text',{'x':otherAttr.x,'y':otherAttr.y+,'font-size':'','text-anchor':'middle'});
oText.innerHTML = otherAttr.text; oG.appendChild(oCircle);
oG.appendChild(oText); oSvg.appendChild(oG); } bindTag(); function bindTag(){
var aLine = document.getElementsByClassName('lineStyle');
var aCircle = document.getElementsByClassName('circleStyle'); for(var i=;i<aCircle.length;i++){
aCircle[i].onmouseenter = function(){
startMove( this.getElementsByTagName('circle')[] , , );
var prevLine = this.previousElementSibling;
prevLine.getElementsByTagName('line')[].setAttribute('stroke','blue');
prevLine.getElementsByTagName('rect')[].setAttribute('fill','red'); };
aCircle[i].onmouseleave = function(){
startMove( this.getElementsByTagName('circle')[] , , );
var prevLine = this.previousElementSibling;
prevLine.getElementsByTagName('line')[].setAttribute('stroke','#ccc');
prevLine.getElementsByTagName('rect')[].setAttribute('fill','#999');
};
}
for(var i=;i<aLine.length;i++){
aLine[i].onmouseenter = function(){
this.getElementsByTagName('line')[].setAttribute('stroke','blue');
this.getElementsByTagName('rect')[].setAttribute('fill','red');
var prevCircle = this.nextElementSibling;
startMove( prevCircle.getElementsByTagName('circle')[] , , );
};
aLine[i].onmouseleave = function(){
this.getElementsByTagName('line')[].setAttribute('stroke','#ccc');
this.getElementsByTagName('rect')[].setAttribute('fill','#999');
var prevCircle = this.nextElementSibling;
startMove( prevCircle.getElementsByTagName('circle')[] , , );
};
} } function startMove(obj,r1,r2){
var nowR = r1;
var overR = r2;
obj.speed = ;
clearInterval(obj.timer);
obj.timer = setInterval(function(){ obj.speed += (overR - nowR)/;
obj.speed *= 0.9; if( Math.abs(overR - nowR)<= && Math.abs(obj.speed)<= ){
clearInterval(obj.timer);
obj.setAttribute( 'r' , overR );
}
else{
nowR += obj.speed;
obj.setAttribute( 'r' , nowR );
} },);
}
效果:

SVG 案例:动态去创建分支节点,当鼠标经过某个节点时,分支线会高亮的更多相关文章
- SVG案例:动态去创建元素createElementNS
案例一: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <titl ...
- android studio svn 创建分支
创建分支或标签 从哪里复制 工作副本 用这个变体去创建分支,并带着当地的改变.通常,服务项将被 添加带历史 , 不仅仅只有目标目录. 每个不同于根的版本文件 ,将被指定的复制.它推荐 去更新 工作副本 ...
- svg创建分支
是这样的 我之前的项目上传到svn上一直没有开过分支,今天其中的一个项目改动会比较大,想创建一个分支,在此分支上修改(目的是改动如果比较大,不想影响原来主干上的分支) 首先打开我们的项目存放的文件:右 ...
- SVG的动态之美-搜狗地铁图重构散记
搜狗地图发布了新版的移动端地铁图,改版初衷是为了用户交互体验的提升以及性能的改善.原版地铁图被用户吐槽最多的是pinch缩放不流畅.无过渡动画.拖拽边界不合理等等,大体上都是交互体验上的问题.实际上原 ...
- 速战速决 (5) - PHP: 动态地创建属性和方法, 对象的复制, 对象的比较, 加载指定的文件, 自动加载类文件, 命名空间
[源码下载] 速战速决 (5) - PHP: 动态地创建属性和方法, 对象的复制, 对象的比较, 加载指定的文件, 自动加载类文件, 命名空间 作者:webabcd 介绍速战速决 之 PHP 动态地创 ...
- [原创]gerrit上分支操作记录(创建分支、删除分支)
Git分支对于一个项目的代码管理而言,是十分重要的! 许多久用git的朋友可能已经掌握的很牢固了,但对于一些初涉git的童鞋来说,可能还不是很熟悉. 在此,我将自己的一些操作经历做一梳理,希望能帮助到 ...
- 11_Eclipse中演示Git版本的创建,历史版本的修改,创建分支,合并历史版本和当前版本
1 执行以下案例: 某研发团队2011年初开发了一款名为Apollo的信息系统,目前已发布v1.0版本.此项目初期已有部分基础代码, 研发团队再此基础代码上经过3个月的努力发布了一个功能相对完备 ...
- Gerrit上分支操作记录(创建分支、删除分支)
Git分支对于一个项目的代码管理而言,是十分重要的!许多久用git的朋友可能已经掌握的很牢固了,但对于一些初涉git的童鞋来说,可能还不是很熟悉.在此,我将自己的一些操作经历做一梳理,希望能帮助到有用 ...
- 使用git命令创建分支到团队项目
背景 在我们的团队中,我作为管理者,创建了一个叫HelloWorld的项目,大家各自在本地进行开发,将自己的工作贡献到我们的团队项目中.为了便于审核,我希望大家先将自己的贡献先放在属于自己的一个分支上 ...
随机推荐
- 记一次Metasploit心脏出血漏洞攻击测试
打开msf框架 msfconsole
- 贪心-Bag of Tokens
2020-01-20 22:32:28 问题描述: 问题求解: 双指针 + 贪心. public int bagOfTokensScore(int[] tokens, int P) { Arrays. ...
- pat 1044.火星数字 Java版
个人网站:https://www.lingluan.xyz 火星人是以13进制计数的: 地球人的0被火星人称为tret. 地球人数字1到12的火星文分别为:jan, feb, mar, apr, ma ...
- iphone ios app互相调用
正好要做这个,记录一下 1.ios应用程序间互相启动 2.网页如何调用自己的app http://www.dotblogs.com.tw/yang5664/archive/2012/11/24/850 ...
- [算法笔记] PAT-ADV-1020
题目要求:给出二叉树的后序遍历序列和中序遍历序列,输出二叉树的层次遍历序列. (传送门) Sample Input 7 2 3 1 5 7 6 4 1 2 3 4 5 6 7 Sample Outpu ...
- Transformers 中使用 TorchScript | 四
作者|huggingface 编译|VK 来源|Github 注意:这是我们使用TorchScript进行实验的开始,我们仍在探索可变输入大小模型的功能.它是我们关注的焦点,我们将在即将发布的版本中加 ...
- Java——类的定义
对象和类的关系:有一个学生 ,需要在表格上填写自己的信息 ,那么这个打印机就像一个类 ,打印出的表格就是一个对象,用类创建对象,学生填的信息 ,就是我所初始化的信息. 类的组成:由 属性(也叫成员变量 ...
- CodeForces - 1244D 树(一条链)的染色
题意:给一个无向的无环的树,需要用三种颜色将他染色,相邻的三个点不能有重复的颜色.给出每个点染成每种颜色的花费,求最小的染色花费,如果给的图不能按要求染色,输出-1. 思路:只有三种颜色,相邻三个点还 ...
- ES6中async与await的使用方法
promise的使用方法 promise简介 是异步编程的一种解决方案.从语法上说,Promise 是一个对象,从它可以获取异步操作的消息.解决回调函数嵌套过多的情况 const promise =n ...
- 模块 shutil_zipfile_tarfile压缩解压
shutil_zipfile_tarfile压缩解压 shutil 模块 高级的 文件.文件夹.压缩包 处理模块 shutil.copyfileobj(fsrc, fdst[, length]) #将 ...