[英]How to change cursor style to pointer on hovering over points of the chart?
[英]How can I move cursor over chart at any place and not just on the series data points?
我有 2 個點線系列,每個系列都有默認的 cursor。 默認的 cursor 沿着系列數據(點)運行。 我想要的是一個 cursor,我可以在圖表中的任何位置移動,而不僅僅是在系列數據上。
謝謝你的問題。 根據標簽,我假設您使用的是LightningChart JS 。
如果我正確理解了您想要的行為,您希望 cursor 始終位於用戶鼠標上,並在結果表中顯示已解決的最近數據點。
這可以通過Chart Marker來實現,它基本上是一個 cursor,可以在應用程序代碼中創建和定位。
這是有關如何操作的代碼片段:
監聽文檔上的鼠標事件。
從系列中求解最近的數據點。
position 圖表標記在任意位置。
const marker = chart.addChartMarkerXY()
document.addEventListener( 'mousemove', ( event ) => {
// Solve nearest data point.
const cursorPoint = chart.solveNearest( { x: event.clientX, y: event.clientY } )
// Translate mouse location to Axis.
const locationOnAxes = translatePoint(
chart.engine.clientLocation2Engine( event.clientX, event.clientY ),
chart.engine.scale,
{
x: chart.getDefaultAxisX().scale,
y: chart.getDefaultAxisY().scale
}
)
// Position Chart Marker, but override its location.
marker
.pointAt( cursorPoint )
// Override Cursor location to that of mouse location.
.setPosition( locationOnAxes )
} )
如果有人正在尋找一種也適用於非全屏圖表的解決方案,以下內容可能會有所幫助。
我添加了以下內容以獲取元素的當前 position:
const elemLeftSpace = elem.getBoundingClientRect().left;
const elemTopSpace = elem.getBoundingClientRect().top;
確保在偵聽器中調用 position,因為它們會隨着您滾動頁面或調整瀏覽器 window 的大小而變化。
之后,您可以計算正確的 position:
const cursorPoint = chart.solveNearest( { x: event.clientX - elemLeftSpace, y: event.clientY - elemTopSpace } );
完整代碼:
const marker = chart.addChartMarkerXY();
const elem = document.getElementById('chart-container');
elem.addEventListener( 'mousemove', ( event ) => {
const elemLeftSpace = elem.getBoundingClientRect().left;
const elemTopSpace = elem.getBoundingClientRect().top;
// Solve nearest data point.
const cursorPoint = chart.solveNearest( { x: event.clientX - elemLeftSpace, y: event.clientY - elemTopSpace } );
if (cursorPoint) {
const locationOnAxes = translatePoint(
chart.engine.clientLocation2Engine( event.clientX, event.clientY ),
chart.engine.scale,
{
x: chart.getDefaultAxisX().scale,
y: chart.getDefaultAxisY().scale
}
);
// Position Chart Marker, but override its location.
marker
.pointAt( cursorPoint )
// Override Cursor location to that of mouse location.
.setPosition( locationOnAxes );
})
下面的工作示例:
const { lightningChart, AxisTickStrategies, DataPatterns, SolidLine, translatePoint, AutoCursorModes } = lcjs const containerId = 'chart-container'; const chart = lightningChart().ChartXY({ containerId, }).setAutoCursorMode(AutoCursorModes.disabled) const axisX = chart.getDefaultAxisX() const axisY = chart.getDefaultAxisY() const data = []; for (let i = 0; i < 10; i++) { data[i] = {x: i, y: Math.floor(Math.random() * 10)}; } const lineSeries = chart.addLineSeries({ xAxis: axisX, yAxis: axisY, dataPattern: DataPatterns.horizontalProgressive }).setMouseInteractions(false); lineSeries.add(data); const marker = chart.addChartMarkerXY() const elem = document.getElementById('chart-container'); elem.addEventListener( 'mousemove', ( event ) => { const elemLeftSpace = elem.getBoundingClientRect().left; const elemTopSpace = elem.getBoundingClientRect().top; // Solve nearest data point. const cursorPoint = chart.solveNearest( { x: event.clientX - elemLeftSpace, y: event.clientY - elemTopSpace } ) // Translate mouse location to Axis. if (cursorPoint) { const locationOnAxes = translatePoint( chart.engine.clientLocation2Engine( event.clientX, event.clientY ), chart.engine.scale, { x: chart.getDefaultAxisX().scale, y: chart.getDefaultAxisY().scale } ) // Position Chart Marker, but override its location. marker.pointAt( cursorPoint ) // Override Cursor location to that of mouse location. .setPosition( locationOnAxes ) } } )
.chart-container-wrapper { width: 80%; height: 300px; margin: 10px auto; } #chart-container { width: 100%; height: 100%; }
<div class="chart-container-wrapper"> <div id='chart-container'></div> </div> <script src="https://unpkg.com/@arction/lcjs@1.3.1/dist/lcjs.iife.js"></script>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.