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.

StevenPHP
źródło
1
Patrzyłeś na to? stackoverflow.com/questions/3432656/...
The Vanilla Thrilla 25.09.2013
@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);
});
Kevin Lynch
źródło
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});
});
dizel3d
źródło
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>
Alexandre Mélard
źródło
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.

Bibiano Wenceslao
źródło
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>
Eugen
źródło
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>
MortalViews
źródło
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 .

Ramon Weijenbarg
źródło
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);
    });
iDanielBH
źródło
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>
JoyGuru
źródło
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>
waqas noor
źródło
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.

Y. Joy Ch. Singha
źródło
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;
  }
}
});
Mario
źródło