Come ottenere la posizione della barra di scorrimento con Javascript?


191

Sto cercando di rilevare la posizione della barra di scorrimento del browser con JavaScript per decidere dove si trova la pagina corrente. La mia ipotesi è che devo rilevare dove si trova il pollice sulla traccia e quindi l'altezza del pollice in percentuale dell'altezza totale della traccia. Lo sto complicando troppo o JavaScript offre una soluzione più semplice di quella? Qualche idea in termini di codice?

Risposte:


210

È possibile utilizzare element.scrollTope element.scrollLeftper ottenere l'offset verticale e orizzontale, rispettivamente, che è stato fatto scorrere. elementpuò essere document.bodyse ti interessa l'intera pagina. Puoi confrontarlo con element.offsetHeighte element.offsetWidth(di nuovo, elementpotrebbe essere il corpo) se hai bisogno di percentuali.


2
Quale browser utilizzate? Ottenere il corpo è fatto in modo diverso nei diversi browser ( elemented document.bodyerano solo esempi). Vedi howtocreate.co.uk/tutorials/javascript/browserwindow per i dettagli.
Max Shawabkeh,

8
L'ho preso per darmi il valore corretto su Firefox 3.6 window.pageYOffset, ma non riesco a far funzionare nulla su IE7. Provato window.pageYOffset, document.body.scrollTop, document.documentElement.scrollTop,element.scrollTop
Paul

1
scrollTop ha funzionato solo per me quando ho aggiunto parentesi ... $ (". scrollBody"). scrollTop ()
maia,

9
Se hai a che fare con l'elemento 'window', puoi usare window.scrollY invece di window.scrollTop
Janis Jansen il

6
Penso che la posizione di scorrimento non sia impostata document.bodynella maggior parte dei browser moderni - di solito è impostata document.documentElementora. Vedi bugs.chromium.org/p/chromium/issues/detail?id=157855 per la transizione di Chrome.
fzzfzzfzz,

134

L'ho fatto per un <div>su Chrome.

element .scrollTop - sono i pixel nascosti in alto a causa dello scorrimento. Senza scorrimento il suo valore è 0.

element .scrollHeight - è il pixel dell'intero div.

element .clientHeight - è i pixel che vedi nel tuo browser.

var a = element.scrollTop;

sarà la posizione.

var b = element.scrollHeight - element.clientHeight;

sarà il valore massimo per scrollTop .

var c = a / b;

sarà la percentuale di scorrimento [da 0 a 1] .


3
Questo è quasi giusto. per var b dovresti sottrarre window.innerHeight non element.clientHeight.
Kahless

51
document.getScroll = function() {
    if (window.pageYOffset != undefined) {
        return [pageXOffset, pageYOffset];
    } else {
        var sx, sy, d = document,
            r = d.documentElement,
            b = d.body;
        sx = r.scrollLeft || b.scrollLeft || 0;
        sy = r.scrollTop || b.scrollTop || 0;
        return [sx, sy];
    }
}

restituisce un array con due numeri interi- [scrollLeft, scrollTop]


4
Mostrare come usare questa funzione con un esempio sarebbe stato grandioso.
user18490

1
Immagino che tu possa usare this lastscroll = getScroll (); window.scrollTo (lastscroll [0], lastscroll [1]);
Dinesh Rajan,

Funziona benissimo ma ho cambiato il ritorno a un oggetto con i tasti xey poiché questo ha un po 'più senso per me.
xd6_

A seguito del commento di @ user18490.
Davide Cannizzo,

Errore di riferimento: impossibile trovare la variabile: elemento
Jonny

33

è così :)

window.addEventListener("scroll", function (event) {
    var scroll = this.scrollY;
    console.log(scroll)
});

12

Risposta per il 2018 :

Il modo migliore per fare cose del genere è utilizzare l' API di Intersection Observer .

L'API di Intersection Observer fornisce un modo per osservare in modo asincrono i cambiamenti nell'intersezione di un elemento target con un elemento antenato o con la vista di un documento di livello superiore.

