Płynne przewijanie do div id jQuery


248

Próbowałem uzyskać przewijanie do kodu jquery div id, aby działać poprawnie. Na podstawie innego pytania dotyczącego przepełnienia stosu wypróbowałem następujące

DEMO http://jsfiddle.net/kevinPHPkevin/8tLdq/

$('#myButton').click(function() {
   $.scrollTo($('#myDiv'), 1000);
});

Ale to nie zadziałało. Po prostu przyciąga do div. Też próbowałem

$('#myButton').click(function(event) {
     event.preventDefault();
   $.scrollTo($('#myDiv'), 1000);
});

Bez postępu.



@TheVanillaThrilla zrobiłem ale wydawało się zbyt nadęty dla pojedynczego wykorzystania łącza
StevenPHP

1
@StevenPHP, zastąpiłem kod JavaScript w twoim przykładzie zgodnie z moją odpowiedzią stackoverflow.com/a/26129950/947687 . I działa jsfiddle.net/8tLdq/643 .
dizel3d

OP jest stary, ale udostępnię ten post innym osobom pochodzącym z SE. Oto artykuł dzielący prostą funkcję rozwiązującą problem: smartik.ws/2015/01/...
Andrew Surdu

Odpowiedzi:


667

Musisz animować html, body

DEMO http://jsfiddle.net/kevinPHPkevin/8tLdq/1/

$("#button").click(function() {
    $('html, body').animate({
        scrollTop: $("#myDiv").offset().top
    }, 2000);
});

9
@vector Mam jeden problem, po kliknięciu muszę walczyć z jquery, aby przewinąć w górę, jakieś rozwiązanie?
TakItsMe

@yitsitsme ... w górę lub w dół w moim przypadku
Gray Spectrum

@GraySpectrum w górę, tylko zaraz po kliknięciu, brzmi jak opóźnienie.
TakItsMe

1
Mam to samo pytanie, co jeśli mam kilka przycisków, które muszą przewijać w inne miejsca, próbowałem zmodyfikować ten kod, ale to nie działa. Czy możesz podać inny przykład?
Upiorny władca,

Znaleziono dla niego „poprawkę”. Przewijanie odpowiedniego elementu jest teraz naprawione, ale nadal przesuwa się w górę i w dół, klikając ten sam cel „przewiń do”: var target = $(this).data("target"); $(".basics-content").animate({scrollTop: $(target).offset().top}, 1000); });Objaśnienie: .basics-contentjest wewnętrznym div modalu, do którego faktycznie chcę przewijać, podając targetnumer identyfikacyjny elementu ...
Roland

111

Jeśli chcesz zastąpić standardową nawigację href-id na stronie bez zmiany znaczników HTML w celu płynnego przewijania , skorzystaj z tego ( przykład ):

// handle links with @href started with '#' only
$(document).on('click', 'a[href^="#"]', function(e) {
    // target element id
    var id = $(this).attr('href');

    // target element
    var $id = $(id);
    if ($id.length === 0) {
        return;
    }

    // prevent standard hash navigation (avoid blinking in IE)
    e.preventDefault();

    // top position relative to the document
    var pos = $id.offset().top;

    // animated top scrolling
    $('body, html').animate({scrollTop: pos});
});

3
Działa to dobrze, mogę zaproponować bardzo mały uszczypnąć var pos = $(id).offset().top;może byćvar pos = $id.offset().top;
Davey

Bardzo dobrze. Jeśli chcesz, aby tak się stało tylko w przypadku niektórych linków (powiedz, że masz coś do pokazania lub ukrycia informacji), po prostu dodaj do nich nazwę klasy i przypisz nazwę swojej klasy (powiedzmy scroller) na końcu deklaracji dopasowania (np. [Href ^ = "#"]. scroller).
Kaper

Jak to zrobić bez jQuery?
Vadorequest,

21

oto moje 2 centy:

JavaScript:

$('.scroll').click(function() {
    $('body').animate({
        scrollTop: eval($('#' + $(this).attr('target')).offset().top - 70)
    }, 1000);
});

HTML:

<a class="scroll" target="contact">Contact</a>

a cel:

<h2 id="contact">Contact</h2>

Szwy działają tylko wtedy, gdy nie zadeklarujesz typu dokumentu.
David Martins

6
Do czego tu służy eval?
Widzimy

Myślę, że trzeba $('html, body').animateprzewijać
Irshad Khan

6

Oto, czego używam:

<!-- jquery smooth scroll to id's -->   
<script>
$(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
        }, 500);
        return false;
      }
    }
  });
});
</script>

Zaletą tego jest to, że możesz używać nieograniczonej liczby łączy mieszających i odpowiadających im identyfikatorów bez konieczności wykonywania nowego skryptu dla każdego z nich.

Jeśli używasz WordPress, wstaw kod do footer.phppliku motywu tuż przed zamykającym znacznikiem body </body>.

Jeśli nie masz dostępu do plików motywu, możesz osadzić kod bezpośrednio w edytorze postów / stron (musisz edytować post w trybie tekstowym) lub w widżecie tekstowym, który załaduje się na wszystkich stronach.

Jeśli używasz innego CMS lub tylko HTML, możesz wstawić kod w sekcji, która ładuje się na wszystkich stronach tuż przed zamykającym znacznikiem body </body>.

