1.理解HTML5 Canvas
Canvas在HTML5里就是一块画布,用它就能用代码(大部分用JavaScript)画出各种你想要的图形,比如线啦、矩形啦、圆。这个功能挺厉害的,能实现不少有趣的互动效果。今天咱就一起来学习如何用HTML5 Canvas画个二级树状图!其实就是把左边列表上的东西拖到右边画成个有意思的关系树呗。
2.绘制二级树形结构图
在搞定二级树状结构图前,先搞清楚怎么用Canvas画图。用JS代码,把Canvas元素拿到手,随心所欲地在上面涂鸦。说到这个二级树状结构图,还得琢磨下怎么画出节点间的那根“筋”以及如何表现好每个节点。有点像设计师安排家具的感觉,要计算得当、布局合理,才能让整体看起来清爽又好看。
3.解决Canvas宽高限制
有时候,Canvas画布的尺寸不够大,放不下那么多的节点啦~别担心,让我来告诉你怎么处理这个小麻烦!只需要用一种叫做「动态计算画布大小」的技巧,就可以在绘制图形之前先根据节点的数量和位置,设定Canvas画布合适的尺寸哦~这样一来,就算是包含好几百个节点、需要画出成千上万条线的情况也能轻松搞定!
4.实现拖拽功能
除了画图,文章还提了个有意思的点——左面板能直接拖动到右面去。就像玩游戏那样,动手动脚就行了,而且屏幕里的东西会即时变化。用简单明了的 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 = $(''); $('.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} }
。
评论0