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.