所有分类
  • 所有分类
  • 后端开发
画出你的创意:HTML5 Canvas二级树状图绘制攻略

画出你的创意:HTML5 Canvas二级树状图绘制攻略

这篇文章主要介绍了html5利用canvas绘画二级树形结构图的示例的相关资料,非常具有实用价值,需要的朋友可以参考下看了设计图,第一反应是用canvas绘制关系线。js主要用到了拖拽、canvas绘制。

1.理解HTML5 Canvas

Canvas在HTML5里就是一块画布,用它就能用代码(大部分用JavaScript)画出各种你想要的图形,比如线啦、矩形啦、圆。这个功能挺厉害的,能实现不少有趣的互动效果。今天咱就一起来学习如何用HTML5 Canvas画个二级树状图!其实就是把左边列表上的东西拖到右边画成个有意思的关系树呗。

2.绘制二级树形结构图

在搞定二级树状结构图前,先搞清楚怎么用Canvas画图。用JS代码,把Canvas元素拿到手,随心所欲地在上面涂鸦。说到这个二级树状结构图,还得琢磨下怎么画出节点间的那根“筋”以及如何表现好每个节点。有点像设计师安排家具的感觉,要计算得当、布局合理,才能让整体看起来清爽又好看。

3.解决Canvas宽高限制

画出你的创意:HTML5 Canvas二级树状图绘制攻略

有时候,Canvas画布的尺寸不够大,放不下那么多的节点啦~别担心,让我来告诉你怎么处理这个小麻烦!只需要用一种叫做「动态计算画布大小」的技巧,就可以在绘制图形之前先根据节点的数量和位置,设定Canvas画布合适的尺寸哦~这样一来,就算是包含好几百个节点、需要画出成千上万条线的情况也能轻松搞定!

4.实现拖拽功能

画出你的创意:HTML5 Canvas二级树状图绘制攻略

除了画图,文章还提了个有意思的点——左面板能直接拖动到右面去。就像玩游戏那样,动手动脚就行了,而且屏幕里的东西会即时变化。用简单明了的 JavaScript 码子,就能实现那个拖拽功能,再加上画图的应用,整个页面变得生动有趣起来。

5.学习菜鸟教程

这篇文章里,我跟你说,我就是看着菜鸟教程学习,然后自创了那么一招拖拽法。这个菜鸟教程,是个很好用的技术学习网站,它把复杂的东西讲得特简单明了,让新手也能很快掌握各种技术。学完菜鸟教程,你不光能学到点儿真本事,关键是以后遇到什么开发上的难题,你都能轻松搞定!

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 = '

' + data + '

'; $('.main-target-wrap').width('auto').append(_html); } function dropToRelate(ev) { //画关系线 drawLineOne(document.getElementById('canvasOne'), 'begin'); drawLineOne(document.getElementById('canvasTwo'), 'end'); //插入图片 以及图片初始化点击事件 var _img = $('画出你的创意:HTML5 Canvas二级树状图绘制攻略'); $('.imgBox').append(_img); _img.click(showRelationBox); //写入数据 var data = ev.dataTransfer.getData('Text'); var _html = '

' + data + '

'; $('.relation-text-box').append(_html); }

6.总结与展望

通过这个活生生的例子,我搞懂了Canvas在前端开发中有啥用,学会了怎么用它做出酷炫的东西。而且,处理Canvas大小限制和做拖拽效果也都是能从中学到很多干货的地方。将来,只要多学多练,就有可能把这个功能做得更好,并且用到更多的项目里去!

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}
}

原文链接:https://www.icz.com/technicalinformation/web/vue2/2024/04/13014.html,转载请注明出处~~~
0

评论0

请先
注意:请收藏好网址www.icz.com,防止失联!站内免费资源持续上传中…!赞助我们
显示验证码
没有账号?注册  忘记密码?