html5利用canvas绘画二级树形结构图的示例


Posted in HTML / CSS onSeptember 27, 2017

上周需要做一个把页面左侧列表内容拖拽到右侧区域,并且绘制成关系树的功能。

看了设计图,第一反应是用canvas绘制关系线。

吭哧吭哧搞定这个功能后,发现用canvas绘图,有一个很严重的缺陷。那就是如果左侧关系特别多,需要绘制成百上千条时,而canvas画布的宽高在写dom的时候就已声明。关系很多的情况下,无法使用canvas。

不过还是记录一下研究成果。

下面是设计图:

html5利用canvas绘画二级树形结构图的示例

做出效果如下:

html5利用canvas绘画二级树形结构图的示例

html、css代码就不贴了。 js主要用到了拖拽、canvas绘制。

function startDrag(ev) {
    ev.dataTransfer.setData("Text",ev.target.innerText);
}

function allowDrop(ev) {
    ev.preventDefault();
}

function decideDrop(ev) {
    ev.preventDefault();
    var length = $('.main-target').length;
    if(length == 0){
        dropToMain(ev);
    }else {
        dropToRelate(ev);
    }
}

function dropToMain(ev) {
    var data=ev.dataTransfer.getData("Text");
    var _html = '<div class="main-target">' + data + '</div>';
    $('.main-target-wrap').width('auto').append(_html);
}

function dropToRelate(ev) {
    //画关系线
    drawLineOne(document.getElementById('canvasOne'), 'begin');
    drawLineOne(document.getElementById('canvasTwo'), 'end');

    //插入图片 以及图片初始化点击事件
    var _img = $('<img src="inner.png">');
    $('.imgBox').append(_img);
    _img.click(showRelationBox);
    //写入数据
    var data = ev.dataTransfer.getData('Text');
    var _html = '<div class="item-text">' + data + '</div>';
    $('.relation-text-box').append(_html);
}

以上是拖拽的方法,我也是一边看菜鸟教程,一边写出的拖拽方法。

function drawLineOne(canvas, flag) {
    var context = canvas.getContext('2d');
    var position = {};
    if(flag == "begin"){
        position = getCanvasOnePosition();
    }else {
        position = getCanvasTwoPosition();
    }
    context.beginPath();
    context.moveTo(position.beginX, position.beginY);
    context.lineTo(position.endX, position.endY);
    if(position.endX2 && position.endY2){
        context.lineTo(position.endX2, position.endY2);
    }
    context.strokeStyle = "#333";
    context.stroke();
}

/**
 * 左侧关系线
 * @returns {{beginX: *, beginY: *, endX: *, endY: *}}
 */
function getCanvasOnePosition() {
    var imgLength = $('.imgBox img').length;
    var beginX = (imgLength == 0) ? 0 : 77,
        beginY = (imgLength == 0) ? 15 : (15 + 60 * (imgLength-1)),
        endX = (imgLength == 0) ? 155 : 77,
        endY = 60*imgLength + 15;
    var position = {beginX: beginX, beginY: beginY, endX: endX, endY: endY};
    if(imgLength > 0){
        position.endX2 = 155;
        position.endY2 = endY;
    }
    return position;
}

function getCanvasTwoPosition() {
    var imgLength = $('.imgBox img').length;
    var endY = 15 + 60*imgLength
    return {beginX: 0, beginY: endY, endX: 155, endY: endY}
}

以上是canvas画线的方法,代码没什么难点,主要就是分析线的起始坐标麻烦一些。希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