Storicamente, rilevare la visibilità di un elemento o la relativa visibilità di due elementi l'uno rispetto all'altro, è stato un compito difficile per il quale le soluzioni sono state inaffidabili e inclini a causare il rallentamento del browser e dei siti a cui l'utente accede. Sfortunatamente, con la maturità del web, è cresciuta la necessità di questo tipo di informazioni. Le informazioni sull'intersezione sono necessarie per molte ragioni, come ad esempio:

  • Caricamento lento di immagini o altri contenuti durante lo scorrimento di una pagina.
  • Implementazione di siti Web a "scorrimento infinito", in cui sempre più contenuti vengono caricati e resi durante lo scorrimento, in modo che l'utente non debba sfogliare le pagine.
  • Segnalazione della visibilità degli annunci pubblicitari al fine di calcolare le entrate pubblicitarie.
  • Decidere se eseguire o meno attività o processi di animazione in base alla visualizzazione o meno del risultato da parte dell'utente.

L'implementazione del rilevamento delle intersezioni in passato implicava gestori di eventi e cicli che chiamavano metodi come Element.getBoundingClientRect () per creare le informazioni necessarie per ogni elemento interessato. Poiché tutto questo codice viene eseguito sul thread principale, anche uno di questi può causare problemi di prestazioni. Quando un sito viene caricato con questi test, le cose possono diventare davvero brutte.

Vedi il seguente esempio di codice:

var options = {
  root: document.querySelector('#scrollArea'),
  rootMargin: '0px',
  threshold: 1.0
}

var observer = new IntersectionObserver(callback, options);

var target = document.querySelector('#listItem');
observer.observe(target);

La maggior parte dei browser moderni supporta IntersectionObserver , ma è necessario utilizzare il polyfill per la compatibilità con le versioni precedenti.



3

Se stai usando jQuery c'è una funzione perfetta per te: .scrollTop ()

doc qui -> http://api.jquery.com/scrollTop/

nota: è possibile utilizzare questa funzione per recuperare O impostare la posizione.

vedi anche: http://api.jquery.com/?s=scroll


25
Perché rispondere a una domanda su JS con una libreria per JS, quando è completamente possibile e persino conveniente farlo in JS grezzo? Gli stai solo chiedendo di aggiungere ulteriore tempo di caricamento e di utilizzare un po 'di spazio di archiviazione per qualcosa di completamente inutile. Inoltre, da quando javascript ha iniziato a significare JQuery?
DaemonOfTheWest,

4
se chiedi individualmente non mi è mai piaciuta jQuery e non ho risposto a questa domanda ma in Vanilla JS ci sono già le risposte fornite da altri compagni, allora qual è il problema se qualcuno ha aggiunto una spezia saporita in questo thread. (Ha già detto che se stai usando jQuery)
Ravinder Payal

@ R01010010 è perché oggi JQuery è inutile e controproducente, tutte le funzionalità di JQuery sono facilmente implementabili con VanilaJS, inoltre ti fai affidamento su ciò che è all'interno di JQuery, con le nuove funzionalità disponibili in VanillsaJS, tu come programmatore, non aggiornerai, solo come esempio , al giorno d'oggi c'è una nuova API in VanillaJS chiamata fetch che ha sostituito il vecchio XHR, se tu fossi semplicemente nel mondo di JQuery non vedrai mai i benefici del fetch e continuerai a usare jQuery.ajax (). La mia opinione personale è che le persone che continuano usando JQuery è perché hanno smesso di imparare. Anche VanillaJS è più veloce vanilla-js.com
John Balvin Arias il

@JohnBalvinArias parlando di fetch, come va su ie11 o addirittura Edge?
Ben

Correggimi se sbaglio, ma il recupero non funziona correttamente su "moderno" cioè, e cioè è ancora ampiamente usato. Se usassi jquery, difficilmente sarei incoraggiato ad andare avanti
Ben

3

Ecco l'altro modo per ottenere la posizione di scorrimento

const getScrollPosition = (el = window) => ({
  x: el.pageXOffset !== undefined ? el.pageXOffset : el.scrollLeft,
  y: el.pageYOffset !== undefined ? el.pageYOffset : el.scrollTop
});

0

Penso che la seguente funzione possa aiutare ad avere valori di coordinate di scorrimento:

const getScrollCoordinate = (el = window) => ({
  x: el.pageXOffset || el.scrollLeft,
  y: el.pageYOffset || el.scrollTop,
});

Ho avuto questa idea da questa risposta con un piccolo cambiamento.

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.