編集:
問題の原因がわかりました。スクロールバーでスクロールし、プログラムでスクロールを設定すると、スクロールバーが移動し、ブラウザは新しいスクロールバーの位置に対するマウスの位置に基づいてスクロール位置を再計算します。今、私は解決策を探しています。 これは、以下の回答のいずれかからのコードを使用した問題の Youtube ビデオです。
元の投稿:
スクロールがスムーズに見えるように、ウィンドウがグリッド内の要素のサイズに等しい増分でスクロールする効果を達成しようとしています。要素は 40 ピクセルの正方形で、4 ピクセルのパディングがあるため、ページを 44 ピクセルずつスクロールしようとしています。私はいくつかのコードを書きましたが、ページが垂直方向にスクロールするときにうまく機能します。水平スクロール用にまったく同じ操作 (またはそう思う) をセットアップしましたが、水平スクロールすると、ページが前後に揺れます。私はそれをデバッグしようとしましたが、スクロールハンドラーが呼び出されるたびに、ウィンドウの左スクロールが一見ランダムな値に設定されるようです。
ここにコード(およびフィドル)があります:
$(function(){
// Here is the scroll function in question
$(window).scroll(function(){
var lastScrollTop = $(window).scrollTop();
var lastScrollLeft = $(window).scrollLeft();
return function(){
var scrollTop = $(this).scrollTop();
var scrollLeft = $(this).scrollLeft();
var yDir = scrollTop - lastScrollTop > 0 ? 1 : -1;
var xDir = scrollLeft - lastScrollLeft > 0 ? 1 : -1;
$(this).scrollTop(~yDir ? scrollTop + ((44 - ((scrollTop + 44) % 44))) : scrollTop - (scrollTop % 44));
$(this).scrollLeft(~xDir ? scrollLeft + ((44 - ((scrollLeft + 44) % 44))) : scrollLeft - (scrollLeft % 44));
scrollTop = lastScrollTop = $(this).scrollTop();
scrollLeft = lastScrollLeft = $(this).scrollLeft();
}
}());
});
編集:
これを Chrome 26.0.1410.65 btw でテストしています。
編集:
この問題は垂直スクロールでも発生しますが、マウスホイールではなくスクロールバーを使用している場合にのみ発生します。