Echarts:实现拖拽效果

Posted youyouluo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Echarts:实现拖拽效果相关的知识,希望对你有一定的参考价值。

  1 <!DOCTYPE html>
  2 <html>
  3 <head>
  4   <meta charset="utf-8">
  5   <script src="./echarts.js"></script>
  6 </head>
  7 <body>
  8   <div id="myChart" style="width: 800px; height: 600px;"></div>
  9 
 10 <script type="text/javascript">
 11   var chart = echarts.init(document.getElementById(myChart));
 12 
 13   var originData = [
 14     value: 335, name: 直接访问,
 15     value: 310, name: 邮件营销,
 16     value: 234, name: 联盟广告,
 17     value: 135, name: 视频广告,
 18     value: 1548, name: 搜索引擎,
 19   ];
 20 
 21   var color = [#4a6dbf, #15b3bc, #f37a18, #83c775,  #fcb552];
 22 
 23   originData.forEach(function(list, i) 
 24     list.itemStyle = 
 25       color: color[i],
 26     ;
 27   );
 28 
 29   var data = [].slice.call(originData)
 30 
 31   var option = 
 32     tooltip: 
 33     ,
 34     toolbox: 
 35       feature: 
 36         myRestore: 
 37           show: true,
 38           title: 还原,
 39           icon: M3.8,33.4 M47,18.9h9.8V8.7 M56.3,20.1 C52.1,9,40.5,0.6,26.8,2.1C12.6,3.7,1.6,16.2,2.1,30.6 M13,41.1H3.1v10.2 M3.7,39.9c4.2,11.1,15.8,19.5,29.5,18 c14.2-1.6,25.2-14.1,24.7-28.5,
 40           onclick: refreshChart,
 41         ,
 42       ,
 43     ,
 44     legend:   // 图例
 45       icon: rect,
 46       data: [],
 47       itemWidth: 12,
 48       itemHeight: 12,
 49       bottom: bottom,
 50     ,
 51     grid: 
 52       top: 5%,
 53       left: 5%,
 54       right: 5%,
 55       bottom: 40,
 56       containLabel: true,
 57     ,
 58     xAxis: 
 59       type: category,
 60       boundaryGap: true,
 61       splitLine:   // grid上每一条竖轴线
 62         show: true,
 63         interval: auto,
 64         lineStyle: 
 65           color: #e8e8e8,
 66         ,
 67       ,
 68       axisLine:   // x刻度上方的横轴线
 69         lineStyle: 
 70           color: #e8e8e8,
 71         ,
 72       ,
 73       axisLabel:   // x轴的刻度
 74         textStyle: 
 75           color: #999,
 76         ,
 77       ,
 78       data: [],
 79     ,
 80     yAxis: 
 81       type: value,
 82       boundaryGap: false,
 83       axisLine:   // y刻度上方的横轴线
 84         lineStyle: 
 85           color: #e8e8e8,
 86         ,
 87       ,
 88       splitLine:   // grid上每一条竖轴线
 89         lineStyle: 
 90           color: #e8e8e8,
 91         ,
 92       ,
 93       axisLabel:   // y轴的刻度
 94         textStyle: 
 95           color: #999,
 96         ,
 97       ,
 98     ,
 99     series: [
100       name: pie,
101       type: pie,
102       center: [50%, 45%],
103       radius: [0, 45%],
104       data: data,
105     , 
106       name: 模拟一个pie容器,
107       type: pie,
108       center: [50%, 45%],
109       radius: [0, 49%],
110       cursor: default,
111       hoverAnimation: true,
112       hoverOffset: 2,
113       label: 
114         show: false,
115       ,
116       labelLine: 
117         show: false,
118       ,
119       tooltip: 
120         padding: 0,
121         formatter: function() 
122           return ‘‘;
123         ,
124       ,
125       z: 0,
126       data: [
127         value: 0,
128         name: 容器,
129         itemStyle: 
130           color: #000,
131           opacity: .1,
132         ,
133       ],
134     ],
135   ;
136 
137   chart.setOption(option, true);
138 
139   var sector = null;  // 鼠标点击选中的扇形
140   var sectorIndex;  // 选中扇形在data中的index
141   var sx;  // 原型横坐标距离鼠标位置横坐标的偏移距离
142   var sy;  // 原型纵坐标距离鼠标位置纵坐标的偏移距离
143   var zr = chart.getZr();  // 生成一个zrender实例
144   var circleData = null;  // 记录鼠标选中的小圆点的数据
145   var circleEl = [];  // 保存生成的小圆点的数据,注意目前只有push,没有将废数据清除
146 
147   function refreshChart() 
148     data = [].slice.call(originData)
149     option.series = 
150       name: pie,
151       type: pie,
152       center: [50%, 45%],
153       radius: [0, 45%],
154       data: data,
155     ;
156 
157     circleEl.forEach(function(list) 
158       zr.remove(list.el);
159     );
160     // zr.clear();  // clear会把整个chart画布清除
161     sector = null;
162     chart.setOption(option, true);
163   
164 
165   // chart.on 绑定的事件只能在chart图形内部执行
166   // 利用chart绑定的事件会比zrender绑定的事件先执行的特点来判断小圆是否进入饼图范围
167   chart.on(mouseup, function(params) 
168     if (params.componentSubType === pie) 
169       //
170       if (circleData) 
171         data.push(circleData.data);
172         chart.setOption(
173           series: 
174             data: data,
175           
176         );
177         zr.remove(circleData.el);
178         circleData = null;
179       
180 
181       // 扇形
182       if (sector) 
183         zr.remove(sector);
184         sector = null;
185       
186     
187   );
188 
189   zr.on(mousedown, function(e) 
190     // 如果出现:触发鼠标点击扇形事件,并且移动到echarts的DOM元素外,释放鼠标点击,
191     // 再移动到饼图内,点击鼠标,则会再次触发一个鼠标点击和释放事件,这时候,上一个选中的扇形不会被正确的移除
192     // 所以在mosuedown多一个对sector的判定
193     if (e.target && sector) 
194       zr.remove(sector);
195       sector = null;
196     
197     if (e.topTarget) 
198       // 这个是pie容器
199       if (e.target && e.target.seriesIndex === 1) 
200         return;
201       
202 
203       // 发现一个圆
204       circleEl.forEach(function(list) 
205         if (list.id === e.topTarget.id) 
206           circleData = list;
207         
208       );
209 
210       // 是一个扇形
211       if (!circleData && e.target && !e.target.__title) 
212         var target = e.target;
213         sectorIndex = target.dataIndex;
214         sector = new echarts.graphic.Sector(
215           shape: echarts.util.extend(, target.shape),
216           style: 
217             fill: target.style.fill,
218             opacity: 0.5
219           ,
220           silent: true,
221           z: 1000,
222         );
223 
224         sx = e.offsetX - target.shape.cx;
225         sy = e.offsetY - target.shape.cy;
226 
227         zr.add(sector);
228 
229       
230     
231   );
232 
233   zr.on(mousemove, function (e) 
234     if (circleData) 
235       circleData.el.setShape(
236         cx: e.offsetX,
237         cy: e.offsetY,
238       );
239      else if (sector) 
240       sector.setShape(
241         cx: e.offsetX - sx,
242         cy: e.offsetY - sy,
243       );
244 
245       chart.dispatchAction(
246         type: showTip,
247         seriesIndex: 0,
248         dataIndex: sectorIndex,
249         position: [e.offsetX + 24, e.offsetY + 24],  // 加24是为了避免tip影响mouseup事件判定
250       );
251     
252   );
253 
254   zr.on(mouseup, function(e) 
255     if (circleData) 
256       circleData = null;
257      if (sector) 
258       var circle = new echarts.graphic.Circle(
259         shape: 
260           cx: e.offsetX,
261           cy: e.offsetY,
262           r: 10,
263         ,
264         style: 
265           text: data[sectorIndex].name +  + data[sectorIndex].value,
266           textFill: sector.style.fill,
267           fill: sector.style.fill,
268           textOffset: [0, -20],
269         ,
270         silent: true,
271         z: 1000,
272       );
273       zr.add(circle);
274       circleEl.push(
275         id: e.topTarget.id + 1,
276         el: circle,
277         data: data[sectorIndex],
278       );
279 
280       data.splice(sectorIndex, 1);
281       chart.setOption(
282         series: 
283           data: data,
284         
285       );
286 
287       zr.remove(sector);
288       sector = null;
289     
290   );
291 </script>
292 </body>
293 </html>

这个是一年前工作里用到,莫名翻了出来。

以上是关于Echarts:实现拖拽效果的主要内容,如果未能解决你的问题,请参考以下文章

echarts怎么动态添加多条柱形图

使用echarts实现一个可拖拽缩放的立体地图

使用react-grid-layout和echarts-for-react实现一个支持拖拽的自定义响应式dashboard页面

使用react-grid-layout和echarts-for-react实现一个支持拖拽的自定义响应式dashboard页面

echarts地图搭配饼图怎样实现

Echarts 柱状图横向排版颜色渐变---实现效果详解(vue+Echarts实现)