Highcharts实现线段两点同步拖拽及区域图透明度独立设置问题
Highcharts线段整体拖拽与透明度控制实现方案
一、线段整体拖拽(禁止端点独立拖动)实现
核心修改逻辑如下:
- 修正全局dragDrop配置的
groupBy参数值为groupId,匹配Highcharts内置属性命名规范 - 点击生成线段时,给两个端点设置相同的
groupId,让拖拽组件识别为同一组元素 - 在点的drag事件中实时同步两个端点的y轴数值,保证两点始终水平对齐,禁止独立拖动
二、area类型图表红色元素透明度独立控制
所有红色元素(线段、标记点)的颜色配置从命名色red替换为rgba格式即可自定义透明度:
- 格式为
rgba(255, 0, 0, 透明度值),透明度取值范围为0~1,数值越低元素越透明 - 可分别为线段本体、标记点填充色设置不同透明度,互不影响
修改后完整代码
var myChart; Highcharts.setOptions({ plotOptions: { series: { animation: false, fillOpacity: 0 }, dragDrop: { draggableX: true, liveRedraw: false, groupBy: 'groupId' // 修正groupId大小写,匹配属性名 }, } }); // draw chart myChart = Highcharts.chart('container', { chart: { type: "area", events: { click: function (e) { // find the clicked values and the series var y = e.yAxis[0].value, x = 11.5, z = 12.5, series = this.series[3].data[11]; // 给两个端点设置相同的groupId series.update({x, y, color: 'rgba(255,0,0,0.6)', groupId: 'dragLine'}); series1 = this.series[3].data[12]; series1.update({z, y, color: 'rgba(255,0,0,0.6)', groupId: 'dragLine'}); }, } }, title: { text: "Series History" }, xAxis: { type: 'category', allowDecimals: true, title: { text: "Quarter" }, plotBands: [{ color: 'rgba(204,153,255,0.2)', // Color value from: 11.5, // Start of the plot band to: 12.5, // End of the plot band label: { text: 'Forecxast' } }] }, yAxis: { title: { text: "Number (%)" }, plotLines: [{ value: 0, width: 2, color: '#aaa', zIndex: 10 }] }, tooltip: { style: { color: 'black', fontWeight: 'bold', fontSize: 15 }, positioner: function () { return { x: 80, y:0 }; }, shared: true, headerFormat: '', pointFormat: '{series.name}: <b>{point.y}%</b><br/>', valueDecimals: 2, shadow: false, borderWidth: 2, borderColor: '#000000', shape: 'rect', backgroundColor: 'rgba(255,255,255,0.8)' }, series: [ { name: 'Series1', data: [3.9,4.98,5.72,5.73,3.61,3.68,3.72,2.64,2.1,1.94,1.99,1.87,null] }, { name: 'Series2', data: [2,3.47,4.2,4.62,4.51,3.079,3.13,3.15,2.43,2.17,1.7,2.17,1] }, { name: 'Your Original Guess', showInLegend: false, data: [null,null,null,null,null,null,null,null,null,null,null,null,2], marker: { radius: 2.5, fillColor: 'rgba(255,0,0,0.6)' // 同样修改透明度 }, }, { dragDrop: { draggableY: true, groupBy: 'groupId', dragMinY: -10, dragMaxY: 10, dragPrecisionY: .01, liveRedraw: false, }, point: { events: { drag: function(e) { if (this.color !== 'rgba(255,0,0,0.6)') { return false; } // 同步另一个端点的y值 const targetIndex = this.index === 11 ? 12 : 11; const anotherPoint = this.series.data[targetIndex]; anotherPoint.update({y: e.newPoint.y}, false); // false表示暂不重绘,提升性能 }, drop: function() { if (this.color !== 'rgba(255,0,0,0.6)') { return false; } myChart.redraw(); // 拖拽结束后统一重绘 }, } }, name: 'Guess Uncertainty, Upper Bound', showInLegend: false, data: [null, null,null, null,null, null,null, null,null, null,null, [11.5,null],[12.5,null]], color: 'rgba(255,0,0,0.6)', // 设置线段透明度 marker: { radius: 2.25, fillColor: 'rgba(255,0,0,0.6)', // 设置标记点透明度 symbol: 'square' }, }, ], });
内容的提问来源于stack exchange,提问作者FloppyDogEars
相关产品推荐
相关产品推荐