Jeśli potrzebujesz więcej informacji na ten temat, sprawdź mój szybki post tutaj: jQuery gładkie przewiń do id

Mam nadzieję, że to pomoże, i daj mi znać, jeśli masz pytania na ten temat.


Uwielbiam to, jak proste i waniliowe, idealne.
DoPeT,

5

jeszcze jeden przykład:

Link HTML:

<a href="#featured" class="scrollTo">Learn More</a>

JS:

  $(".scrollTo").on('click', function(e) {
     e.preventDefault();
     var target = $(this).attr('href');
     $('html, body').animate({
       scrollTop: ($(target).offset().top)
     }, 2000);
  });

Kotwica HTML:

  <div id="featured">My content here</div>

3

czy jesteś pewien, że ładujesz plik jQuery scrollTo Plugin?

może pojawić się obiekt: nie znaleziono metody Błąd „scrollTo” w konsoli.

metoda scrollTO nie jest rodzimą metodą jquery. aby go użyć, musisz dołączyć zwój jquery do pliku wtyczki.

ref: http://flesler.blogspot.in/2009/05/jqueryscrollto-142-released.html http://flesler.blogspot.in/2007/10/jqueryscrollto.html

soln: dodaj to w sekcji head.

<script src="\\path\to\the\jquery.scrollTo.js file"></script>

To powinna być zaakceptowana odpowiedź. Kod w pytaniu jest poprawny i działa dobrze. Wygląda na to, że wtyczka scrollTo nie działa / nie działała. . Nie pytał o różne sposoby zrobienia czegoś podobnego.
Chris Kavanagh,

3

Ten skrypt jest ulepszeniem skryptu Vector. Wprowadziłem niewielką zmianę. Więc ten skrypt działa dla każdego linku z przewijaniem strony klasy.

Na początku bez luzowania:

$("a.page-scroll").click(function() {
    var targetDiv = $(this).attr('href');
    $('html, body').animate({
        scrollTop: $(targetDiv).offset().top
    }, 1000);
});

Do ułatwienia potrzebujesz interfejsu użytkownika Jquery:

<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js"></script>

Dodaj to do skryptu:

'easeOutExpo'

Finał

$("a.page-scroll").click(function() {
    var targetDiv = $(this).attr('href');
    $('html, body').animate({
        scrollTop: $(targetDiv).offset().top
    }, 1000, 'easeOutExpo');
});

Wszystkie wygładzanie można znaleźć tutaj: Ściągawka .


3

Ten kod będzie przydatny dla każdego wewnętrznego linku w sieci

    $("[href^='#']").click(function() {
        id=$(this).attr("href")
        $('html, body').animate({
            scrollTop: $(id).offset().top
        }, 2000);
    });


1

Możesz to zrobić za pomocą następującego prostego kodu jQuery.

Samouczek, wersja demonstracyjna i kod źródłowy można znaleźć tutaj - Płynne przewijanie do div za pomocą jQuery

JavaScript:

$(function() {
    $('a[href*=#]:not([href=#])').click(function() {
        var target = $(this.hash);
        target = target.length ? target : $('[name=' + this.hash.substr(1) +']');
        if (target.length) {
            $('html,body').animate({
              scrollTop: target.offset().top
            }, 1000);
            return false;
        }
    });
});

HTML:

<a href="#section1">Go Section 1</a>
<div id="section1">
    <!-- Content goes here -->
</div>

1

Tutaj próbowałem tego, który działa dla mnie świetnie.

$('a[href*="#"]').on('click', function (e) {
    e.preventDefault();

    $('html, body').animate({
        scrollTop: $($(this).attr('href')).offset().top
    }, 500, 'linear');
});

HTML:

 <a href="#fast-food" class="active" data-toggle="tab" >FAST FOOD</a>

<div id="fast-food">
<p> Scroll Here... </p>
  </div>

Co różni się w twojej odpowiedzi?
yunandtidus


0

To mi działa.

<div id="demo">
        <h2>Demo</h2>
</div>
<script src="https://code.jquery.com/jquery-1.10.2.js"></script>
<script>
    $(document).ready(function () {
        // Handler for .ready() called.
        $('html, body').animate({
            scrollTop: $('#demo').offset().top
        }, 'slow');
    });
</script>

Dzięki.


0

Oto moje rozwiązanie, aby płynnie przewijać do div / anchor za pomocą jQuery w przypadku, gdy masz ustalony nagłówek, aby nie przewijał się pod nim. Działa również, jeśli podłączysz go z innej strony.

Po prostu zamień „.site-header” na div, który zawiera twój nagłówek.

$(function() {

$('a[href*="#"]:not([href="#"])').click(function() {
var headerheight = $(".site-header").outerHeight();
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 - headerheight)
    }, 1000);
    return false;
  }
}
});

//Executed on page load with URL containing an anchor tag.
if($(location.href.split("#")[1])) {
var headerheight = $(".site-header").outerHeight();
  var target = $('#'+location.href.split("#")[1]);
  if (target.length) {
    $('html,body').animate({
      scrollTop: target.offset().top - headerheight
    }, 1);
    return false;
  }
}
});
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.