我的小地图实现有什么问题?

Whats wrong with my minimap implementation?

我需要为我的网络应用程序创建一个小地图,它可以显示您现在在页面上的位置。要使用 canvas,我正在使用 RaphaelJS 库。所以这是我的代码。

创建 Raphael 实例并设置两个 canvas - 主图 (5000x5000) 和小地图 (280x180):

var paper = Raphael('minimap', 280, 180),
paperC = Raphael('container', 5000, 5000);

然后在小地图上创建一个"viewport",这会显示你在页面上的位置:

viewport = paper.rect(document.documentElement.scrollLeft * scaleX, 
document.documentElement.scrollTop * scaleY, window.innerWidth * scaleX, 
window.innerHeight * scaleY).attr({'stroke' : '#000000', 'fill' : 
'#F0F0F0'})

scaleX = 280 / 5000scaleY = 180 / 5000 - 在 canvases 上移动时缩放值需要它们。

主要的拖放滚动类型功能canvas:

function dragWindow() {
var clicked = false,
startX, startY,
$d = $(document);
function updatePosition(e) {
    viewport.attr({'x' : $d.scrollLeft() * scaleX, 'y' : $d.scrollTop() * scaleY});
  $d.scrollLeft($d.scrollLeft() + (startX - e.pageX));
  $d.scrollTop($d.scrollTop() + (startY - e.pageY));
}
function startDragScroll(e){
  clicked = true;
  startX = e.pageX;
  startY = e.pageY;
}
function moveDragScroll(e){
  clicked && updatePosition(e);
}
function endDragScroll(){
  clicked = false;
}
document.addEventListener('mousedown', startDragScroll);
document.addEventListener('mousemove', moveDragScroll);
document.addEventListener('mouseup', endDragScroll);
}

在这一行 viewport.attr({'x' : $d.scrollLeft() * scaleX, 'y' : $d.scrollTop() * scaleY}); 中,我将 x 和 y 值分配给小地图上的 "viewport"; 一切正常。我在主要的大 cnavas 上拖动,"viewport" 在滚动文档时正确移动小地图。

在小地图上拖动 "viewport" 的功能:

drag = function(){
    this.ox = this.attr('x');
    this.oy = this.attr('y');
};
move = function(dx, dy){
this.attr({'x' : Math.min(Math.max(this.ox + dx, 0), 280 - this.attr('width')), 'y' : Math.min(Math.max(this.oy + dy, 0), 180 - this.attr('height'))});
};
up = function(){

};

这也能正常工作。 "Viewport" 在小地图上移动,不会超出。

但是当我尝试在小地图上拖动 "viewport" 的同时更改文档滚动时,奇怪的事情发生了。这是代码,只需在 move 函数中添加两行:

$d.scrollLeft(this.attr('x') / scaleX);
$d.scrollTop(this.attr('y') / scaleY);

现在,当我尝试在小地图上移动 "viewport" 时,它会快速跳到小地图的一个角落,仅此而已。文档也以相同的方向滚动到末尾。

伙计们,这段简单的代码可能出了什么问题?

UPD:通过更改文档滚动类型解决了问题。我把主canvas的widthheight设置为window.innerWidthwindow.innerHeight,并在$(window).resize()事件处理程序中更改这些值。 所以现在我在 div 上有滚动条,而不是在主体上,我正在更改 div 上的 .scrollLeft().scrollRight() 值。 Raphael move 函数中的值 dxdy 是正确的,因为现在文档不会滚动。