2013-11-20 19 views
13

ho un contenitore di scorrimento con un'altezza hard coded:elemento di scorrimento in vista in un contenitore scorrevole

.scrollingContainer { 
    overflow: scroll; 
    height: 400px; 
} 

Questo contenitore scorrimento contiene un elenco di voci, quando si fa clic sulla voce che voglio far scorrere il contenitore in modo che l'elemento cliccato si trova nella parte superiore del contenitore a scorrimento.

$('.scrollingContainer li a').click(function(event) { 
    var vpHeight = $('.scrollingContainer').height(); 
    var offset = $(this).offset(); 
    $('.scrollingContainer').animate({ 
    scrollTop: vpHeight - offset.top 
    }, 500); 
}); 

Sopra è quello che ho attualmente, ho problemi con il calcolo matematico che devo eseguire. Inoltre, penso che il valore var offset non sia corretto in quanto sembra ottenere l'offset dalla parte superiore della pagina in cui speravo di ottenere il valore di offset in base alla sua posizione nel contenitore a scorrimento.

Qualsiasi aiuto apprezzato!

+0

Ecco un violino. Dimostra il problema? Sembra funzionare. http://jsfiddle.net/isherwood/LqQGR – isherwood

+0

Sì, il problema è che in realtà non sto controllando la posizione verso cui scorre. Inoltre, se clicco due volte, scorre due volte anziché rimanere nella posizione precedente. – CLiown

+0

Questa domanda non è stata risolta? – isherwood

risposta

2

Ecco un esempio: http://jsfiddle.net/LqQGR/12/

Si desidera impostare lo scrollTop alla posizione del elemento (la distanza tra la parte superiore del contenitore e il link) più la corrente scrollTop (la distanza tra la parte superiore il conteneva contenuti e il luogo corrente e 'visibile

anche:.. è necessario impostare la vostra scrollingContainer a position: relative in modo che sia l'offset parent del contenuto all'interno

var $scrollingContainer = $('.scrollingContainer'); 

$scrollingContainer.on('click', 'a', function (event) { 
    var vpHeight = $scrollingContainer.height(); 
    var scrollTop = $scrollingContainer.scrollTop(); 
    var link = $(event.currentTarget); 
    var position = link.position(); 

    $('.scrollingContainer').animate({ 
     scrollTop: (position.top + scrollTop) 
    }, 500); 
}); 
+0

Hahaha, qualcosa di abbastanza semplice ci stava facendo inciampare, e non me ne sono accorto perché l'esempio che avevi funzionato per sbaglio era perfetto. È necessario impostare lo scrollingContainer in posizione: relativo in modo che sia il padre sfalsato. Ho aggiornato la mia risposta, perché ora è ancora più semplice. – Nate

+1

A proposito, la mia risposta è superiore a quella in cui si aggiungono i listener di eventi dei clic a tutti i tag di ancoraggio singolarmente. Questo aggiunge solo un ascoltatore, che è più performante. Puoi leggere ulteriori informazioni sugli eventi delegati qui: http://api.jquery.com/on/#direct-and-delegated-events – Nate

+0

Btw, solo ora mi sono reso conto che tu fossi un altro risponditore, non il richiedente della domanda originale. Spero che i miei commenti abbiano un senso in più. Scusate! – Nate

39

Una variante del this answer fa il trucco:

http://jsfiddle.net/isherwood/LqQGR/14

var myContainer = $('.scrollingContainer') 

$(myContainer).on('click', 'a', function() { 
    var scrollTo = $(this); 
    myContainer.animate({ 
     scrollTop: scrollTo.offset().top - myContainer.offset().top + myContainer.scrollTop() 
    }); 
});