Вы используете network.getPositions (params.nodes [0]), но поскольку узлы могут сильно измениться при увеличении и уменьшении и перемещении сети на холсте, каким-то образом позиции не соответствуют реальной позиции узла. ,Я не знаю, является ли это ошибкой в visjs или есть какая-то другая причина для этого. Документы говорят, что они возвращают положение узла в пространстве холста. Но это явно не тот случай в вашем примере.
Глядя на документы [https://visjs.github.io/vis-network/docs/network/#Events] аргумент события click содержит:
{
nodes: [Array of selected nodeIds],
edges: [Array of selected edgeIds],
event: [Object] original click event,
pointer: {
DOM: {x:pointer_x, y:pointer_y}, // << Try using this values
canvas: {x:canvas_x, y:canvas_y}
}
}
Попробуйте использовать params.pointer.DOM или params.pointer.canvas позиции X и Y для позиционирования вашего всплывающего окна. Это должно быть расположение курсора. Это будет та же позиция, что и у узла, поскольку вы щелкнули по нему.
Поэтому попробуйте что-то вроде:
document.getElementById('popup').style.top = params.pointer.DOM.y +'px';
document.getElementById('popup').style.left = params.pointer.DOM.x +'px';
- Не проверено