Come scorrere su o giù nella pagina fino a un punto di ancoraggio usando jQuery?


176

Sto cercando un modo per includere un effetto diapositiva quando fai clic su un collegamento a un'ancora locale in alto o in basso nella pagina.

Vorrei qualcosa in cui hai un link in questo modo:

<a href="#nameofdivetc">link text, img etc.</a>

forse con una classe aggiunta, quindi sai che vuoi che questo link sia un link scorrevole:

<a href="#nameofdivetc" class="sliding-link">link text, img etc.</a>

Quindi se si fa clic su questo collegamento, la pagina scorre verso l'alto o verso il basso nella posizione richiesta (potrebbe essere un div, un'intestazione, una parte superiore della pagina ecc.).


Questo è quello che avevo in precedenza:

    $(document).ready(function(){
    $(".scroll").click(function(event){
        //prevent the default action for the click event
        event.preventDefault();

        //get the full url - like mysitecom/index.htm#home
        var full_url = this.href;

        //split the url by # and get the anchor target name - home in mysitecom/index.htm#home
        var parts = full_url.split("#");
        var trgt = parts[1];

        //get the top offset of the target anchor
        var target_offset = $("#"+trgt).offset();
        var target_top = target_offset.top;

        //goto that anchor by setting the body scroll top to anchor top
        $('html, body').animate({scrollTop:target_top}, 1500, 'easeInSine');
    });
});

Risposte:


427

Descrizione

Puoi farlo usando jQuery.offset()e jQuery.animate().

Dai un'occhiata alla dimostrazione di jsFiddle .

Campione

function scrollToAnchor(aid){
    var aTag = $("a[name='"+ aid +"']");
    $('html,body').animate({scrollTop: aTag.offset().top},'slow');
}

scrollToAnchor('id3');

Maggiori informazioni


52
Questo può anche essere reso generico per funzionare con tutti i collegamenti di ancoraggio interni nella pagina:$("a[href^=#]").click(function(e) { e.preventDefault(); var dest = $(this).attr('href'); console.log(dest); $('html,body').animate({ scrollTop: $(dest).offset().top }, 'slow'); });
bardo

@bardo, come dovrebbe essere implementato? Ho sostituito la soluzione di dkmaack con la tua, ma lo scorrimento non è presente (l'ancora stessa è funzionale). Cosa mi sto perdendo?
Jakub

1
@bardo aggiunge anche history.pushState(null, null, dest);come stai impedendo la modifica dell'hash della posizione predefinita
Mike Causer

7
FYI oltre a @ del bardo soluzione, si dovrebbe sfuggire l'hash quando si utilizza l'ultima jQuery in questo modo, $ ( "a [href = ^ \\ #]") stackoverflow.com/questions/7717527/...
jaegs

1
Qual è lo scopo di animare sia html che body? Sembra una situazione in cui non sappiamo cosa facciamo e facciamo semplicemente tutto. Questo potrebbe iniziare scollings multipli?
giovedì

30

Supponendo che l' attributo href sia collegato a un div con l' ID tag con lo stesso nome (come al solito), è possibile utilizzare questo codice:

HTML

<a href="#goto" class="sliding-link">Link to div</a>

<div id="goto">I'm the div</div>

JAVASCRIPT - (Jquery)

$(".sliding-link").click(function(e) {
    e.preventDefault();
    var aid = $(this).attr("href");
    $('html,body').animate({scrollTop: $(aid).offset().top},'slow');
});

1
Soluzione molto semplice ma potente, che consente un controllo completo. Penso che questa risposta dovrebbe ottenere più voti.
Cronfy,

D'accordo, questa è la soluzione migliore e mi ha aiutato molto
probabilmente il

Funziona ma vanifica lo scopo dell'uso name. Quando si utilizza <a name="something"></a>, è possibile fare riferimento anche dall'esterno, tuttavia, la soluzione non lo fornisce.
Ramtin,

8

Questo ha reso la mia vita molto più semplice. Fondamentalmente hai inserito il tuo tag id elements e lo scorre senza molto codice

http://balupton.github.io/jquery-scrollto/

In Javascript

$('#scrollto1').ScrollTo();

Nel tuo HTML

<div id="scroollto1">

Eccomi fino in fondo alla pagina


7
function scroll_to_anchor(anchor_id){
    var tag = $("#"+anchor_id+"");
    $('html,body').animate({scrollTop: tag.offset().top},'slow');
}

3
Domanda genuina, il + "" fa qualcosa nella seconda riga?
Rob,

@ Rob javascript non ha stringa di interpolazione, in modo da utilizzare +con le stringhe o vars concatena loro, come: "#some_anchor". Davvero, anchor_id + ""credo che il secondo concat non sia necessario.
onebree,

Grazie @onebree Era il secondo concerto di cui mi stavo chiedendo :)
Rob,

