【发布时间】:2013-11-22 00:49:47
【问题描述】:
我有一个正在开发的应用程序,我希望它在用户向上或向下滚动时将其锁定到最近的锚点。
有没有已知的方法可以做到这一点?如果有人在 iPhone 上安装了 'circa' 应用程序,你就会知道我在说什么。
我有一个简单的破解解决方案可以检测滚动并执行以下操作:
var nearestAnchorOffset = calculateNearestAnchorOffset();
$('body').scrollTop(nearestAnchorOffset);
但是,它并不理想,因为它有时会非常紧张和不可预测。
一个问题似乎是滚动事件在滚动时触发开始,是否存在在滚动结束时触发的等效事件?
这是我试图让它工作的网站:
请注意,该效果仅在小屏幕上触发(在桌面上并不真正需要)。我在滚动上使用了 jQuery debounce,以便它仅在用户 停止 滚动时触发。它在桌面上非常流畅,但是在 iPhone 上看时,它有 50% 的时间不能正确并滚动到错误的位置。
到目前为止,这是我的完整解决方案:
if($( document ).width() <= 768){
var offsets = {};
$( window ).scroll($.debounce(function(data) {
if(isActive !== false){
// different scrollable points
offsets.todaytitle = $('.row.today.title').offset();
offsets.todaywind = $('.row.today.result .wind').offset();
offsets.todaytemp = $('.row.today.result .temp').offset();
offsets.tomorrowtitle = $('.row.tomorrow.title').offset();
offsets.tomorrowwind = $('.row.tomorrow.result .wind').offset();
offsets.tomorrowtemp = $('.row.tomorrow.result .temp').offset();
offsets.form = $('#postcodeForm').offset();
offsets.nav = $('#nav-bottom').offset();
offsets.top = {top: 0};
var current = $(window).scrollTop();
var closest = "";
var curDiff = 99999;
$.each(offsets, function( key, value ) {
var diff = Math.abs(offsets[key].top - current);
if(diff < curDiff){
curDiff = diff;
closest = key;
}
});
animatedScroll(offsets[closest].top);
}
},350));
}
function animatedScroll(offset){
$("body").animate({ scrollTop: offset },200, function() {
scrollingOn = false;
});
}
任何帮助将不胜感激!
【问题讨论】:
标签: javascript jquery html css