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教程(1):什么是CSS3
Apr 02 HTML / CSS
CSS3等相关属性制作分页导航实现代码
Dec 24 HTML / CSS
css3 按钮样式简单可扩展创建
Mar 18 HTML / CSS
实现CSS3中的border-radius(边框圆角)示例代码
Jul 19 HTML / CSS
CSS3制作苹果风格键盘特效
Feb 26 HTML / CSS
浅谈CSS3特性查询(Feature Query: @supports)功能简介
Jul 31 HTML / CSS
HTML5 Canvas的事件处理介绍
Apr 24 HTML / CSS
HTML5中的websocket实现直播功能
May 21 HTML / CSS
如何给HTML标签中的文本设置修饰线
Nov 18 HTML / CSS
boostrap modal 闪现问题的解决方法
Sep 01 HTML / CSS
Html5通过数据流方式播放视频的实现
Apr 27 HTML / CSS
flex布局中使用flex-wrap实现换行的项目实践
Jun 21 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
最贵的咖啡是怎么产生的,它的风味怎么样?
2021/03/04 新手入门
Windows下的PHP5.0安装配制详解
2006/09/05 PHP
PHP setTime 设置当前时间的代码
2012/08/27 PHP
php递归法读取目录及文件的方法
2015/01/30 PHP
php截取中文字符串函数实例
2015/02/23 PHP
php格式化电话号码的方法
2015/04/24 PHP
PHP常用技巧汇总
2016/03/04 PHP
Yii2.0 Basic代码中路由链接被转义的处理方法
2016/09/21 PHP
Laravel中基于Artisan View扩展包创建及删除应用视图文件的方法
2016/10/08 PHP
php实现对短信验证码发送次数的限制实例讲解
2021/03/04 PHP
为指定元素增加样式的js代码
2009/12/09 Javascript
Javascript基础知识(三)BOM,DOM总结
2014/09/29 Javascript
JavaScript中获取时间的函数集
2016/08/16 Javascript
el表达式 写入bootstrap表格数据页面的实例代码
2017/01/11 Javascript
.net MVC+Bootstrap下使用localResizeIMG上传图片
2017/04/21 Javascript
ES6中箭头函数的定义与调用方式详解
2017/06/02 Javascript
AngularJS实现进度条功能示例
2017/07/05 Javascript
javascript按顺序加载运行js方法
2017/12/01 Javascript
vue-router相关基础知识及工作原理
2018/03/16 Javascript
NodeJS安装图文教程
2018/04/19 NodeJs
Javascript实现动态时钟效果
2018/11/17 Javascript
[01:38]2018DOTA2亚洲邀请赛主赛事第二日现场采访 神秘商人痛陈生计不易
2018/04/05 DOTA
python正则表达式re模块详细介绍
2014/05/29 Python
python中os模块详解
2016/10/14 Python
Python实现简单的多任务mysql转xml的方法
2017/02/08 Python
Python中摘要算法MD5,SHA1简介及应用实例代码
2018/01/09 Python
Python3如何对urllib和urllib2进行重构
2019/11/25 Python
Python通过2种方法输出带颜色字体
2020/03/02 Python
python实现excel公式格式化的示例代码
2020/12/23 Python
HTML5 Canvas自定义圆角矩形与虚线示例代码
2013/08/02 HTML / CSS
阿里巴巴美国:Alibaba美国
2019/11/24 全球购物
班干部竞选演讲稿
2014/04/24 职场文书
2014年煤矿工作总结
2014/11/24 职场文书
培训师岗位职责
2015/02/14 职场文书
驾驶员管理制度范本
2015/08/06 职场文书
团委副书记工作总结
2015/08/14 职场文书