5

Dovresti anche considerare che il target ha un'imbottitura e quindi usare positioninvece di offset. Puoi anche tenere conto di una potenziale barra di navigazione che non desideri sovrapporre al bersaglio.

const $navbar = $('.navbar');

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

    const scrollTop =
        $($(this).attr('href')).position().top -
        $navbar.outerHeight();

    $('html, body').animate({ scrollTop });
})

IMHO la soluzione migliore perché non ha bisogno di classi aggiuntive e fastidiosi calcoli matematici nel CSS per navbar fissi
KSPR

Ma questo non riscrive il tag anchor nell'URL. Aggiungi history.pushState({}, "", this.href);per mantenere aggiornato l'URL
KSPR

3

Il mio approccio con jQuery per far scorrere semplicemente tutti i collegamenti di ancoraggio incorporati anziché saltare all'istante

È molto simile alla risposta di Santi Nunez ma è più affidabile .

Supporto

  • Ambiente multi-framework.
  • Prima che il caricamento della pagina sia terminato.
<a href="#myid">Go to</a>
<div id="myid"></div>
// Slow scroll with anchors
(function($){
    $(document).on('click', 'a[href^=#]', function(e){
        e.preventDefault();
        var id = $(this).attr('href');
        $('html,body').animate({scrollTop: $(id).offset().top}, 500);
    });
})(jQuery);


1

È possibile che si desideri aggiungere il valore offsetTop e scrollTop nel caso in cui si stia animando non l'intera pagina, ma piuttosto del contenuto nidificato.

per esempio :

var itemTop= $('.letter[name="'+id+'"]').offset().top;
var offsetTop = $someWrapper.offset().top;
var scrollTop = $someWrapper.scrollTop();
var y = scrollTop + letterTop - offsetTop

this.manage_list_wrap.animate({
  scrollTop: y
}, 1000);

0

Scorrimento lento SS

Questa soluzione non richiede tag di ancoraggio, ma ovviamente devi abbinare il pulsante menu (attributo arbitrario, ad esempio "ss") con l'id dell'elemento di destinazione nel tuo html.

ss="about" ti porta a id="about"

$('.menu-item').click(function() {
	var keyword = $(this).attr('ss');
	var scrollTo = $('#' + keyword);
	$('html, body').animate({
		scrollTop: scrollTo.offset().top
	}, 'slow');
});
.menu-wrapper {
  display: flex;
  margin-bottom: 500px;
}
.menu-item {
  display: flex;
  justify-content: center;
  flex: 1;
  font-size: 20px;
  line-height: 30px;
  color: hsla(0, 0%, 80%, 1);
  background-color: hsla(0, 0%, 20%, 1);
  cursor: pointer;
}
.menu-item:hover {
  background-color: hsla(0, 40%, 40%, 1);
}

