作成しているページがあり、スクロール(上または下)するとページが次のdivにスクロールするようにします(各divはウィンドウの高さの100%です)。そして、もう一度スクロールするまで、そこで「修正」されます。私が達成しようとしていることの例はここで見ることができます:
下にスクロールすると、自動的に次の「div」に移動します。
私が試したこと:
jQuery.scrollイベントを以下と組み合わせて使用します。
function updatePosition() { if(canScroll) { var pageName; canScroll = false; var st = $(window).scrollTop(); if (st > lastScrollTop){ // downscroll code if(pageNumber < 7) { pageNumber++; } pageName = '#' + getPageToScrollTo().id; $('body').animate({ scrollTop: $(pageName).offset().top }, 2000, function() { canScroll = true; }); } else { // upscroll code if(pageNumber > 0) { pageNumber--; } pageName = '#' + getPageToScrollTo().id; $('body').animate({ scrollTop: $(pageName).offset().top }, 2000, function() { canScroll = true; }); } lastScrollTop = st; } }
しかし、スクロールイベントは、ページがスクロール(アニメーション)しているとき、およびユーザーがスクロールしているときに呼び出されていました。ユーザーがスクロールしたときにだけ呼び出す必要があります。
それから私は追加しました:
var throttled = _.throttle(updatePosition, 3000);
$(document).scroll(throttled);
Underscore.jsライブラリから-しかし、それでも同じことをしました。
最後に、ここを少し見て、次のことを見つけました。
Scrollは、animate()ではなく、ユーザーがスクロールするときにのみ呼び出します。
しかし、私はそのソリューションを実装できませんでした。これを機能させるためのライブラリやメソッドを知っている人はいますか?
編集:ベーシックの答えに基づく解決策:
function nextPage() {
canScroll = false;
if(pageNumber < 7) {
pageNumber++;
}
pageName = getPageToScrollTo();
$('html, body').stop().animate({ scrollTop: $(pageName).offset().top }, 1000, function() {
canScroll = true;
});
}
function prevPage() {
canScroll = false;
if(pageNumber > 0) {
pageNumber--;
}
pageName = getPageToScrollTo();
$('html, body').stop().animate({ scrollTop: $(pageName).offset().top }, 1000, function() {
canScroll = true;
});
}
//--Bind mouseWheel
$(window).on(mousewheelevt, function(event) {
event.preventDefault();
if(canScroll){
if(mousewheelevt == "mousewheel") {
if (event.originalEvent.wheelDelta >= 0) {
prevPage();
} else {
nextPage();
}
} else if(mousewheelevt == "DOMMouseScroll") {
if (event.originalEvent.detail >= 0) {
nextPage();
} else {
prevPage();
}
}
}
});