这可能是你的问题的解决方案: 重新编辑:
$(document).ready(function() {
var c = document.getElementById('myCanvas');
var ctx = c.getContext('2d');
c.addEventListener("mousewheel", scrolling, false);
c.ctx = ctx;
c.c = c;
draw(ctx, c);
});
function draw(ctx, c) {
// clear canvas for redraw
ctx.clearRect(0, 0, c.width, c.height);
// draw shapes
Object.keys(boxes).forEach(function (key) {
ctx.fillStyle = "#999";
ctx.fillRect(boxes[key].x, boxes[key].y, boxes[key].w, boxes[key].h);
});
}
function scrolling(e) {
var mouseX = e.pageX - this.offsetLeft;
// scroll left boxes
if (mouseX <= 400) {
first = Object.keys(boxes)[0];
lScroll += e.deltaY;
//console.log(lScroll);
//console.log((Object.keys(boxes).length/2)*(-100));
if (lScroll < 0 && (lScroll>=(Object.keys(boxes).length/2)*(-100))) {
canlScroll = true;
} else {if (lScroll<(Object.keys(boxes).length/2)*(-100)){
lScroll = (Object.keys(boxes).length/2)*(-100);
canlScroll = false;//console.log("final down:"+lScroll);
}
else {lScroll = 0; canlScroll = false;//console.log("final up:"+lScroll);
}
}
Object.keys(boxes).forEach(function(key) {
if(canlScroll && boxes[key].s === 'l') {
//console.log(e.deltaY/1.65);
boxes[key].y += Math.round(e.deltaY/1.65);
}
}
);
if (!canlScroll && lScroll === 0) {
if (boxes[first].y < 10) {
var delta = 10 - boxes[first].y;
Object.keys(boxes).forEach(function(key){
if(boxes[key].s === 'l') {
boxes[key].y += Math.round(delta);
//console.log(""+Math.round(delta));
}
});
}
}
// scroll right boxes
} else {
first = Object.keys(boxes)[12];
rScroll += e.deltaY;
if (rScroll < 0 && (rScroll>=(Object.keys(boxes).length/2)*(-100))) {
canrScroll = true;
} else {if (rScroll<(Object.keys(boxes).length/2)*(-100)){
rScroll = (Object.keys(boxes).length/2)*(-100);
canrScroll = false;//console.log("final down:"+rScroll);
}
else {rScroll = 0; canrScroll = false;//console.log("final up:"+rScroll);
}
}
Object.keys(boxes).forEach(function(key) {
if(canrScroll && boxes[key].s == 'r') {
boxes[key].y += (e.deltaY/1.65);
}
}
);
if (!canrScroll && rScroll === 0) {
if (boxes[first].y < 10) {
var delta = 10 - boxes[first].y;
Object.keys(boxes).forEach(function(key){
if(boxes[key].s == 'r') {
boxes[key].y += delta;
}
});
}
}
}
draw(e.target.ctx, e.target.c);
e.preventDefault();
}
已编辑,现在它正在使用鼠标和指针板。它不能正常工作的原因是因为鼠标和指针垫deltaY非常不同:其中一个是100px,另一个是2.5px。现在唯一的问题是,Firefox不处理它,实际上它只适用于Chrome。
入住在这里:http://output.jsbin.com/gobaguhehe
这似乎让你进一步滚动比我想要的。当最后一个框位于屏幕的底部时,我希望它停止。我认为这可以通过将画布的高度添加到if来完成,但是当它到达底部时它似乎又跳回到顶部? – LoboDemon
你只需要修改第一个条件,如果:if(lScroll <0 &&(lScroll> =(Object.keys(boxes).length/2)*( - 100)))可以为你工作。例如。如果您的箱子号码始终为12,只需将其更改为(-800),这意味着您需要计算屏幕上显示的箱子数量并进行数学运算。 – iomv
或者,您可以使用(Object.keys(boxes).length/2 * 100) - Math.abs(lScroll)来计算显示的框的数量,如果数字低于此数值,则停止滚动。如果我这样做,选择很多 – iomv