如何在 React Highcharts 中获取网格位置
How to get grid position in React Highcharts
有没有办法获取 highcharts-grid 的 xPosition 或获取它与 Highchart xPosition 的距离?
我想将我页面中的元素与实际网格对齐。问题是 yAxis 信息大小改变了。
参见以下示例:
和:
您应该首先设置图表的边距,这将覆盖 highcharts 完成的一些自动计算,这些计算会在您取消选择系列时进行 xAxis 重排。我做了一个简单的 jsfiddle 试图模仿上面的图表样式,请参见此处:http://jsfiddle.net/p6bog3pa/
图表配置对象是:
Highcharts.chart('container', {
chart: {
type: 'column',
margin: [25, 15, 70, 400] // This fixes the chart margins
},
xAxis: {
categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
},
plotOptions: {
column: {
grouping: true
}
},
yAxis: [
{ title: { text: 'hello title' }},
{ title: { text: 'highcharts title' }},
{ title: { text: 'stuff title' }}],
series: [{
name: 'hello',
yAxis: 0,
data: [29.9, 71.5, 106.4, 129.2, 144.0, 176.0, 135.6, 148.5, 216.4, 194.1, 95.6, 54.4]
}, {
name: 'highcharts',
yAxis: 1,
data: [29.9, 71.5, 106.4, 129.2, 144.0, 176.0, 135.6, 148.5, 216.4, 194.1, 95.6, 54.4]
}, {
name: 'stuff',
yAxis: 2,
data: [29.9, 71.5, 106.4, 129.2, 144.0, 176.0, 135.6, 148.5, 216.4, 194.1, 95.6, 54.4]
}]
});
并且由于您有固定边距,您可以为任何您希望与图表 x 轴对齐的组件设置固定偏移量。当然,如果你想让它更动态,那么你的代码中就会有更多的工作来确定合适的边距,但这应该不是一个太难的任务。
绘图区域的x起始位置可以在chart.plotLeft
属性中找到,所以你没有设置固定边距。
我的解决方案是找到 Highchart 的内部元素之一,找到它与 window 左侧的距离,然后相应地移动我自己的元素。
显然,图表 xAxis 元素是第一个具有类名 highcharts-axis
并且其左上角适合我需要的元素:
const highchartInsideElement = document.getElementsByClassName("highcharts-axis");
const myElement = document.getElementById("myElement");
if (analCharts.length > 0) {
const highchartInsideElementTopLeft = this.getPageTopLeft(highchartInsideElement[0]).left;
const myElementTopLeft = this.getPageTopLeft(ganttWrapper).left;
padding = `${highchartInsideElementTopLeft - myElementTopLeft + 16}px`; // 16: cheating in order to match Highcharts extra x values
myElement.style.paddingLeft = amchartsWrapperMargin;
}
要计算与 window 左边的距离:
getPageTopLeft(el) {
const rect = el.getBoundingClientRect();
const docEl = document.documentElement;
return {
left: rect.left + (window.pageXOffset || docEl.scrollLeft || 0),
top: rect.top + (window.pageYOffset || docEl.scrollTop || 0)
};
}
有没有办法获取 highcharts-grid 的 xPosition 或获取它与 Highchart xPosition 的距离?
我想将我页面中的元素与实际网格对齐。问题是 yAxis 信息大小改变了。
参见以下示例:
您应该首先设置图表的边距,这将覆盖 highcharts 完成的一些自动计算,这些计算会在您取消选择系列时进行 xAxis 重排。我做了一个简单的 jsfiddle 试图模仿上面的图表样式,请参见此处:http://jsfiddle.net/p6bog3pa/
图表配置对象是:
Highcharts.chart('container', {
chart: {
type: 'column',
margin: [25, 15, 70, 400] // This fixes the chart margins
},
xAxis: {
categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
},
plotOptions: {
column: {
grouping: true
}
},
yAxis: [
{ title: { text: 'hello title' }},
{ title: { text: 'highcharts title' }},
{ title: { text: 'stuff title' }}],
series: [{
name: 'hello',
yAxis: 0,
data: [29.9, 71.5, 106.4, 129.2, 144.0, 176.0, 135.6, 148.5, 216.4, 194.1, 95.6, 54.4]
}, {
name: 'highcharts',
yAxis: 1,
data: [29.9, 71.5, 106.4, 129.2, 144.0, 176.0, 135.6, 148.5, 216.4, 194.1, 95.6, 54.4]
}, {
name: 'stuff',
yAxis: 2,
data: [29.9, 71.5, 106.4, 129.2, 144.0, 176.0, 135.6, 148.5, 216.4, 194.1, 95.6, 54.4]
}]
});
并且由于您有固定边距,您可以为任何您希望与图表 x 轴对齐的组件设置固定偏移量。当然,如果你想让它更动态,那么你的代码中就会有更多的工作来确定合适的边距,但这应该不是一个太难的任务。
绘图区域的x起始位置可以在chart.plotLeft
属性中找到,所以你没有设置固定边距。
我的解决方案是找到 Highchart 的内部元素之一,找到它与 window 左侧的距离,然后相应地移动我自己的元素。
显然,图表 xAxis 元素是第一个具有类名 highcharts-axis
并且其左上角适合我需要的元素:
const highchartInsideElement = document.getElementsByClassName("highcharts-axis");
const myElement = document.getElementById("myElement");
if (analCharts.length > 0) {
const highchartInsideElementTopLeft = this.getPageTopLeft(highchartInsideElement[0]).left;
const myElementTopLeft = this.getPageTopLeft(ganttWrapper).left;
padding = `${highchartInsideElementTopLeft - myElementTopLeft + 16}px`; // 16: cheating in order to match Highcharts extra x values
myElement.style.paddingLeft = amchartsWrapperMargin;
}
要计算与 window 左边的距离:
getPageTopLeft(el) {
const rect = el.getBoundingClientRect();
const docEl = document.documentElement;
return {
left: rect.left + (window.pageXOffset || docEl.scrollLeft || 0),
top: rect.top + (window.pageYOffset || docEl.scrollTop || 0)
};
}