如果您是Cargo cult programmer,请使用 jQuery。仅当您是 Real programmer 时才继续。
拧jQuery.animate(),了解背后的数学并选择一种算法。 Robert Penner has a nice demo,我选择了 EaseOutQuad。
阅读如何处理鼠标滚轮跨浏览器样式here,然后做一些more reading。
在此代码中,我选择不支持 IE 8 及更早版本。这个想法是连接轮子事件,防止它(因为默认行为是生涩的跳跃)并执行自己的平滑跳跃
Math.easeOutQuad = function (t, b, c, d) { t /= d; return -c * t*(t-2) + b; };
(function() { // do not mess global space
var
interval, // scroll is being eased
mult = 0, // how fast do we scroll
dir = 0, // 1 = scroll down, -1 = scroll up
steps = 50, // how many steps in animation
length = 30; // how long to animate
function MouseWheelHandler(e) {
e.preventDefault(); // prevent default browser scroll
clearInterval(interval); // cancel previous animation
++mult; // we are going to scroll faster
var delta = -Math.max(-1, Math.min(1, (e.wheelDelta || -e.detail))); // cross-browser
if(dir!=delta) { // scroll direction changed
mult = 1; // start slowly
dir = delta;
}
// in this cycle, we determine which element to scroll
for(var tgt=e.target; tgt!=document.documentElement; tgt=tgt.parentNode) {
var oldScroll = tgt.scrollTop;
tgt.scrollTop+= delta;
if(oldScroll!=tgt.scrollTop) break;
// else the element can't be scrolled, try its parent in next iteration
}
var start = tgt.scrollTop;
var end = start + length*mult*delta; // where to end the scroll
var change = end - start; // base change in one step
var step = 0; // current step
interval = setInterval(function() {
var pos = Math.easeOutQuad(step++,start,change,steps); // calculate next step
tgt.scrollTop = pos; // scroll the target to next step
if(step>=steps) { // scroll finished without speed up - stop animation
mult = 0; // next scroll will start slowly
clearInterval(interval);
}
},10);
}
// nonstandard: Chrome, IE, Opera, Safari
window.addEventListener("mousewheel", MouseWheelHandler, false);
// nonstandard: Firefox
window.addEventListener("DOMMouseScroll", MouseWheelHandler, false);
})();
正如你所看到的in this demo,我更喜欢尽可能少的缓动,以避免生涩的滚动。阅读上面的 cmets 并设计适合您项目的自己的滚动。
注意:鼠标滚轮也可以连接到触摸板,但不能连接到上/下键。您也应该考虑挂钩关键事件。