如何计算坐标以将 window 滚动到 Javascript 中的图标中心位置?
How to calculate coordinates to scroll window to icon center position in Javascript?
我有一个网页,在 canvas 上绘制了图标树:
http://seznamka.moxo.cz/
您可以使用图标移动。我的想法是将 window 的视图区域居中到图标的位置。
比如我打开页面时点击右下角的"Gothic"图标并拖动:
滚动应该使图标位于屏幕中间,但它应该保持在原来的位置。因此,应该将 window 移动到该位置。
这是包含 windowScrollTo() 的事件。
jQuery(canvas).mousemove(函数(e) {
var canvasPosition = jQuery(this).offset();
var p = fromScreen({x: e.pageX - canvasPosition.left, y: e.pageY - canvasPosition.top});
最近的 = layout.nearest(p);
if (nearest.node.visible)
{
var s = toScreen(nearest.point.p);
var h = e.pageX-canvasPosition.left > s.x ? e.pageX-canvasPosition.left - s.x : s.x - e.pageX-canvasPosition.left;
var v = e.pageY-canvasPosition.top > s.y ? e.pageY-canvasPosition.top - s.y : s.y - e.pageY-canvasPosition.top;
var distance = Math.sqrt(h*h + v*v);
underMouseEvent = distance <= iconRadius ? true : false;
}
else
underMouseEvent = false;
if (underMouseEvent )
highlighted = nearest;
if (dragged !== null && dragged.node !== null) {
dragged.point.p.x = p.x;
dragged.point.p.y = p.y;
window.scrollTo(
s.x
// window.innerWidth/2
,
s.y
// window.innerHeight/2
);
}
renderer.start();
});
我尝试了两个变体 s.x、s.y(被拖动图标的坐标)和 window.innerWidth/2、window。 innerHeight/2 但不是很好的结果。如何计算正确的 x 和 y 位置?
编辑
我已经根据建议进行了更改。现在我添加了新版本,其中包括防止拖动图标时烦人的重复的条件。这样它在拖动过程中只会被调用一次。但我发现的另一个问题是,如果我打开 pan(el),例如 brownser 一侧的开发人员工具,那么中心就会出现一些问题。我试图用应该反映当前滚动偏移量的左右变量来纠正这种情况,但这并不完全有效。然而,关于如何使用滚动更正计算的任何想法?
jQuery(canvas).mousemove(function(e) {
var canvasPosition = jQuery(this).offset();
var p = fromScreen({x: e.pageX - canvasPosition.left, y: e.pageY - canvasPosition.top});
nearest = layout.nearest(p);
if (nearest.node.visible)
{
var s = toScreen(nearest.point.p);
var h = e.pageX-canvasPosition.left > s.x ? e.pageX-canvasPosition.left - s.x : s.x - e.pageX-canvasPosition.left;
var v = e.pageY-canvasPosition.top > s.y ? e.pageY-canvasPosition.top - s.y : s.y - e.pageY-canvasPosition.top;
var distance = Math.sqrt(h*h + v*v);
underMouseEvent = distance <= iconRadius ? true : false;
}
else
underMouseEvent = false;
if (underMouseEvent )
highlighted = nearest;
if (dragged !== null && dragged.node !== null) {
dragged.point.p.x = p.x;
dragged.point.p.y = p.y;
if (typeof s != 'undefined')
{
**var left = document.body.scrollLeft || window.pageXOffset;
var top = document.body.scrollTop || window.pageYOffset;**
if ( releasedAfterDrag &&
(
s.x>window.innerWidth/2-**left** ||
s.y>window.innerHeight/2-**top**
)
)
{
window.scrollTo(
s.x-window.innerWidth/2,
s.y-window.innerHeight/2
);
console.log("dragging: " + releasedAfterDrag);
}
if (releasedAfterDrag)
releasedAfterDrag = false;
}
}
renderer.start();
});
jQuery(window).bind('mouseup',function(e) {
dragged = null;
releasedAfterDrag = true;
});
在我看来,新条件仅适用于(内部)window(打开侧面板时)的后半部分。因此,如果图标位于上半部分或右半部分,则 window 未居中。
您需要进行以下计算才能找到它的坐标:
x: icon.x-window.innerWidth/2
y: icon.y-window.innerHeight/2
我有一个网页,在 canvas 上绘制了图标树: http://seznamka.moxo.cz/ 您可以使用图标移动。我的想法是将 window 的视图区域居中到图标的位置。
比如我打开页面时点击右下角的"Gothic"图标并拖动:
滚动应该使图标位于屏幕中间,但它应该保持在原来的位置。因此,应该将 window 移动到该位置。
这是包含 windowScrollTo() 的事件。
jQuery(canvas).mousemove(函数(e) { var canvasPosition = jQuery(this).offset(); var p = fromScreen({x: e.pageX - canvasPosition.left, y: e.pageY - canvasPosition.top}); 最近的 = layout.nearest(p);
if (nearest.node.visible)
{
var s = toScreen(nearest.point.p);
var h = e.pageX-canvasPosition.left > s.x ? e.pageX-canvasPosition.left - s.x : s.x - e.pageX-canvasPosition.left;
var v = e.pageY-canvasPosition.top > s.y ? e.pageY-canvasPosition.top - s.y : s.y - e.pageY-canvasPosition.top;
var distance = Math.sqrt(h*h + v*v);
underMouseEvent = distance <= iconRadius ? true : false;
}
else
underMouseEvent = false;
if (underMouseEvent )
highlighted = nearest;
if (dragged !== null && dragged.node !== null) {
dragged.point.p.x = p.x;
dragged.point.p.y = p.y;
window.scrollTo(
s.x
// window.innerWidth/2
,
s.y
// window.innerHeight/2
);
}
renderer.start();
});
我尝试了两个变体 s.x、s.y(被拖动图标的坐标)和 window.innerWidth/2、window。 innerHeight/2 但不是很好的结果。如何计算正确的 x 和 y 位置?
编辑 我已经根据建议进行了更改。现在我添加了新版本,其中包括防止拖动图标时烦人的重复的条件。这样它在拖动过程中只会被调用一次。但我发现的另一个问题是,如果我打开 pan(el),例如 brownser 一侧的开发人员工具,那么中心就会出现一些问题。我试图用应该反映当前滚动偏移量的左右变量来纠正这种情况,但这并不完全有效。然而,关于如何使用滚动更正计算的任何想法?
jQuery(canvas).mousemove(function(e) {
var canvasPosition = jQuery(this).offset();
var p = fromScreen({x: e.pageX - canvasPosition.left, y: e.pageY - canvasPosition.top});
nearest = layout.nearest(p);
if (nearest.node.visible)
{
var s = toScreen(nearest.point.p);
var h = e.pageX-canvasPosition.left > s.x ? e.pageX-canvasPosition.left - s.x : s.x - e.pageX-canvasPosition.left;
var v = e.pageY-canvasPosition.top > s.y ? e.pageY-canvasPosition.top - s.y : s.y - e.pageY-canvasPosition.top;
var distance = Math.sqrt(h*h + v*v);
underMouseEvent = distance <= iconRadius ? true : false;
}
else
underMouseEvent = false;
if (underMouseEvent )
highlighted = nearest;
if (dragged !== null && dragged.node !== null) {
dragged.point.p.x = p.x;
dragged.point.p.y = p.y;
if (typeof s != 'undefined')
{
**var left = document.body.scrollLeft || window.pageXOffset;
var top = document.body.scrollTop || window.pageYOffset;**
if ( releasedAfterDrag &&
(
s.x>window.innerWidth/2-**left** ||
s.y>window.innerHeight/2-**top**
)
)
{
window.scrollTo(
s.x-window.innerWidth/2,
s.y-window.innerHeight/2
);
console.log("dragging: " + releasedAfterDrag);
}
if (releasedAfterDrag)
releasedAfterDrag = false;
}
}
renderer.start();
});
jQuery(window).bind('mouseup',function(e) {
dragged = null;
releasedAfterDrag = true;
});
在我看来,新条件仅适用于(内部)window(打开侧面板时)的后半部分。因此,如果图标位于上半部分或右半部分,则 window 未居中。
您需要进行以下计算才能找到它的坐标: x: icon.x-window.innerWidth/2 y: icon.y-window.innerHeight/2