2009-05-16 7 views

Respuesta

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

Este método no parece funcionar con los navegadores Firefox en Mac o Linux. – hypervisor666

+1

fea alerta! ¡use console y console.log en su lugar! , de todos modos, es una buena respuesta, pero ¿cuál es el soporte del navegador de "// la mayoría de los navegadores" - o mejor IEwhatnumber + está apoyando eso? –

+0

es esta versión corta lo suficientemente correcta? 'var scrollTop = pageYOffset || (document.documentElement.clientHeight? document.documentElement.scrollTop: document.body.scrollTop); ' – Roman

-3

para ahorrar la molestia utilizar un marco como jQuery o Mootools que calcula todos estos valores en una línea (navegadores) en su mootools $ ('elemento') getTop (.); en jquery necesitarás un complemento llamado dimensiones si recuerdo correctamente aunque la mayoría de las veces, incluso sin un marco, puedes usar element.getScrollTop(); para obtener lo que necesitará el único problema es en IE7 y debajo de este cálculo es un poco problemático ya que no toma en cuenta el valor de posición del elemento por ejemplo si obtuvo una posición: atributo css absoluto para ese elemento el cálculo se realiza en el elemento principal de ese elemento

+0

FYI - La pregunta dice "Prefiero no usar ninguna biblioteca de códigos preconstruidos". Se marcó como mooTools sigue siendo una biblioteca de código preconstruido. Gracias por tomarse el tiempo para contribuir, solo lea la pregunta un poco más a fondo o su representante tendrá un golpe – iancrowther

+0

Además, otro problema con este enfoque es que si está tratando de detectarlo para la barra de desplazamiento de la ventana principal, navegadores no IE desplazará el elemento e IE se desplazará . Entonces, debes descubrir qué es 'elemento' primero. –

12

Si no desea incluir una biblioteca de JavaScript completa, a menudo puede extraer los bits que desee de uno.

Por ejemplo, esto es, esencialmente, la forma jQuery implements un desplazamiento entre navegadores (Top | Izquierda):

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: se dará cuenta de que el código anterior contiene una variable browserSupportsBoxModel que es indefinido. jQuery defines this al agregar temporalmente un div a la página y luego medir algunos atributos para determinar si el navegador implementa correctamente el modelo de caja. Como se puede imaginar, esta bandera busca IE. Específicamente, comprueba el IE 6 or 7 in quirks mode. Dado que la detección es bastante compleja, la dejé como un ejercicio para usted ;-), suponiendo que ya haya usado browserfeaturedetection en otro lugar de su código.

Editar: Si no lo ha adivinado ya, le sugiero que use una biblioteca para este tipo de cosas. La sobrecarga es un precio pequeño a pagar por un código robusto y a prueba de futuro, y cualquiera sería mucho más productivo con un marco de navegador cruzado sobre el que construir. (A diferencia de pasar incontables horas golpeando tu cabeza contra IE).

2

YUI 2.8.1 código hace esto:

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

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

Creo jQuery 1.4.2 código (un poco traducido para los seres humanos) y suponiendo que entienden lo hace correctamente esto:

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; 
} 

Desafortunadamente, extraer el valor de jQuery.support.boxModel es casi imposible porque tendrías que agregue un elemento secundario temporal en el documento y realice las mismas pruebas que jQuery.

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

Probado bien en Chrome/Safari/Firefox y IE 9, gracias! – mkoistinen

20

O simplemente simple como:

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

No funcionaría en el iPad y posiblemente en otros dispositivos/navegadores (¿Chrome?), Necesitará 'window.pageYOffset' allí. – Yeti

+2

Esto no es un navegador cruzado. – Progo

+0

Funciona para mí en * móvil * Safari 5 y 7, FireFox 31, Chrome 37, Opera 24, IE 5-11. De acuerdo con http://www.quirksmode.org/dom/w3c_cssom.html#t35 esto es * so * cross-browser. ¡Así que gracias! Short'n'easy. – flu

1

Sé que es sido bastante tiempo ya que este hilo se ha actualizado, pero esta es una función que he creado que permite a los desarrolladores para encontrar el elemento raíz de que en realidad anfitriones tiene una propiedad de trabajo "scrollTop". Probado en Chrome 42 y Firefox 37 para 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 

¡Espero que le haya sido útil! Aclamaciones.

5

He estado usando window.scrollY || document.documentElement.scrollTop.

window.scrollY cubre todos los navegadores excepto IEs.
document.documentElement.scrollTop cubre IE.

+2

La primera expresión también puede ser 'window.pageYOffset'. Menciono esto porque 'pageYOffset' parece ser más histórico, y no veo' scrollY' tan a menudo. Según MDN, son lo mismo. En cualquier caso, esta es de lejos la solución más limpia y directa, y debería preferirse porque se dirige primero a los navegadores modernos, y por lo tanto no los castiga por estar actualizados. – Manngo

+1

@Jason: Quise añadir que estaba hablando de que tu respuesta a la pregunta era la más clara y directa, en lugar de mi comentario anterior. – Manngo

1

Esto funciona bien desde IE5 a IE11. También es compatible con todos los principales navegadores nuevos.

var scrollTop = (document.documentElement && document.documentElement.scrollTop) || 
       (document.body.scrollTop) || (document.scrollingElement); 
Cuestiones relacionadas