Firefox posiziona l'overflow a html
livello, a meno che non sia stato progettato specificatamente per comportarsi diversamente.
Per farlo funzionare in Firefox, utilizzare
$('body,html').animate( ... );
Esempio funzionante
La soluzione CSS sarebbe quella di impostare i seguenti stili:
html { overflow: hidden; height: 100%; }
body { overflow: auto; height: 100%; }
Suppongo che la soluzione JS sarebbe meno invasiva.
Aggiornare
Gran parte della discussione che segue si concentra sul fatto che l'animazione scrollTop
dei due elementi causerebbe il richiamo del callback due volte. Le funzionalità di rilevamento del browser sono state suggerite e successivamente deprecate, e alcune sono probabilmente piuttosto inverosimili.
Se il callback è idempotente e non richiede molta potenza di elaborazione, licenziarlo due volte potrebbe essere un non-problema completo. Se più invocazioni del callback sono veramente un problema e se si desidera evitare il rilevamento di funzionalità, potrebbe essere più semplice imporre che il callback venga eseguito una sola volta dall'interno del callback:
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');
}));