echarts实现关系图节点拖拽整理

前言:

echarts关系图节点拖拽,百度谷歌查个遍,不是缺斤就是少两,没有能实现的要不就是答不对题,包括github上,没看到官方有回答这方面问题的,不知道暂时实现不了还是这个问题太简单不愿意回答。stop,开始实现

一、echarts中关系图(graph)的节点,实现拖拽不回弹

1.页面引入echarts.js。

2.html部分代码

<div id="main" style="width:100%;height:800px;"></div>

3.js部分代码

var graph={  //这是数据项目中一般都是获取到的
      nodes:[
 {"id":"0","name":"id0","attributes":{"modularity_class":4}},
 {"id":"1","name":"id1","attributes":{"modularity_class":0}},
{"id":"2","name":"id2","attributes":{"modularity_class":1}},
{"id":"3","name":"id3","attributes":{"modularity_class":2}}
      ],
links:[
{"id":"0","source":"0","target":"1"},
{"id":"1","source":"0","target":"2"},
{"id":"2","source":"0","target":"3"},
]
}
 var myChart = echarts.init(document.getElementById('main'));
var categories=[
            {
                id:0,
                name: '手机',
                itemStyle:{normal:{color:'#c23531'}},
                symbolSize:[42,42]
            },
            {
                id:1,
                name: 'QQ',
                itemStyle:{normal:{color:'#61a0a8'}},
                symbolSize:[42,42]
            },
            {
                id:2,
                name:'微信',
                itemStyle:{normal:{color:'#749f83'}},
                symbolSize:[42,42]
            },
            {
                id:3,
                name:'微博',
                itemStyle:{normal:{color:'#d48265'}},
                symbolSize:[42,42]
            },
            {
                id:4,
                name: ' ',
                itemStyle:{normal:{color:'#2E3F4C'}},
                symbolSize:[64,64]
            }
        ];
var winWidth=document.body.clientWidth;
var winHeight=document.body.clientHeight;
graph.nodes.forEach(function (node) {
             node.x=parseInt(Math.random()*1000);  //这里是最重要的如果数据中有返回节点x,y位置这里就不用设置,如果没有这里一定要设置node.x和node.y,不然无法定位节点 也实现不了拖拽了;
             node.y=parseInt(Math.random()*1000);
            if(node.attributes.modularity_class != 4){
                node.symbolSize=[42,42];
                node.sizeFlag=[42,42];
            }else{
                node.symbolSize=[64,64];
                node.sizeFlag=[64,64];
            }
            node.category = node.attributes.modularity_class;
            node.label={
                normal:{
                    show:true
                }
            }
        });
var option = {    //这里是option配置
            legend: [{    //图例组件
                data: categories.map(function (a) {
                    return a.name;
                }),
                top:0,
                left:(winWidth-1300)/2,         //这里是图例组件定位使用的,自定义
                itemGap:26,
                textStyle:{
                    padding:[0,12]
                },
                backgroundColor:'#f5f5f5'
            }],
            animationDurationUpdate: 1500,
            animationEasingUpdate: 'quinticInOut',
            series : [
                {
                    type: 'graph',
                    layout: 'none',           //因为节点的位置已经有了就不用在这里使用布局了
                    circular:{rotateLabel:true},
                    animation: false,
                    data: graph.nodes,
                    links: graph.links,
                    categories: categories,   //节点分类的类目
                    roam: true,   //添加缩放和移动
                    draggable: false,   //注意这里设置为false,不然拖拽鼠标和节点有偏移
                    label: {
                        normal: {
                            position: 'bottom',
                            rich:{
                                bg:{
                                    backgroundColor: '#f5f5f5'
                                }
                            }
                        }
                    }
                }
            ]
        };
myChart.setOption(option);  
initInvisibleGraphic() ;
function initInvisibleGraphic() {
            // Add shadow circles (which is not visible) to enable drag.
            myChart.setOption({
                graphic: echarts.util.map(option.series[0].data, function (item, dataIndex) {  
 //使用图形元素组件在节点上划出一个隐形的图形覆盖住节点
                    var tmpPos=myChart.convertToPixel({'seriesIndex': 0},[item.x,item.y]);
                    return {
                        type: 'circle',
                        id:dataIndex,
                        position: tmpPos,
                        shape: {
                            cx: 0,
                            cy: 0,
                            r: 20
                        },
                        // silent:true,
                        invisible: true,
                        draggable: true,
                        ondrag: echarts.util.curry(onPointDragging, dataIndex),
                        z: 100              //使图层在最高层
                    };
                })
            });
            window.addEventListener('resize', updatePosition);
            myChart.on('dataZoom', updatePosition);
        }
myChart.on('graphRoam', updatePosition);
 function updatePosition() {    //更新节点定位的函数
            myChart.setOption({
                graphic: echarts.util.map(option.series[0].data, function (item, dataIndex) {
                    var tmpPos=myChart.convertToPixel({'seriesIndex': 0},[item.x,item.y]);
                    return {
                        position: tmpPos
                    };
                })
            });

        }
function onPointDragging(dataIndex) {      //节点上图层拖拽执行的函数
            var tmpPos=myChart.convertFromPixel({'seriesIndex': 0},this.position);
            option.series[0].data[dataIndex].x = tmpPos[0];
            option.series[0].data[dataIndex].y = tmpPos[1];
            myChart.setOption(option);
            updatePosition();
        }

以上代码粘贴下去,并根据自己项目简单修改添加一些配置,就ok了,拖拽轻松解决

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342