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


171

Я встановлюю сторінку, щоб прокручуватися доверху, коли натискається кнопка. Але спочатку я використав оператор 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

Відповіді:


313

Для цього можна встановити функцію зворотного дзвінка для команди анімації, яка буде виконуватися після закінчення анімації прокрутки.

Наприклад:

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

Там, де знаходиться цей попереджувальний код, ви можете виконати більше javascript, щоб додати його до подальшої анімації.

Також "гойдалка" є для встановлення послаблення. Перегляньте http://api.jquery.com/animate/ для отримання додаткової інформації.


1
Спасибі Томасе, саме це мені було потрібно. Я також додав затримку, оскільки клас додається так швидко. if (top! = 0) {console.log ("прихований прокрутка"); body.animate ({scrollTop: 0}, '500', 'swing', function () {console.log ("Готові анімації"); leftitems.delay (1000) .removeClass ("слайд");}); }
Хуан Ді Дієго

5
Я не впевнений, що це тому, що цій публікації 4 роки, але я думаю, що в нових версіях jQuery потрібно видалити ці єдині цитати навколо часу: body.animate ({scrollTop: 0}, 500, 'swing', функція () {сигнал ("Готові анімації");});
Андрій

27
До речі, ваш зворотний дзвінок буде виконуватися двічі, оскільки ви вибрали два елементи.
Big McLargeHuge

8
Томас мав гарну точку додавання body та html. Випадок 1. Тіло для читання Chrome і прокручування, FIrefox для цього потрібно html.
страхіс

4
Щойно спробував - $ ('html') не працює в Chrome, а $ ('body') не працює в Firefox, тому $ ('html, body') потрібно. А також дзвінок .stop () - хороша річ - я кілька разів намагався викликати анімацію в хромі, і після цього я не зміг прокрутити сторінку вниз.
Лев Лукомський

54

Спробуйте цей код:

$('.Classname').click(function(){
    $("html, body").animate({ scrollTop: 0 }, 600);
    return false;
});

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

Просте рішення:

прокрутка до будь-якого елемента за ідентифікатором чи іменем:

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;
    });
}

' timelength ' вже передано як параметр, тому не потрібно оголошувати його з 'var'. Змінити цю відповідь було неможливо, оскільки було менше 6 символів! ;-) +1
Ентоні Уолш

@AnthonyWalsh ніяк не afaik. varпотрібно не перезаписувати глобальну (якщо існує глобальна змінна з цим ім'ям)
Т.Тодуа

Досить справедливо ;-) Я використовую TypeScript і число безпосередньо як параметр для тривалості часу, так що вся локальна область в моєму випадку. Ура!
Ентоні Уолш

4

Код з функцією клацання ()

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

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

}); 

.toTop= клас клацнувшого елемента, можливо, imgабоa


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");
    });

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

Ви можете використовувати як 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;})
});
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.