本文主要阐述使用js实现思维导图的关键技术点,如果还不知道什么是思维导图的同学,请自行度娘。以下是demo和源码的传送门:
demo:http://sources.ikeepstudying.com/mindmaptree-master/
源码:http://github.com/RockyRen/mindmaptree/tree/master
在源码中我使用了svg绘制思维导图。与canvas相比,svg将图像当成对象,我们可将思维导图中节点和线等图形表现为对象,而且svg更适合用于动态交互的应用
下面介绍几个关键技术点:
子节点位置的重绘
一个基本的思维导图工具应该拥有增加节点和删除节点的功能。在某个节点上增删节点时,为了使得所有子节点的高度相对于该节点垂直居中,都会重新渲染子节点的垂直位置。
如图1所示,首先求得父节点的中心点F的坐标为(hfx, hfy),设父节点与子节点的水平距离为interval,父节点的宽为parentWidth。作水平线段FC,C点的横坐标即为子节点的横坐标childX。如下图所示:
为 了让子节点间垂直隔开,每一个子节点上下都有补白,所以一个子节点所占的区域高度为该子节点的节点高度加上两个补白高度。迭代所有子节点,求取所有子节 点的区域高度areaHeight,然后在线段FC的C点上作一条长度为areaHeight的垂直平分线AB,所有子节点的垂直区域都在垂直平分线AB 内,这样可以保证所有子节点的高度相对于该节点垂直居中。如下图所示:
我 们需要求得每一个子节点的垂直坐标childY。首先求得A点的垂直坐标startY = hfy – areaHeight / 2,第一个子节点的垂直坐标由startY加padding可得。求第二个子节点的垂直坐标时,startY累加上一个子节点的区域高度,则第二个子节点 的垂直坐标等于当前startY加上padding。之后的子节点通过迭代相同的操作可得。在每一轮迭代中,根据求得的子节点坐标(childX, childY)渲染节点的位置。如下图所示:
实现代码如下:
/ 以下变量请自行求得 var hfx, // 父节点的中心x轴坐标 hfy, // 父节点的中心y轴坐标 parentWidth, // 父节点的宽度 children, // 子节点列表 padding, // 子节点垂直间距 interval; // 节点间水平间距 var childX, // 子节点的x轴坐标 startY, // 子节点区域的起始坐标 childrenAreaHeight = 0; // 子节点总区域高度 childX = hfx + parentWidth / 2 + interval; // 迭代子节点,求得子节点总区域高度 children.forEach(function(child){ var curAreaHeight = getNodeHeight(child) + padding * 2; childrenAreaHeight += curAreaHeight; }); startY = hfy - childrenAreaHeight / 2; // 迭代子节点,求得每个子节点的垂直坐标 children.forEach(function(child){ var childY = startY + padding; // 已经求得当前子节点坐标(childX, childY),在这里作渲染操作 var curAreaHeight = getNodeHeight(child) + padding * 2; startY += curAreaHeight; // 其实高度累加 }); /** * 获取节点的高度 */ function getNodeHeight(){ // ... }
祖先节点的同级节点的垂直位置调整
如下图所示,当增加一个节点时,该节点父节点的同级节点需要被“撑开”:设该节点的1/2区域高度为moveY,在父节点的同级节点中,比父节点高的向上 偏移一个moveY,比父节点低的向下偏移一个moveY。父节点的父节点的同级节点也做相同的处理,一直递归到根节点为止。当删除一个节点时,节点的父 节点的同级节点会被“压低”,“压低”操作和上述操作相似。注意,当增加第一个子节点和删除最后一个子节点时,不会进行“撑开”和“压低”操作。
实现源码如下:
/** * 调整当前的父节点的同级节点的位置 * @param node 当前的父节点, 以下为该节点需要用到的属性 * node.father: 节点的父节点,为null时表示父节点为根节点 * node.children: 节点的子节点列表 * node.x: 节点的x轴坐标 * node.y: 节点的y轴坐标 * * @oaram areaHeight 被操作节点的区域高度 */ function resetBrotherPosition(node, areaHeight){ var brother, // 同级节点 moveY = areaHeight / 2; // 需要移动的高度 if(node.father){ node.father.children.forEach(function(curNode){ // 遍历同级节点 if(curNode != node){ if(brother.y < node.y){ // 向上移动brother节点的代码写在这 } else { // 向下移动brother节点的代码写在这 } } } ); } // 递归父节点 if(node.father){ resetBrotherPosition(node.father, areaHeight); } }
拖动节点
当拖动根节点时,通过改变svg的视口坐标来实现拖动整个思维导图的效果。当拖动
非根节点时,会按顺序触发mouseup、mousemove、mousedown三个事件,分别对应按下鼠标、鼠标移动和放下鼠标三个状态。在按下鼠标 状态下,会以当前节点为原型克隆一个节点用于占位。在拖动鼠标状态下,通过改变节点的坐标实现节点位置的改变。在放下鼠标状态下,会判断当前节点是否与其 他节点重叠,如果重叠则使重叠节点变为当前节点的父节点,否则,当前节点返回原来的位置。
其他技术点我就不一一列出来了,有兴趣的同学可以到上面的传送门看看源码。
转自:使用js实现思维导图
相关推荐
在信息技术日益发达的今天,思维导图作为一种有效的信息组织工具,受到了广泛的关注和使用。它可以帮助我们清晰地梳理思路,提高工作效率,尤其是在项目管理、学习笔记、问题解决等方面。今天我们要介绍的是一款基于...
【材料】:d3.js的API思维导图,图片形式 【介绍】 D3js 是一个可以基于数据来操作文档的 JavaScript 库。可以帮助你使用 HTML, CSS, SVG 以及 Canvas 来展示数据。D3 遵循现有的 Web 标准,可以不需要其他任何框架...
基于d3.js实现的思维导图。针对自己需求对原作进行了部分修改_vue2-mindmap
在本文中,我们将深入探讨如何使用ECharts这个强大的JavaScript数据可视化库来自定义绘制思维导图。ECharts是由百度开发的一个开源项目,它提供了丰富的图表类型,强大的交互功能,以及良好的性能,使得开发者能够...
总的来说,实现网页思维导图需要结合XML的结构化数据存储、前端JavaScript库的动态渲染以及良好的用户交互设计。通过这样的方式,我们可以为用户提供一个直观、易用的在线思维导图工具,帮助他们更好地组织思维、...
【材料】:d3.js的模块的思维导图,图片形式 【介绍】 D3js 是一个可以基于数据来操作文档的 JavaScript 库。可以帮助你使用 HTML, CSS, SVG 以及 Canvas 来展示数据。D3 遵循现有的 Web 标准,可以不需要其他任何...
这个“基于html5_canvas 实现的简单思维导图制作工具 支持自由放置节点和自由关联节点.zip”压缩包文件包含了一个使用HTML5 Canvas API构建的思维导图编辑器项目,名为“JsMind-master”。让我们深入了解一下这个...
通过这份“h5和js等思维导图”,学习者可以清晰地看到这些技术的关系、概念和应用场景,从而更好地学习和掌握HTML5、JavaScript以及相关框架如AngularJS的基础知识和进阶技巧。在实际项目中,结合这些技术,开发者...
在这个“echarts树形思维导图”实例中,我们将重点探讨如何使用ECharts 2.x版本创建一个交互式的树形结构来展示数据关系。 在ECharts 2.x版本中,树形图是一个非常实用的图表类型,用于展示数据之间的层级关系。与...
最新的vue2.0思维导图,包括生命周期、数据双向绑定、vuex、路由等vue常用的插件。
本思维导图将深入探讨JS的基础知识点,帮助初学者构建全面的JavaScript知识体系。 1. 变量与数据类型: JavaScript有六种基本数据类型:Undefined、Null、Boolean、Number、String和Symbol(ES6新增),以及一种...
使用JavaScript思维导图插件的益处: 1. **易用性**:用户可以通过简单的拖放操作添加、删除和重新排列节点,使得思维导图的创建直观且快速。 2. **实时协作**:在Web应用中集成后,多人可以同时编辑同一张思维导图...
内容概要:思维导图涵盖知识包括HTML+CSS+Javascript+H5C3+响应式web设计+Bootstrap,每个模块包括基础知识点,还有一些注意点,介绍仔细,某些知识点会有图解,代码,以及本人学习过程的笔记。 适合人群: 比较...
这份"JS思维导图.zip"包含了对JavaScript关键概念的图形化总结,帮助我们系统地理解和掌握这门语言。以下是对每个文件名所对应知识点的详细解读: 1. **运算符.gif** JavaScript提供了多种运算符,包括算术运算符...
这份"js基础思维导图.rar"包含了JS基础知识的详细梳理,是学习者理解和掌握JavaScript核心概念的重要辅助工具。 首先,JavaScript的基础部分包括变量、数据类型和作用域。变量用于存储数据,可以使用var、let或...
本案例聚焦于如何将服务端提供的二叉树数据结构转化为D3.js能够理解的JSON数组格式,以便实现思维导图的展示。在实际应用中,二叉树是一种常见的数据结构,它由节点组成,每个节点有两个子节点,通常表示为左子节点...
本系列资源主要是针对jQuery的相关知识点做一个类似提纲似的提炼,画出了一个十分完整的jQuery思维导图,一来可以作为今后温故知新的参照;二来也是希望能够帮助大家更加系统清晰的理解jQuery这门语言。欢迎下载
这份"javascript 思维导图.zip"压缩包显然包含了有关JavaScript的各种API使用方法的详细信息,旨在帮助开发者更好地理解和记忆JavaScript的核心概念及功能。 在JavaScript中,API(应用程序编程接口)是一组预定义...
思维导图又称之为脑图 他大概是这个样子滴: 网上大部分实现有用d3.js实现,有手动用svg实现,最近工作需要,本人很懒,在琢磨看看用css3能不能实现呢? 答案是肯定的 下面上代码 html代码 <h1>node1 <h1>...
在本思维导图中,我们将会探讨以下几个关键知识点: 1. **Spring MVC**:Spring MVC是Spring框架的一个模块,专门用于构建Web应用程序。它遵循Model-View-Controller设计模式,提供了处理HTTP请求、数据绑定、视图...