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的项目,大家各自在本地进行开发,将自己的工作贡献到我们的团队项目中.为了便于审核,我希望大家先将自己的贡献先放在属于自己的一个分支上 ...
随机推荐
- Visual Studio2019+OpenCV3.4.9环境搭建
让人头疼的vs2019+opencv环境配置 准备: visual studio2019: opencv 3.4.9: 耐心: 说明:vs2019属性管理器没有Microsoft.Cpp.x64.us ...
- Springcloud config + zuul 搭建动态网关
1,实现的效果,就是zuul 网关的配置路由实现负载均衡,zuul 的配置文件放在springcloud config 上 2,需要的服务如下: 3,其实就是配置下springcloud-zuul 的 ...
- Spring中应用的那些设计模式
设计模式作为工作学习中的枕边书,却时常处于勤说不用的尴尬境地,也不是我们时常忘记,只是一直没有记忆. 今天,我们就设计模式的内在价值做一番探讨,并以spring为例进行讲解,只有领略了其设计的思想理念 ...
- Codeforces 1329C - Drazil Likes Heap(堆+贪心)
题目链接 题意 给出一个高度为 h 的大根堆, 要求弹出其中若干个数后高度变为 g, 并且前后大根堆都是满二叉树. 问新的大根堆所有数之和的最小值, 并要给出一种弹出数的操作序列(节点序号). h, ...
- python字典(dict)
1.字典dict定义 初始化 key-value键值对的数据的集合,可变.无序.key不重复(哈希.唯一) 1> d = dict() 或者 d = {} # -*- coding:utf-8 ...
- JS 剑指Offer(五) 二叉树的重建
题目:输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 题目分析:已知二叉树的前序和中序遍历,根据前序遍历和中序遍历的规则,前序遍历的第一 ...
- scikit_learn分类器详解
1 分类 分类是将事物按特性进行分类,例如将手写数字图片分类为对应的数字. 1.1 MINIST数字图片集分类 MINST就是一个70000张规格较小的手写数字图片,如何将他们分类为对应 ...
- html+css实现图片或元素的垂直、水平同时居中的多种方法
实现元素或图片的上下.左右居中的三种方法 效果图如下: 方法一:利用vertical-align属性实现图片上下居中 先设置父元素样式text-align: center,实现图片左右居中,给图片添加 ...
- 惊呆了!不改一行 Java 代码竟然就能轻松解决敏感信息加解密|原创
前言 出于安全考虑,现需要将数据库的中敏感信息加密存储到数据库中,但是正常业务交互还是需要使用明文数据,所以查询返回我们还需要经过相应的解密才能返回给调用方. ps:日常开发中,我们要有一定的安全意识 ...
- linux下使用笔记本的相关设置
目录 无线连接 Wi-Fi 蓝牙 触摸板 电源管理 电源管理工具 电源相关行为的响应动作 按键和盖子的响应动作 电池低电量的响应动作 处理器调整 调频工具 关闭睿频 intel_pstate 休眠配置 ...