Можно ли анимировать scrollTop с помощью jQuery? - PullRequest
221 голосов
/ 27 октября 2010

Я хочу плавно прокрутить вниз.Я не хочу писать для этого функцию, особенно если она уже есть в jQuery.

Ответы [ 12 ]

452 голосов
/ 27 октября 2010

Вы можете просто использовать .animate() свойство scrollTop, например:

$("html, body").animate({ scrollTop: "300px" });
71 голосов
/ 20 февраля 2012

Ответ Ника прекрасно работает.Будьте внимательны при указании функции complete () внутри вызова animate (), поскольку он будет выполнен дважды, поскольку у вас объявлены два селектора (html и body).

$("html, body").animate(
    { scrollTop: "300px" },
    {
        complete : function(){
            alert('this alert will popup twice');
        }
    }
);

Вот как можно избежать двойного обратного вызова.

var completeCalled = false;
$("html, body").animate(
    { scrollTop: "300px" },
    {
        complete : function(){
            if(!completeCalled){
                completeCalled = true;
                alert('this alert will popup once');
            }
        }
    }
);
26 голосов
/ 15 октября 2011

Ответ Ника отлично работает, а настройки по умолчанию хороши, но вы можете более полно контролировать прокрутку, выполнив все дополнительные настройки.

вот как это выглядит в API:

.animate( properties [, duration] [, easing] [, complete] )

чтобы вы могли сделать что-то вроде этого:

.animate( 
    {scrollTop:'300px'},
    300,
    swing,
    function(){ 
       alert(animation complete! - your custom code here!); 
       } 
    )

Вот страница API функции jQuery .animate: http://api.jquery.com/animate/

14 голосов
/ 20 декабря 2013

У меня есть то, что я считаю лучшим решением, чем взлом $('html, body').

Это не однострочный текст, но проблема, с которой я столкнулся с $('html, body'), заключается в том, что при входе в систему $(window).scrollTop()анимация, вы увидите, что значение скачет повсюду, иногда на сотни пикселей (хотя я не вижу ничего подобного визуально).Мне нужно, чтобы значение было предсказуемым, чтобы я мог отменить анимацию, если пользователь во время автопрокрутки схватил полосу прокрутки или повернул колесо мыши.

Вот функция, которая плавно анимирует прокрутку:

function animateScrollTop(target, duration) {
    duration = duration || 16;
    var scrollTopProxy = { value: $(window).scrollTop() };
    if (scrollTopProxy.value != target) {
        $(scrollTopProxy).animate(
            { value: target }, 
            { duration: duration, step: function (stepValue) {
                var rounded = Math.round(stepValue);
                $(window).scrollTop(rounded);
            }
        });
    }
}

Ниже приведена более сложная версия, которая отменяет анимацию при взаимодействии с пользователем, а также обновляет до достижения целевого значения, что полезно при попытке мгновенно установить scrollTop (например, просто вызвать $(window).scrollTop(1000) -по моему опыту, это не работает примерно в 50% случаев.)

function animateScrollTop(target, duration) {
    duration = duration || 16;

    var $window = $(window);
    var scrollTopProxy = { value: $window.scrollTop() };
    var expectedScrollTop = scrollTopProxy.value;

    if (scrollTopProxy.value != target) {
        $(scrollTopProxy).animate(
            { value: target },
            {
                duration: duration,

                step: function (stepValue) {
                    var roundedValue = Math.round(stepValue);
                    if ($window.scrollTop() !== expectedScrollTop) {
                        // The user has tried to scroll the page
                        $(scrollTopProxy).stop();
                    }
                    $window.scrollTop(roundedValue);
                    expectedScrollTop = roundedValue;
                },

                complete: function () {
                    if ($window.scrollTop() != target) {
                        setTimeout(function () {
                            animateScrollTop(target);
                        }, 16);
                    }
                }
            }
        );
    }
}
12 голосов
/ 29 января 2014

Как упоминалось в Kita, существует проблема с несколькими обратными вызовами, которые запускаются, когда вы анимируете как 'html', так и 'body'.Вместо того, чтобы анимировать и блокировать последующие обратные вызовы, я предпочитаю использовать некоторые базовые функции обнаружения и анимировать только свойство scrollTop одного объекта.

Принятый ответ в этом другом потоке дает некоторое представление о том, какое свойство scrollTop объекта мыследует попытаться анимировать: pageYOffset Прокрутка и анимация в IE8

// UPDATE: don't use this... see below
// only use 'body' for IE8 and below
var scrollTopElement = (window.pageYOffset != null) ? 'html' : 'body';

// only animate on one element so our callback only fires once!
$(scrollTopElement).animate({ 
        scrollTop: '400px' // vertical position on the page
    },
    500, // the duration of the animation 
    function() {       
        // callback goes here...
    })
});

ОБНОВЛЕНИЕ - - -

Вышеприведенная попытка обнаружения функции не удалась.Похоже, что не существует однострочного способа сделать это, так как свойство pageYOffset в браузерах с типом webkit всегда возвращает ноль при наличии типа документа.Вместо этого я нашел способ использовать обещание для выполнения одного обратного вызова при каждом выполнении анимации.

$('html, body')
    .animate({ scrollTop: 100 })
    .promise()
    .then(function(){
        // callback code here
    })
});
7 голосов
/ 27 мая 2014

У меня были проблемы, когда анимация всегда начиналась сверху страницы после обновления страницы в других примерах.

Я исправил это, не анимируя css напрямую, а вызывая window.scrollTo(); на каждом шаге:

$({myScrollTop:window.pageYOffset}).animate({myScrollTop:300}, {
  duration: 600,
  easing: 'swing',
  step: function(val) {
    window.scrollTo(0, val);
  }
});

Эта проблема также решает проблему html против body, так как она использует кросс-браузерный JavaScript.

Посмотрите на http://james.padolsey.com/javascript/fun-with-jquerys-animate/ для получения дополнительной информации о том, что вы можете сделать с помощью функции анимации jQuery.

4 голосов
/ 11 декабря 2013

Вы можете использовать анимацию jQuery для страницы прокрутки с определенной продолжительностью:

$("html, body").animate({scrollTop: "1024px"}, 5000);

, где 1024px - это смещение прокрутки, а 5000 - продолжительность анимации в миллисекундах.

4 голосов
/ 27 октября 2010

Попробуйте плагин scrollTo .

3 голосов
/ 08 марта 2017
$(".scroll-top").on("click", function(e){
   e.preventDefault();
   $("html, body").animate({scrollTop:"0"},600);
});
1 голос
/ 15 июля 2016

Если вы хотите перейти вниз в конце страницы (поэтому вам не нужно прокручивать страницу вниз), вы можете использовать:

$('body').animate({ scrollTop: $(document).height() });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...