.content-block-header {
  display: flex;
  justify-content: center;
  font-size: 20px;
  line-height: 30px;
  color: hsla(0, 0%, 90%, 1);
  background-color: hsla(0, 50%, 50%, 1);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<div class="menu-wrapper">
  <div class="menu-item" ss="about">About Us</div>
  <div class="menu-item" ss="services">Services</div>
  <div class="menu-item" ss="contact">Contact</div>
</div>

<div class="content-block-header" id="about">About Us</div>
<div class="content-block">
  Lorem ipsum dolor sit we gonna chung, crazy adipiscing phat. Nullizzle sapizzle velizzle, shut the shizzle up volutpizzle, suscipizzle quizzle, away vizzle, arcu. Pellentesque my shizz sure. Sed erizzle. I'm in the shizzle izzle funky fresh dapibus turpis tempus shizzlin dizzle. Maurizzle my shizz nibh izzle turpizzle. Gangsta izzle fo shizzle mah nizzle fo rizzle, mah home g-dizzle. I'm in the shizzle eleifend rhoncizzle fo shizzle my nizzle. In rizzle habitasse crazy dictumst. Yo dapibus. Curabitizzle tellizzle urna, pretizzle break it down, mattis izzle, eleifend rizzle, nunc. My shizz suscipit. Integer check it out funky fresh sizzle pizzle.

That's the shizzle et dizzle quis nisi sheezy mollis. Suspendisse bizzle. Morbi odio. Vivamizzle boofron. Crizzle orci. Cras mauris its fo rizzle, interdizzle a, we gonna chung amizzle, break it down izzle, pizzle. Pellentesque rizzle. Vestibulum its fo rizzle mi, volutpat uhuh ... yih!, ass funky fresh, adipiscing semper, fo shizzle. Crizzle izzle ipsum. We gonna chung mammasay mammasa mamma oo sa stuff brizzle yo. Cras ass justo nizzle purizzle sodales break it down. Check it out venenatizzle justo yo shut the shizzle up. Nunc crackalackin. Suspendisse bow wow wow placerizzle sure. Fizzle eu ante. Nunc that's the shizzle, leo eu gangster hendrerizzle, gangsta felis elementum pizzle, sizzle aliquizzle crunk bizzle luctus pede. Nam a nisl. Fo shizzle da bomb taciti gangster stuff i'm in the shizzle i'm in the shizzle per conubia you son of a bizzle, per inceptos its fo rizzle. Check it out break it down, neque izzle cool nonummy, tellivizzle orci viverra leo, bizzle semper risizzle arcu fo shizzle mah nizzle.
</div>
<div class="content-block-header" id="services">Services</div>
<div class="content-block">
Lorem ipsum dolor sit we gonna chung, crazy adipiscing phat. Nullizzle sapizzle velizzle, shut the shizzle up volutpizzle, suscipizzle quizzle, away vizzle, arcu. Pellentesque my shizz sure. Sed erizzle. I'm in the shizzle izzle funky fresh dapibus turpis tempus shizzlin dizzle. Maurizzle my shizz nibh izzle turpizzle. Gangsta izzle fo shizzle mah nizzle fo rizzle, mah home g-dizzle. I'm in the shizzle eleifend rhoncizzle fo shizzle my nizzle. In rizzle habitasse crazy dictumst. Yo dapibus. Curabitizzle tellizzle urna, pretizzle break it down, mattis izzle, eleifend rizzle, nunc. My shizz suscipit. Integer check it out funky fresh sizzle pizzle.

That's the shizzle et dizzle quis nisi sheezy mollis. Suspendisse bizzle. Morbi odio. Vivamizzle boofron. Crizzle orci. Cras mauris its fo rizzle, interdizzle a, we gonna chung amizzle, break it down izzle, pizzle. Pellentesque rizzle. Vestibulum its fo rizzle mi, volutpat uhuh ... yih!, ass funky fresh, adipiscing semper, fo shizzle. Crizzle izzle ipsum. We gonna chung mammasay mammasa mamma oo sa stuff brizzle yo. Cras ass justo nizzle purizzle sodales break it down. Check it out venenatizzle justo yo shut the shizzle up. Nunc crackalackin. Suspendisse bow wow wow placerizzle sure. Fizzle eu ante. Nunc that's the shizzle, leo eu gangster hendrerizzle, gangsta felis elementum pizzle, sizzle aliquizzle crunk bizzle luctus pede. Nam a nisl. Fo shizzle da bomb taciti gangster stuff i'm in the shizzle i'm in the shizzle per conubia you son of a bizzle, per inceptos its fo rizzle. Check it out break it down, neque izzle cool nonummy, tellivizzle orci viverra leo, bizzle semper risizzle arcu fo shizzle mah nizzle.
</div>
<div class="content-block-header" id="contact">Contact</div>
<div class="content-block">
  Lorem ipsum dolor sit we gonna chung, crazy adipiscing phat. Nullizzle sapizzle velizzle, shut the shizzle up volutpizzle, suscipizzle quizzle, away vizzle, arcu. Pellentesque my shizz sure. Sed erizzle. I'm in the shizzle izzle funky fresh dapibus turpis tempus shizzlin dizzle. Maurizzle my shizz nibh izzle turpizzle. Gangsta izzle fo shizzle mah nizzle fo rizzle, mah home g-dizzle. I'm in the shizzle eleifend rhoncizzle fo shizzle my nizzle. In rizzle habitasse crazy dictumst. Yo dapibus. Curabitizzle tellizzle urna, pretizzle break it down, mattis izzle, eleifend rizzle, nunc. My shizz suscipit. Integer check it out funky fresh sizzle pizzle.

That's the shizzle et dizzle quis nisi sheezy mollis. Suspendisse bizzle. Morbi odio. Vivamizzle boofron. Crizzle orci. Cras mauris its fo rizzle, interdizzle a, we gonna chung amizzle, break it down izzle, pizzle. Pellentesque rizzle. Vestibulum its fo rizzle mi, volutpat uhuh ... yih!, ass funky fresh, adipiscing semper, fo shizzle. Crizzle izzle ipsum. We gonna chung mammasay mammasa mamma oo sa stuff brizzle yo. Cras ass justo nizzle purizzle sodales break it down. Check it out venenatizzle justo yo shut the shizzle up. Nunc crackalackin. Suspendisse bow wow wow placerizzle sure. Fizzle eu ante. Nunc that's the shizzle, leo eu gangster hendrerizzle, gangsta felis elementum pizzle, sizzle aliquizzle crunk bizzle luctus pede. Nam a nisl. Fo shizzle da bomb taciti gangster stuff i'm in the shizzle i'm in the shizzle per conubia you son of a bizzle, per inceptos its fo rizzle. Check it out break it down, neque izzle cool nonummy, tellivizzle orci viverra leo, bizzle semper risizzle arcu fo shizzle mah nizzle.
</div>

Violino

https://jsfiddle.net/Hastig/stcstmph/4/


0

Ecco la soluzione che ha funzionato per me. Questa è una funzione generica che funziona per tutti i atag che si riferiscono a un nomea

$("a[href^=#]").on('click', function(event) { 
    event.preventDefault(); 
    var name = $(this).attr('href'); 
    var target = $('a[name="' + name.substring(1) + '"]'); 
    $('html,body').animate({ scrollTop: $(target).offset().top }, 'slow'); 
});

Nota 1: assicurarsi di utilizzare virgolette doppie " nel tuo HTML. Se usi virgolette singole, modifica la parte precedente del codice invar target = $("a[name='" + name.substring(1) + "']");

Nota 2: in alcuni casi, specialmente quando si utilizza la barra adesiva dal bootstrap, il nome asi nasconderà sotto la barra di navigazione. In questi casi (o qualsiasi caso simile), è possibile ridurre il numero di pixel dallo scorrimento per raggiungere la posizione ottimale. Ad esempio: $('html,body').animate({ scrollTop: $(target).offset().top - 15 }, 'slow');ti porterà a targetcon 15 pixel a sinistra in alto.


0

Mi sono imbattuto in questo esempio su https://css-tricks.com/snippets/jquery/smooth-scrolling/ spiegando ogni riga di codice. Ho trovato questa l'opzione migliore.

https://css-tricks.com/snippets/jquery/smooth-scrolling/

Puoi diventare nativo:

window.scroll({
  top: 2500, 
  left: 0, 
  behavior: 'smooth' 
});

window.scrollBy({ 
  top: 100, // could be negative value
  left: 0, 
  behavior: 'smooth' 
});

document.querySelector('.hello').scrollIntoView({ 
  behavior: 'smooth' 
});

o con jquery:

$('a[href*="#"]').not('[href="#"]').not('[href="#0"]').click(function(event) {

    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) {
        event.preventDefault();
        $('html, body').animate({
          scrollTop: target.offset().top
        }, 1000);
      }
    }
  });

