Firefox размещает переполнение на уровне html
, если не указано, что он ведет себя иначе.
Чтобы заставить его работать в Firefox, используйте
$('body,html').animate( ... );
Рабочий пример
Решением CSS было бы установить следующие стили:
html { overflow: hidden; height: 100%; }
body { overflow: auto; height: 100%; }
Я бы предположил, что решение JS будет наименее инвазивным.
Обновление
Большая часть обсуждения ниже фокусируется на том факте, что анимация scrollTop
двух элементов приведет к тому, что обратный вызов будет вызван дважды. Функции обнаружения браузера были предложены и впоследствии устарели, а некоторые из них, вероятно, довольно надуманы.
Если обратный вызов идемпотентен и не требует больших вычислительных мощностей, его повторный запуск может быть полной проблемой. Если множественные вызовы обратного вызова действительно являются проблемой, и если вы хотите избежать обнаружения функции, может быть более простым обеспечить принудительное выполнение обратного вызова только один раз из обратного вызова:
function runOnce(fn) {
var count = 0;
return function() {
if(++count == 1)
fn.apply(this, arguments);
};
};
$('body, html').animate({ scrollTop: stop }, delay, runOnce(function() {
console.log('scroll complete');
}));