HTML / CSS 相关文章推荐
使用CSS3实现字体颜色渐变的实现
Mar 09 HTML / CSS
CSS3轻松实现清新 Loading 效果的简单实例
Jun 06 HTML / CSS
HTML+CSS3+JS 实现的下拉菜单
Nov 25 HTML / CSS
html5 canvas 画图教程案例分析
Nov 23 HTML / CSS
谈一谈HTML5本地存储技术
Mar 02 HTML / CSS
关于h5中的fetch方法解读(小结)
Nov 15 HTML / CSS
HTML5 解决苹果手机不能自动播放音乐问题
Dec 27 HTML / CSS
Html5页面中的返回实现的方法
Feb 26 HTML / CSS
解决HTML5中的audio在手机端和微信端的不能自动播放问题
Nov 04 HTML / CSS
iframe跨域的几种常用方法
Nov 11 HTML / CSS
AmazeUI 评论列表的实现示例
Aug 13 HTML / CSS
浅谈CSS不规则边框的生成方案
May 25 HTML / CSS
html5新增的定时器requestAnimationFrame实现进度条功能
Dec 13 #HTML / CSS
详解使用HTML5的classList属性操作CSS类
Oct 13 #HTML / CSS
HTML5网页音乐播放器的示例代码
Nov 09 #HTML / CSS
js实现移动端H5页面手指滑动刻度尺功能
Nov 16 #HTML / CSS
HTML5实现视频直播功能思路详解
Nov 16 #HTML / CSS
基于HTML5 Canvas 实现商场监控实例详解
Nov 20 #HTML / CSS
微信浏览器左上角返回按钮拦截功能
Nov 21 #HTML / CSS
You might like
PHP中的串行化变量和序列化对象
2006/09/05 PHP
php实现图片转换成ASCII码的方法
2015/04/03 PHP
完美解决在ThinkPHP控制器中命名空间的问题
2017/05/05 PHP
javaScript parseInt字符转化为数字函数使用小结
2009/11/05 Javascript
Jquery中getJSON在asp.net中的使用说明
2011/03/10 Javascript
jQuery UI AutoComplete 使用说明
2011/06/20 Javascript
jQuery效果 slideToggle() 方法(在隐藏和显示之间切换)
2011/06/28 Javascript
判定是否原生方法的JS代码
2013/11/12 Javascript
Extjs grid添加一个图片状态或者按钮的方法
2014/04/03 Javascript
TypeScript具有的几个不同特质
2015/04/07 Javascript
分享自己用JS做的扫雷小游戏
2016/02/17 Javascript
jQuery的图片轮播插件PgwSlideshow使用详解
2016/08/11 Javascript
jQuery实现为LI列表前3行设置样式的方法【2种方法】
2016/09/04 Javascript
Vue.js render方法使用详解
2017/04/05 Javascript
浅析Angular19 自定义表单控件
2018/01/31 Javascript
JavaScript实现的DOM绘制柱状图效果示例
2018/08/08 Javascript
解决Vue.js由于延时显示了{{message}}引用界面的问题
2018/08/25 Javascript
详解IOS微信上Vue单页面应用JSSDK签名失败解决方案
2018/11/14 Javascript
JS图片懒加载技术实现过程解析
2020/07/27 Javascript
linux系统使用python监控apache服务器进程脚本分享
2014/01/15 Python
python列表操作实例
2015/01/14 Python
python实现的jpg格式图片修复代码
2015/04/21 Python
如何使用Python实现斐波那契数列
2019/07/02 Python
python3在同一行内输入n个数并用列表保存的例子
2019/07/20 Python
爬虫代理池Python3WebSpider源代码测试过程解析
2019/12/20 Python
Python中常用的高阶函数实例详解
2020/02/21 Python
Python如何获取文件指定行的内容
2020/05/27 Python
django使用channels实现通信的示例
2020/10/19 Python
使用Python Tkinter实现剪刀石头布小游戏功能
2020/10/23 Python
消防安全责任书范本
2014/04/15 职场文书
工程材料采购方案
2014/05/18 职场文书
2014年法院工作总结
2014/11/24 职场文书
检讨书范文2000字
2015/01/28 职场文书
商务信函英语问候语
2015/11/10 职场文书
详解JS数组方法
2021/11/20 Javascript
Win11 Beta 22621.601 和 22622.601今日发布 KB5017384修复内容汇总
2022/09/23 数码科技