0

Ok il metodo più semplice è: -

All'interno della funzione clic (Jquery): -

$('html,body').animate({scrollTop: $("#resultsdiv").offset().top},'slow');

HTML

<div id="resultsdiv">Where I want to scroll to</div>

-1
$(function() {
    $('a#top').click(function() {
        $('html,body').animate({'scrollTop' : 0},1000);
    });
});

Provalo qui:

http://jsbin.com/ucati4


3
Si prega di non includere firme, in particolare quelle con collegamenti ... e soprattutto quelle con collegamenti non correlati. Puoi inserire questo tipo di cose nel tuo profilo.
Andrew Barber,

La domanda posta non era come scorrere fino all'inizio della pagina, era come scorrere fino a un'ancora con un ID
user1380540

C'è un modo per usarlo in WordPress? Sto aggiungendo al mio sito ma non funziona davvero. Qui il link: scentology.burnnotice.co.za
agente utente

-1

la seguente soluzione ha funzionato per me:

$("a[href^=#]").click(function(e)
        {
            e.preventDefault();
            var aid = $(this).attr('href');
            console.log(aid);
            aid = aid.replace("#", "");
            var aTag = $("a[name='"+ aid +"']");
            if(aTag == null || aTag.offset() == null)
                aTag = $("a[id='"+ aid +"']");

            $('html,body').animate({scrollTop: aTag.offset().top}, 1000);
        }
    );
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.