Как вариант:
var Scroll = function ( element, to, time ) {
var start = new Date().getTime(),
from = element.scrollTop;
if (element.animated) return;
element.animated = true;
setTimeout(function () {
var progress = (new Date().getTime() - start) / time;
element.scrollTop = (to - from) * progress + from;
if (progress < 1) {
setTimeout(arguments.callee, 10);
element.animated = false;
}
}, 10);
};
document.onmousewheel = function (event) {
Scroll(document.body, document.body.scrollTop + event.detail * 30, 300);
return false;
};
Вариант для Opera и FF, но и под остальные браузеры можно подогнать.