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教程(4):网页边框和网页文字阴影
Apr 02 HTML / CSS
CSS3基础(RGBa、text-shadow、box-shadow、border-radius)
Nov 13 HTML / CSS
css3学习心得分享
Aug 19 HTML / CSS
css3教程之倾斜页面
Jan 27 HTML / CSS
css3实现input输入框颜色渐变发光效果代码
Apr 02 HTML / CSS
css3 border旋转时的动画应用
Jan 22 HTML / CSS
CSS3 3D酷炫立方体变换动画的实现
Mar 26 HTML / CSS
CSS实现雨滴动画效果的实例代码
Oct 08 HTML / CSS
HTML5 placeholder(空白提示)属性介绍
Aug 07 HTML / CSS
如何利用input事件来监听移动端的输入
Apr 15 HTML / CSS
HTML5在线预览PDF的示例代码
Sep 14 HTML / CSS
css3实现背景图片颜色修改的多种方式
Apr 13 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程序占用多少内存(memory_get_usage)
2012/09/23 PHP
php轻松实现中英文混排字符串截取
2014/05/28 PHP
php常用字符串处理函数实例分析
2014/11/22 PHP
php数组生成html下拉列表的方法
2015/07/20 PHP
使用PHP生成图片的缩略图的方法
2015/08/18 PHP
js 屏蔽鼠标右键脚本附破解方法
2009/12/03 Javascript
js 鼠标移动显示图片的简单实例
2013/12/25 Javascript
jquery事件的ready()方法使用详解
2015/11/11 Javascript
js获取页面及个元素高度、宽度的代码
2016/04/26 Javascript
angular.js之路由的选择方法
2016/09/24 Javascript
一篇文章搞定JavaScript类型转换(面试常见)
2017/01/21 Javascript
解决vue中修改export default中脚本报一大堆错的问题
2018/08/27 Javascript
深入浅析Vue中mixin和extend的区别和使用场景
2019/08/01 Javascript
NodeJS有难度的面试题(能答对几个)
2019/10/09 NodeJs
vue el-table实现行内编辑功能
2019/12/11 Javascript
JS数组方法join()用法实例分析
2020/01/18 Javascript
jQuery加PHP实现图片上传并提交的示例代码
2020/07/16 jQuery
Python实现保证只能运行一个脚本实例
2015/06/24 Python
Python爬虫获取整个站点中的所有外部链接代码示例
2017/12/26 Python
Python 在字符串中加入变量的实例讲解
2018/05/02 Python
python验证码识别教程之滑动验证码
2018/06/04 Python
python实现旋转和水平翻转的方法
2018/10/25 Python
详解python使用turtle库来画一朵花
2019/03/21 Python
tensorflow中tf.slice和tf.gather切片函数的使用
2020/01/19 Python
详解android与HTML混合开发总结
2018/06/06 HTML / CSS
EM Cosmetics官网:由彩妆大神Michelle Phan创办的独立品牌
2020/04/27 全球购物
保洁主管岗位职责
2013/11/20 职场文书
外贸业务员工作职责
2014/01/06 职场文书
员工工作表扬信范文
2014/01/13 职场文书
初中体育教学反思
2014/01/14 职场文书
会计专业个人自我鉴定
2014/03/21 职场文书
启动仪式策划方案
2014/06/14 职场文书
作风转变心得体会
2014/09/02 职场文书
主持人大赛开场白
2015/05/29 职场文书
母婴行业实体、电商模式全面解析
2019/08/01 职场文书
HTML基础-标签分类(闭合标签,空标签,块级元素,行内元素,行级块元素,可替换元素)
2021/03/31 HTML / CSS