2009-05-16 10 views

risposta

84
function getScrollTop(){ 
    if(typeof pageYOffset!= 'undefined'){ 
     //most browsers except IE before #9 
     return pageYOffset; 
    } 
    else{ 
     var B= document.body; //IE 'quirks' 
     var D= document.documentElement; //IE with doctype 
     D= (D.clientHeight)? D: B; 
     return D.scrollTop; 
    } 
} 

alert(getScrollTop()) 
+4

Questo metodo non sembra funzionare con i browser Firefox su Mac o Linux. – hypervisor666

+1

allarme brutto! usa invece console e console.log! , comunque buona risposta, ma quali sono il supporto del browser del "// maggior parte dei browser" - o meglio di IEwhatnumber + che lo supporta? –

+0

questa versione breve è abbastanza corretta? 'var scrollTop = pageYOffset || (document.documentElement.clientHeight? document.documentElement.scrollTop: document.body.scrollTop); ' – Roman

-3

a voi salvare tutti i problemi utilizzare un framework come jQuery o mootools che calcola tutti i valori in una sola riga (cross browser) in MooTools sua $ ('elemento') getTop().; in jquery avrete bisogno di un plug-in chiamato dimensioni se ricordo correttamente sebbene la maggior parte delle volte anche senza un framework si possa effettivamente usare element.getScrollTop(); l'unico problema è su IE7 e sotto questo calcolo è un po 'buggy in quanto non prende il valore di posizione dell'elemento in considerazione per esempio se hai ottenuto una posizione: attributo css assoluto per quell'elemento il calcolo viene eseguito sull'elemento padre di quell'elemento

+0

FYI - La domanda indica "Preferisco non utilizzare alcuna libreria di codici precostruita". Sei stato marcato come mooTools è ancora una libreria di codici precostruita. Grazie per il tempo dedicato al contributo, ti preghiamo di leggere la domanda un po 'più a fondo o il tuo rappresentante avrà un successo – iancrowther

+0

Inoltre, un altro problema con questo approccio è che se stai cercando di rilevarlo per la barra di scorrimento della finestra principale, i browser non IE scorrerà l'elemento e IE scorrerà . Quindi, devi capire quale 'elemento' è il primo. –

12

Se non si desidera includere un'intera libreria JavaScript, è possibile estrarre spesso i bit desiderati da uno.

Ad esempio, questo è essenzialmente come un rotolo jQuery implements cross-browser (Top | Sinistra):

function getScroll(method, element) { 
    // The passed in `method` value should be 'Top' or 'Left' 
    method = 'scroll' + method; 
    return (element == window || element == document) ? (
    self[(method == 'scrollTop') ? 'pageYOffset' : 'pageXOffset'] || 
    (browserSupportsBoxModel && document.documentElement[method]) || 
    document.body[method] 
) : element[method]; 
} 
getScroll('Top', element); 
getScroll('Left', element); 

Nota: si noterà che il codice di cui sopra contiene una variabile browserSupportsBoxModel, che non è definito. jQuery defines this aggiungendo temporaneamente un div alla pagina e quindi misurando alcuni attributi per determinare se il browser implementa correttamente il modello box. Come puoi immaginare questo flag controlla per IE. In particolare, controlla IE 6 or 7 in quirks mode. Poiché la rilevazione è piuttosto complessa, l'ho lasciata come esercizio per te ;-), supponendo che tu abbia già utilizzato browserfeaturedetection altrove nel tuo codice.

Modifica: Se non l'hai già indovinato, ti consiglio caldamente di utilizzare una libreria per questo tipo di cose. L'overhead è un piccolo prezzo da pagare per un codice robusto e a prova di futuro e chiunque sarebbe molto più produttivo con una struttura cross-browser su cui basarsi. (Al contrario di spendere infinite ore sbattendo la testa contro IE).

2

YUI 2.8.1 codice fa questo:

function getDocumentScrollTop(doc) 
{ 
    doc = doc || document; 

    //doc.body.scrollTop is IE quirkmode only 
    return Math.max(doc.documentElement.scrollTop, doc.body.scrollTop); 
} 

