背景:
我正在尝试创建一个系统,允许使用鼠标向上滚动滚动浏览一种地图,鼠标向下滚动,如下所示:
-------
| |
| 1 |
| |
-------
------- ------- ------- -------
| | | | | | | |
| 2 | | 3 | | 4 | | 5 |
| | | | | | | |
------- ------- ------- -------
-------
| |
| 6 |
| |
-------
上面的每个框都在javascript中重置为浏览器的高度和宽度。当您上下滚动鼠标时,浏览器将滚动到地图中的相等位置,从div 1开始,然后是2,依此类推。这个定位是通过我的滚动功能设置的,滚动功能可以监听鼠标滚动并在顶部添加适当的填充,在左边添加边距以创建上面地图的错觉。
以下是它的代码:
http://codepen.io/lorenzoi/pen/mxejJ
以下是javascript:
$(function(){
$(window).on('resize', function(){
var $divs = $('.vertical, .horizontal > div'),
ww = $(this).width(),
wh = $(this).height();
$divs.css({
height : wh,
width : ww
});
$('.horizontal').each(function(){
var $container = $(this),
nbChildren = $container.children().length;
posY = $container.offset().top,
$container.css({
height: ww*(nbChildren-1) + wh,
width: ww*(nbChildren)
});
});
}).trigger('resize');
$(window).on('scroll', function(){
var wh = $(window).height(),
scroolTop = $(window).scrollTop();
$('.horizontal').each(function(){
var $container = $(this),
posY = $container.offset().top,
height = $container.height(),
nbChildren = $container.children().length,
marginMax = $container.width()/nbChildren*(nbChildren-1),
marginL = scroolTop - posY;
if(marginL<0) marginL = 0;
else if (marginL>marginMax) marginL = marginMax;
$container.css('marginLeft', -marginL);
$container.css('paddingTop', marginL);
});
}).trigger('scroll');
});
问题:
调整窗口大小会创建一个奇怪的div偏移,当为div 2到5调用scroll函数时,它会自行修复。在这些div中调整大小时,它们似乎会自行偏移,然后只有在调用scroll函数时才会修复。
.trigger( '调整');应该永远被叫,是吗?我不知道为什么它只在滚动功能被调用时被调用。
如何解决这个问题?
答案 0 :(得分:3)
使用计时器应该足够了:
$(function(){
var timeoutResize;
$(window).on('resize', function(){
clearTimeout(timeoutResize);
timeoutResize = setTimeout(function(){
var $divs = $('.vertical, .horizontal > div'),
ww = $(this).width(),
wh = $(this).height();
$divs.css({
height : wh,
width : ww
});
$('.horizontal').each(function(){
var $container = $(this),
nbChildren = $container.children().length;
posY = $container.offset().top,
$container.css({
height: ww*(nbChildren-1) + wh,
width: ww*(nbChildren)
});
});
},100);
}).trigger('resize');
...
});
答案 1 :(得分:2)
。 。您需要考虑每当用户垂直调整窗口大小时,滚动位置将受到影响,它也会影响您的背景滚动(因为它基于当前滚动位置)。
。 。最简单的修复方法是在调整大小处理程序代码的末尾调用$(window).trigger('scroll');
,这样就可以保持干燥状态。我在my CodePen fork上做了这个改动。看看吧。
答案 2 :(得分:0)
如果你的事件处理程序运行得太频繁,你可以像这样限制它:
function throttle(ms, fn) {
var allow = true;
function enable() {
allow = true;
}
return function(e) {
if (allow) {
allow = false;
setTimeout(enable, ms);
fn.call(this, e);
}
}
}
然后在分配时将处理程序传递给throttle
。根据您提供的第一个参数,它将返回一个每n
毫秒运行一次的函数。
$(window).resize(throttle(100, function(e) {
// do heavy work
}));