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实现图片无间断轮播效果
Aug 25 HTML / CSS
HTML+CSS3 模仿Windows7 桌面效果
Jun 17 HTML / CSS
使用简单的CSS3属性实现炫酷读者墙效果
Jan 08 HTML / CSS
html5的localstorage详解
May 09 HTML / CSS
canvas实现俄罗斯方块的方法示例
Dec 13 HTML / CSS
基于 HTML5 Canvas实现 的交互式地铁线路图
Mar 05 HTML / CSS
HTML5离线缓存在tomcat下部署可实现图片flash等离线浏览
Dec 13 HTML / CSS
html5设计原理(推荐收藏)
May 17 HTML / CSS
用HTML5 实现橡皮擦的涂抹效果的教程
May 11 HTML / CSS
基于HTML5 Canvas的3D动态Chart图表的示例
Nov 02 HTML / CSS
css3实现背景图片颜色修改的多种方式
Apr 13 HTML / CSS
使用HBuilder制作一个简单的HTML5网页
Jul 07 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 无线电
PHP Curl出现403错误的解决办法
2014/05/29 PHP
ThinkPHP之M方法实例详解
2014/06/20 PHP
PHP+redis实现添加处理投票的方法
2015/11/14 PHP
常用PHP数组排序函数归纳
2016/08/08 PHP
PHP goto语句用法实例
2019/08/06 PHP
JavaScript 设计模式学习 Singleton
2009/07/27 Javascript
javascript处理table表格的代码
2010/12/06 Javascript
基于jQuery的history历史记录插件
2010/12/11 Javascript
javascript实现一个简单的弹出窗
2016/02/22 Javascript
避免jQuery名字冲突 noConflict()方法
2016/07/30 Javascript
JS验证图片格式和大小并预览的简单实例
2016/10/11 Javascript
jquery对象和DOM对象的相互转换详解
2016/10/18 Javascript
原生JS轮播图插件
2017/02/09 Javascript
vue使用中的内存泄漏【推荐】
2018/07/10 Javascript
ES6 class的应用实例分析
2019/06/27 Javascript
浅谈vue3中effect与computed的亲密关系
2019/10/10 Javascript
Vue的Eslint配置文件eslintrc.js说明与规则介绍
2020/02/03 Javascript
实例说明Python中比较运算符的使用
2015/05/13 Python
python实现带声音的摩斯码翻译实现方法
2015/05/20 Python
python计算一个序列的平均值的方法
2015/07/11 Python
python 编写简单网页服务器的实例
2018/06/01 Python
python hbase读取数据发送kafka的方法
2018/12/27 Python
对Python w和w+权限的区别详解
2019/01/23 Python
Python3 实现文件批量重命名示例代码
2019/06/03 Python
python Shapely使用指南详解
2020/02/18 Python
使用tensorflow根据输入更改tensor shape
2020/06/23 Python
CSS3 对过渡(transition)进行调速以及延时
2020/10/21 HTML / CSS
css3实现平移效果(transfrom:translate)的示例
2020/11/13 HTML / CSS
C#如何进行LDAP用户校验
2012/11/21 面试题
大学生职业生涯规划书
2014/03/14 职场文书
《风娃娃》教学反思
2014/04/19 职场文书
乡镇党的群众路线教育实践活动剖析材料
2014/10/09 职场文书
财务工作失职检讨书
2014/11/21 职场文书
2016暑期师德培训心得体会
2016/01/09 职场文书
记一次Mysql不走日期字段索引的原因小结
2021/10/24 MySQL