Penso jQuery 1.4.2 codice (un po 'tradotto per gli esseri umani) e supponendo ho capito lo fa correttamente questo:

function getDocumentScrollTop(doc) 
{ 
    doc = doc || document; 
    win = doc.defaultView || doc.parentWindow; //parentWindow is for IE < 9 

    result = 0; 
    if("pageYOffset" in win) //I'don't know why they use this, probably they tested it to be faster than doing: if(typeof win.pageYOffset !== 'undefined') 
     result = win.pageYOffset; 
    else 
     result = (jQuery.support.boxModel && document.documentElement.scrollTop) || 
       document.body.scrollTop; 

    return result; 
} 

Unfortunatley che estrae il valore di jQuery.support.boxModel è quasi impossibile perché si dovrebbe aggiungi un elemento figlio temporaneo nel documento e fai gli stessi test di jQuery.

5
function getSize(method) { 
    return document.documentElement[method] || document.body[method]; 
} 
getSize("scrollTop"); 
+0

Testato bene in Chrome/Safari/Firefox e IE 9, grazie! – mkoistinen

20

O solo semplice come:

var scrollTop = document.body.scrollTop || document.documentElement.scrollTop; 
+4

Non funzionerebbe su iPad e possibilmente su altri dispositivi/browser (Chrome?), Avrete bisogno di 'window.pageYOffset'. – Yeti

+2

Non è un browser incrociato. – Progo

+0

Funziona per me in * mobile * Safari 5 e 7, FireFox 31, Chrome 37, Opera 24, IE 5-11. Secondo http://www.quirksmode.org/dom/w3c_cssom.html#t35 questo è * così * cross-browser. Quindi grazie! Short'n'easy. – flu

1

lo so suo stato un bel po 'che questa discussione è stata aggiornata, ma questa è una funzione che ho creato che consente agli sviluppatori per trovare l'elemento principale che in realtà gli host ha una proprietà "scrollTop" funzionante. Testato su Chrome 42 e Firefox 37 per Mac OS X (10.9.5):

function getScrollRoot(){ 
    var html = document.documentElement, body = document.body, 
     cacheTop = ((typeof window.pageYOffset !== "undefined") ? window.pageYOffset : null) || body.scrollTop || html.scrollTop, // cache the window's current scroll position 
     root; 

    html.scrollTop = body.scrollTop = cacheTop + (cacheTop > 0) ? -1 : 1; 
    // find root by checking which scrollTop has a value larger than the cache. 
    root = (html.scrollTop !== cacheTop) ? html : body; 

    root.scrollTop = cacheTop; // restore the window's scroll position to cached value 

    return root; // return the scrolling root element 
} 

// USAGE: when page is ready: create a global variable that calls this function. 

var scrollRoot = getScrollRoot(); 

scrollRoot.scrollTop = 10; // set the scroll position to 10 pixels from the top 
scrollRoot.scrollTop = 0; // set the scroll position to the top of the window 

Spero che questo utile! Saluti.

5

Sto usando window.scrollY || document.documentElement.scrollTop.

window.scrollY copre tutti i browser tranne IE.
document.documentElement.scrollTop copre IE.

+2

La prima espressione può anche essere 'window.pageYOffset'. Lo dico perché 'pageYOffset' sembra essere più storico, e non vedo' scrollY' abbastanza spesso. Secondo MDN, sono uguali. In ogni caso, questa è di gran lunga la soluzione più pulita e più diretta, e dovrebbe essere preferita perché si rivolge prima ai browser moderni, quindi non li punisce per essere aggiornati. – Manngo

+1

@Jason: intendevo aggiungere che stavo parlando della tua risposta alla domanda come la più pulita e diretta, piuttosto che il mio commento precedente. – Manngo

1

Questo funziona bene da IE5 a IE11. Supporta anche tutti i principali nuovi browser.

var scrollTop = (document.documentElement && document.documentElement.scrollTop) || 
       (document.body.scrollTop) || (document.scrollingElement); 
Problemi correlati