Firefox đặt tràn ở html
cấp độ, trừ khi được tạo kiểu đặc biệt để hành xử khác đi.
Để làm cho nó hoạt động trong Firefox, hãy sử dụng
$('body,html').animate( ... );
Ví dụ làm việc
Giải pháp CSS sẽ là thiết lập các kiểu sau:
html { overflow: hidden; height: 100%; }
body { overflow: auto; height: 100%; }
Tôi cho rằng giải pháp JS sẽ ít xâm lấn nhất.
Cập nhật
Rất nhiều cuộc thảo luận dưới đây tập trung vào thực tế là hoạt hình scrollTop
của hai yếu tố sẽ khiến cuộc gọi lại được gọi hai lần. Các tính năng phát hiện trình duyệt đã được đề xuất và sau đó không được dùng nữa, và một số được cho là khá xa vời.
Nếu cuộc gọi lại là tạm thời và không đòi hỏi nhiều sức mạnh tính toán, việc bắn nó hai lần có thể là một vấn đề hoàn toàn. Nếu nhiều lệnh gọi lại thực sự là một vấn đề và nếu bạn muốn tránh phát hiện tính năng, có thể sẽ đơn giản hơn để thực thi rằng cuộc gọi lại chỉ được chạy một lần từ trong cuộc gọi lại:
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');
}));