ユーザーが正常にスクロールできないようにするメカニズムをサイトに書き込もうとしています。ユーザーが下または上にスクロールすると、サイトは次または前のスライドにスムーズにスクロールし (スクロール方向によって異なります)、そこで停止します (ナビゲーションバーをクリックしたときなど)。ライブ プレビューを見る:ここをクリック
しかし、厄介な問題があります。FF(ジャンプなし)ではほぼ問題なく動作しますが、別のブラウザ(Chrome、Safari、IE)では壊れます-ジャンプします。これを防ぐにはどうすればよいですか?コードのスニペットを次に示します。スクロールを防止する ScrollControl オブジェクトがあります。
scrollControl = {
keys : [32, 37, 38, 39, 40],
scrollTimer : 0,
lastScrollFireTime : 0,
preventDefault : function(e){
e = e || window.event;
if (e.preventDefault)
e.preventDefault();
e.returnValue = false;
},
keydown : function(e){
for (var i = scrollControl.keys.length; i--;) {
if (e.keyCode === scrollControl.keys[i]) {
scrollControl.preventDefault(e);
return;
}
}
},
wheel : function(e){
scrollControl.preventDefault(e);
},
disableScroll : function(){
if (window.addEventListener) {
window.addEventListener('DOMMouseScroll', scrollControl.wheel, false);
}
window.onmousewheel = document.onmousewheel = scrollControl.wheel;
document.onkeydown = scrollControl.keydown;
},
enableScroll : function(){
if (window.removeEventListener) {
window.removeEventListener('DOMMouseScroll', scrollControl.wheel, false);
}
window.onmousewheel = document.onmousewheel = document.onkeydown = null;
}
}
次に、マウスホイールが発生したかどうかをリッスンし、関数を1回だけ実行しようとしています(このプラグインを使用して、マウスホイール PLUGINを検出しています)
$(window).mousewheel(function(objEvent, intDelta){
var minScrollTime = 1000;
var now = new Date().getTime();
function processScroll() {
console.log("scrolling");
if(intDelta>0){
$.smoothScroll({
speed:med.effectDuration,
easing:med.scrollEase,
scrollTarget:med.prevPage,
afterScroll: function(){
med.currentPage = med.prevPage;
med.setActiveNav();
med.setSlides();
med.runAnimations();
}});
}else if(intDelta<0){
//scrollControl.disableScroll();
$.smoothScroll({
speed:med.effectDuration,
easing:med.scrollEase,
scrollTarget:med.nextPage,
afterScroll: function(){
med.currentPage = med.nextPage;
med.setActiveNav();
med.setSlides();
med.runAnimations();
}});
}
}
if (!scrollControl.scrollTimer) {
if (now - scrollControl.lastScrollFireTime > (3 * minScrollTime)) {
processScroll(); // fire immediately on first scroll
scrollControl.lastScrollFireTime = now;
}
scrollTimer = setTimeout(function() {
scrollControl.scrollTimer = null;
scrollControl.lastScrollFireTime = new Date().getTime();
processScroll();
}, minScrollTime);
}
});
scrollControl.disableScroll
ユーザーがウェブサイトを起動したときに、DOM Ready イベントで関数を実行しています。また、実際に1回スクロールすると、防止が完全に機能せず、スムーズスクロールが2回トリガーされる場合があります。私は何を間違っていますか?提案をお寄せいただきありがとうございます!