jQuery .scrollTop (); + анимация

172

Я установил страницу для прокрутки вверх при нажатии кнопки. Но сначала я использовал оператор if, чтобы увидеть, не была ли верхняя часть страницы установлена ​​на 0. Затем, если это не 0, я анимирую страницу, чтобы прокрутить ее до верха.

var body = $("body");
var top = body.scrollTop() // Get position of the body

if(top!=0)
{
  body.animate({scrollTop:0}, '500');
}

Сложная часть теперь анимирует что-то ПОСЛЕ прокрутки страницы вверх. Поэтому моя следующая мысль, выяснить, какова позиция страницы. Поэтому я использовал консольный журнал, чтобы выяснить это.

console.log(top);  // the result was 365

Это дало мне результат 365, я предполагаю, что это номер позиции, в которой я находился перед прокруткой наверх.

Мой вопрос: как мне установить позицию равной 0, чтобы я мог добавить еще одну анимацию, которая запускается, когда страница становится равной 0?

Спасибо!

Хуан Ди Диего
источник
1
это нужно, чтобы те кнопки, по которым вы запускаете событие, всегда были видны? Если нет, то у меня есть код, который не требует каких-либо условий, которые могут быть легко выполнены для вашего первого условия
Механик
1
Вокруг миллисекунд не должно быть кавычек. «Строка», на которую ссылается документация, медленная / быстрая
mplungjan

Ответы:

314

Для этого вы можете установить функцию обратного вызова для команды animate, которая будет выполняться после завершения анимации прокрутки.

Например:

var body = $("html, body");
body.stop().animate({scrollTop:0}, 500, 'swing', function() { 
   alert("Finished animating");
});

Где этот код предупреждения, вы можете выполнить больше JavaScript, чтобы добавить в дальнейшую анимацию.

Кроме того, есть «качели», чтобы установить ослабление. Проверьте http://api.jquery.com/animate/ для получения дополнительной информации.

TLS
источник
1
Спасибо Томас, это то, что мне было нужно. Я также добавил задержку, поскольку класс добавляется так быстро. if (top! = 0) {console.log ("скрытая прокрутка"); body.animate ({scrollTop: 0}, '500', 'swing', function () {console.log ("Закончено анимация"); leftitems.delay (1000) .removeClass ("slide");}); }
Хуан Ди Диего
5
Я не уверен, что это потому, что этому посту 4 года, но я думаю, что в более новых версиях jQuery вам нужно убрать эти одинарные кавычки по времени: body.animate ({scrollTop: 0}, 500, 'swing', function () {alert ("Закончено анимация");});
Андрей
27
Кстати, ваш обратный вызов будет выполнен дважды, потому что вы выбрали два элемента.
Big McLargeHuge
8
У Томаса была хорошая идея добавить тело и HTML. Случай 1. Chrome читает тело и прокрутку, FIrefox нужен HTML, чтобы сделать это.
Fearis
4
Только что попробовал - $ ('html') не работает в Chrome, а $ ('body') не работает в Firefox, поэтому необходим $ ('html, body'). А также вызов .stop () - хорошая вещь - я несколько раз пытался быстро вызвать animate в chrome, и после этого я не мог прокрутить страницу вниз.
Лев Лукомский
55

Попробуйте этот код:

$('.Classname').click(function(){
    $("html, body").animate({ scrollTop: 0 }, 600);
    return false;
});
Shailesh
источник
8
$("html")следует использовать вместо этого, потому что в вашем случае, если вы добавите функцию обратного вызова, она будет вызываться дважды, один раз для html и один раз для body . И использование тела ничего не делает.
flawyte
10
Похоже, это зависит от браузера. в некоторых случаях $ ('html') может ничего не делать, поэтому вам нужно использовать оба, и позаботиться о обратном вызове, запущенном дважды.
commonpike
31

Использовать это:

$('a[href^="#"]').on('click', function(event) {

    var target = $( $(this).attr('href') );

    if( target.length ) {
        event.preventDefault();
        $('html, body').animate({
            scrollTop: target.offset().top
        }, 500);
    }

});
гудок
источник
8

для этого вы можете использовать метод обратного вызова

body.animate({
      scrollTop:0
    }, 500, 
    function(){} // callback method use this space how you like
);
Механика
источник
7

Попробуйте это вместо:

var body = $("body, html");
var top = body.scrollTop() // Get position of the body
if(top!=0)
{
       body.animate({scrollTop :0}, 500,function(){
         //DO SOMETHING AFTER SCROLL ANIMATION COMPLETED
          alert('Hello');
      });
}
Кишан Патель
источник
5

Простое решение:

прокрутка к любому элементу по ID или ИМЯ:

SmoothScrollTo("#elementId", 1000);

код:

function SmoothScrollTo(id_or_Name, timelength){
    var timelength = timelength || 1000;
    $('html, body').animate({
        scrollTop: $(id_or_Name).offset().top-70
    }, timelength, function(){
        window.location.hash = id_or_Name;
    });
}
T.Todua
источник
' timelength ' уже передан в качестве параметра, поэтому нет необходимости объявлять его с помощью 'var'. «Редактировать» этот ответ было невозможно, так как оно было менее 6 символов! ;-) +1
Энтони Уолш
@AnthonyWalsh ни в коем случае не афаик. varнеобходимо, чтобы не перезаписывать глобальную (если существует глобальная переменная с таким именем)
T.Todua
Достаточно справедливо ;-) Я использую TypeScript и передаю число непосредственно в качестве параметра для длины времени, поэтому все локальные возможности в моем случае. Ура!
Энтони Уолш
4

Код с функцией щелчка ()

    var body = $('html, body');

    $('.toTop').click(function(e){
        e.preventDefault();
        body.animate({scrollTop:0}, 500, 'swing');

}); 

.toTop= класс кликаемого элемента может быть imgилиa

Scorby
источник
4
jQuery("html,body").animate({scrollTop: jQuery("#your-elemm-id-where you want to scroll").offset().top-<some-number>}, 500, 'swing', function() { 
       alert("Finished animating");
    });
Junaid
источник
0

ты должен увидеть это

$(function () {
        $('a[href*="#"]:not([href="#"])').click(function () {
            if (location.pathname.replace(/^\//, '') == this.pathname.replace(/^\//, '') && location.hostname == this.hostname) {
                var target = $(this.hash);
                target = target.length ? target : $('[name=' + this.hash.slice(1) + ']');
                if (target.length) {
                    $('html, body').animate({
                        scrollTop: target.offset().top
                    }, 1000);
                    return false;
                }
            }
        });
    });

или попробуй их

$(function () {$('a').click(function () {
$('body,html').animate({
    scrollTop: 0
}, 600);
return false;});});
Ремал Махмуд
источник
0
$("body").stop().animate({
        scrollTop: 0
    }, 500, 'swing', function () {
        console.log(confirm('Like This'))
    }
);
Аманверма Лаки
источник
0

Вы можете использовать как класс CSS, так и идентификатор HTML, для поддержания его симметричности, я всегда использую класс CSS, например

<a class="btn btn-full js--scroll-to-plans" href="#">I’m hungry</a> 
|
|
|
<section class="section-plans js--section-plans clearfix">
$(document).ready(function () {
    $('.js--scroll-to-plans').click(function () {
        $('body,html').animate({
            scrollTop: $('.js--section-plans').offset().top
        }, 1000);
        return false;})
});
повелитель
источник