JQ+echarts实现可拖动节点的折线图(支持拖动方向设置-仅上下、仅左右、坐标轴内自由拖动)

翻遍全网没有一个在现在还用jq+echarts做可视化的了,在结合官网和相关vue项目的基础上,制作了jq 和 echarts的可拖动节点的折线图,废话不多说,上代码。

var names = ["参考负荷","预测负荷"];
	data = pdata_;//预测负荷
	xdata = xdata_;//x轴数据
	var symbolSize = 8;
	myChart.clear();
	let option = {
		color : ["#ece70b","#ff0101"],
		title: [{
	        text: title,
	        top : '4%',
	        left: '1%',
	        textStyle: {
	        	color: '#B3E6FC',
	            fontWeight:'lighter'
	        }
	    }],
		tooltip: {
			order: 'valueDesc',
			trigger: 'axis',
			// triggerOn: 'none',
			// formatter: function (params) {
			// 	return (
			// 		names[0] + ":" + params.data[0].toFixed(2) +
			// 		'<br>'+ names[1] + ":" + params.data[1].toFixed(2)
			// 	);
			// }
		},
		toolbox: {
			left: 'right',
			itemSize: 18,
			top: 10,
			show: true,
			feature: {
				dataZoom: {
					// yAxisIndex: 'none'
				},
				restore: {show: false},
				saveAsImage: {
					show: true,
					title: '保存图片',
					excludeComponents: ['toolbox'], //保存时忽略工具栏
					pixelRatio: 1, // 下载后放大的倍数
					type: 'jpeg',
				}
			}
		},
		legend : { /* 图例属性设置 */
			data : names,
			left : '40%', /*位置可以是|left:'left'|left:'1%'|x:'left'|x:'1%'|*/
			top : '4%',
			textStyle : {
				color : '#B3E6FC',
				fontSize : 16
			}
		},
		grid : { /* 数据网格属性 */
			left : '1%',
			right : '1%',
			bottom : '5%',
			containLabel : true
		},
		xAxis : {
			type : 'category',
			boundaryGap : false,
			data : xdata,
			axisLine : {
				onZero : false,
				lineStyle : {
					color : '#B3E6FC'
				}
			}
		},
		yAxis : {
			type : 'value',
			min : miniVal,
			max : maxVal,
			// splitNumber : 20,// Y轴间隔
			axisTick: {show:true},
			axisLine : {
				show:true,
				onZero : true,
				lineStyle : {
					color : '#B3E6FC'
				},
			},
			splitLine : {
				show : false
			// 显示y网格线
			}
		},
		dataZoom: [{ // 缩放功能
			type: 'inside',
			orient: 'vertical',
			start: 0,
			end: 100,
			filterMode: 'none',
		}, {
			show: false,// 是否显示缩放滚动条
			// type : 'slider',
			type: 'inside',
			y: '96%',
			height: 10,
			start: 0,
			end: 100,
			filterMode: 'none',
		}],
		series : [{
			/*参考负荷数据*/
			name : names[0],//sites[0]
			type : 'line',
			smooth : false,
			symbolSize : 2, // 折线节点大小
			lineStyle : {
				normal : {
					width : 1.2,// 线宽
				}
			},
			data : hdata_
		},
			//预测负荷数据
		{
			id : 'a',
			name : names[1],
			type : 'line',
			smooth : false,
			symbolSize : symbolSize, // 折线节点大小
			lineStyle : {
				normal : {
					width : 1.5,// 线宽
				}
			},
			data : data
		}],
	};
	setTimeout(function () {
		// Add shadow circles (which is not visible) to enable drag.
		myChart.setOption({
			graphic: data.map(function (item, dataIndex) {
				return {
					// 'circle' 表示这个 graphic element 的类型是圆点
					type: 'circle',
					position: myChart.convertToPixel('grid', item),  // 这里使用了 convertToPixel 这个 API 来得到每个圆点的位置
					shape: {
						cx: 0,
						cy: 0,
						// 圆点的半径
						r: symbolSize / 2
					},
					// 这个属性让圆点不可见(但是不影响他响应鼠标事件)
					invisible: true,
					// 这个属性让圆点可以被拖拽
					draggable: true,
					ondrag: function (dx, dy) {
						onPointDragging(dataIndex, [this.x, this.y]);
					},
					onmousemove: function () {
						showTooltip(dataIndex);
					},
					onmouseout: function () {
						hideTooltip(dataIndex);
					},
					// 把 z 值设得比较大,表示这个圆点在最上方,能覆盖住已有的折线图的圆点
					z: 100,
				};
			})
		});
	}, 0);
	window.addEventListener('resize', updatePosition);
	myChart.on('dataZoom', updatePosition);
	function updatePosition() {
		myChart.setOption({
			graphic: data.map(function (item, dataIndex) {
				return {
					position: myChart.convertToPixel('grid', item)
				};
			})
		});
	}
	function showTooltip(dataIndex) {
		myChart.dispatchAction({
			type: 'showTip',
			seriesIndex: 0,
			dataIndex: dataIndex
		});
	}
	function hideTooltip(dataIndex) {
		myChart.dispatchAction({
			type: 'hideTip'
		});
	}
	function onPointDragging(dataIndex, pos) {
		let origin = myChart.convertToPixel('grid', data[dataIndex]);
		pos[0] = origin[0]; // 控制每个点位只能在y轴方向移动
		// pos[1] = origin[1]; // 控制每个点位只能在X轴方向移动
		data[dataIndex] = myChart.convertFromPixel('grid', pos);
		console.log('aaaa',data[dataIndex])
		// Update data
		myChart.setOption({
			series: [
				{
					id: 'a',
					data: data,
				}
			]
		});
	}

	option && myChart.setOption(option);

