jQuery .scrollTop (); + animasyon


172

Bir düğme tıklatıldığında sayfayı en üste kayacak şekilde ayarladım. Ama önce sayfanın üst kısmının 0 olarak ayarlanıp ayarlanmadığını görmek için bir if ifadesi kullandım. Sonra 0 değilse, sayfanın üstüne gitmek için animasyonluyorum.

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

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

Zor kısım şimdi sayfanın üst kısmına kaydırıldıktan SONRA bir şey canlandırıyor. Bir sonraki düşüncem, sayfa konumunun ne olduğunu bulmak. Bu yüzden öğrenmek için konsol günlüğünü kullandım.

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

Bu bana 365'in bir sonucunu verdi, sanırım zirveye geçmeden önce bulunduğum pozisyon numarası.

Benim sorum, konumu 0 olarak nasıl ayarlayabilirim, böylece sayfa 0'a geldiğinde çalışan başka bir animasyon ekleyebilir miyim?

Teşekkürler!


1
olayı tetiklediğiniz düğmenin her zaman görünür olması gerekir mi? Değilse ben ilk durumunuz için kolay olabilir herhangi bir koşul gerekmez bir kod var
Mekanik

1
Milisaniye civarında tırnak işareti olmamalıdır. Belgelerin atıfta bulunduğu "dize" yavaş / hızlı
mplungjan

Yanıtlar:


314

Bunu yapmak için, kaydırma animasyonu bittikten sonra yürütülecek canlandır komutu için bir geri arama işlevi ayarlayabilirsiniz.

Örneğin:

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

Bu uyarı kodunun olduğu yerde, daha fazla animasyona eklemek için daha fazla javascript çalıştırabilirsiniz.

Ayrıca, hareket hızını ayarlamak için 'salıncak' vardır. Check out http://api.jquery.com/animate/ fazla bilgi için.


1
Teşekkürler Thomas, buna ihtiyacım vardı. Sınıf çok hızlı eklendiği için de bir gecikme ekledim. if (top! = 0) {console.log ("gizli kaydırma"); body.animate ({scrollTop: 0}, '500', 'swing', function () {console.log ("Animasyon tamamlandı"); leftitems.delay (1000) .removeClass ("slide");}); }
Juan Di Diego

5
Bu yazı 4 yaşında olduğundan emin değilim, ama jQuery'nin yeni sürümlerinde zamanlama etrafında bu tek tırnakları kaldırmanız gerektiğini düşünüyorum: body.animate ({scrollTop: 0}, 500, 'swing', function () {alert ("Animasyon tamamlandı");});
Andrew

27
İki öğeyi seçtiğiniz için geri aramanız bu arada iki kez yürütülür.
Büyük McLargeHuge

8
Thomas vücut ve html eklemek için iyi bir noktaya sahipti. Durum 1. Chrome okuma gövdesi ve kaydırma, FIrefox bunu yapmak için html gerekir.
fearis

4
Sadece denedim - $ ('html') Chrome'da çalışmıyor ve $ ('body') Firefox'ta çalışmıyor, bu yüzden $ ('html, body') gerekiyor. Ve ayrıca .stop () öğesini çağırmak iyi bir şey - animate'i birkaç kez hızlı bir şekilde kromda çağırmaya çalıştım ve bundan sonra sayfayı aşağı kaydıramadım.
Lev Lukomsky

55

Bu kodu deneyin:

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

8
$("html")Bunun yerine, bir geri arama işlevi eklerseniz iki kez, bir kez html için ve bir kez gövde için çağrılır . Ve bedeni kullanmak hiçbir şey yapmaz.
flawyte

10
tarayıcıya bağlı gibi görünüyor. bazılarında $ ('html') hiçbir şey yapamaz, bu yüzden her ikisini de kullanmanız ve iki kez tetiklenen geri aramaya dikkat etmeniz gerekir.
commonpike

31

Bunu kullan:

$('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

bunun için geri çağrı yöntemini kullanabilirsiniz

body.animate({
      scrollTop:0
    }, 500, 
    function(){} // callback method use this space how you like
);

7

Bunun yerine şunu deneyin:

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

Basit çözüm:

herhangi bir öğeye ID veya NAME ile kaydırma:

SmoothScrollTo("#elementId", 1000);

kod:

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 ' zaten bir parametre olarak aktarılmıştır, bu yüzden 'var' ile bildirmeye gerek yoktur. 6 karakterden daha az olduğu için bu cevabı 'düzenlemek' mümkün olmadı! ;-) +1
Anthony Walsh

@AnthonyWalsh hiçbir şekilde afaik. varküresel olanın üzerine
yazmamak

Yeterince adil ;-) Ben TypeScript kullanıyorum ve benim durumumda tüm yerel kapsam böylece zaman uzunluğu için bir parametre olarak doğrudan bir sayı geçiriyorum . Şerefe!
Anthony Walsh

4

Tıklama fonksiyonlu kod ()

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

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

}); 

.toTop= tıklanan öğenin sınıfı belki imgveyaa


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

bunu görmelisin

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

veya dene

$(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

hem CSS sınıfını hem de HTML kimliğini kullanabilirsiniz, simetrik tutmak için her zaman örneğin CSS sınıfını kullanıyorum

<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;})
});
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.