对了,jq,echarts相关版本附上

<script src="js/echarts-5.4.1.min.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>

在前端开发中,可以使用JavaScriptjQuery(简称jq)配合一些交互插件来实现节点的拖拽功能,并将其放置到预设的九宫格布局中。以下是基本步骤: 1. **引入jQuery** 和适合拖拽的插件,如`jquery-ui draggable` 或者第三方库 `Sortable`。 ```html <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> <link rel="stylesheet" href="https://code.jquery.com/ui/1.13.1/themes/base/jquery-ui.css"> <script src="https://code.jquery.com/ui/1.13.1/jquery-ui.js"></script> ``` 2. **创建九宫格容器**,通常是HTML结构,每个格子可以是`div`元素,给它们设定固定大小和ID以便后续操作。 ```html <div id="grid-container"> <div class="cell" id="cell-1">...</div> <!-- 其他8个cell... --> </div> ``` 3. **初始化拖拽事件**。利用`.draggable()` 方法让需要拖动节点拖动,并设置目标容器(在这里是九宫格容器)作为drop区。 ```javascript $('.cell').draggable({ snap: ".cell", // 拖动元素会自动对齐到网格的其他单元格 revert: true, // 拖放后自动恢复原位 helper: 'clone', // 创建拖动的克隆副本 }); ``` 4. **监听drop事件**,当节点被拖放到某个特定位置时,判断其是否位于九宫格的正确区域,并更新其位置。 ```javascript $('#grid-container').droppable({ drop: function(event, ui) { var droppedItem = $(ui.draggable), cellId = $(this).attr('id'); if (validateCellPosition(cellId)) { // 验证是否在九宫格内 droppedItem.appendTo($(this)); } } }); function validateCellPosition(cellId) { // 根据实际九宫格布局计算逻辑 } ``` 5. **定义`validateCellPosition`函数**,检查拖动节点(`droppedItem`)应插入的位置是否有效。这通常涉及数学计算,比如将`cellId`映射到对应的行和列索引。 注意这只是一个基本框架,实际应用可能需要根据具体的九宫格设计进行调整。此外,你还可以考虑添加动画效果,防止节点重叠等。如果你有更多关于这个功能的具体问题,欢迎提问!
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值