Determine la distancia desde la parte superior de un div hasta la parte superior de la ventana con javascript

127

¿Cómo determino la distancia entre la parte superior de un div y la parte superior de la pantalla actual? Solo quiero la distancia de píxeles a la parte superior de la pantalla actual, no a la parte superior del documento. He intentado algunas cosas como .offset()y .offsetHeight, pero no puedo entenderlo. ¡Gracias!

Joel Eckroth
fuente
2
es posible que desee ver esto
Joseph
77
el.getBoundingClientRect().top+window.scrollY
Caub
3
@caub Eh, es solo el.getBoundingClientRect().top. Agregar la posición de desplazamiento se suma a la distancia hasta la parte superior del documento. developer.mozilla.org/de/docs/Web/API/Element/…
lynx
sí, solo quería unjquerify
caub

Respuestas:

239

Puede usar .offset()para obtener el desplazamiento en comparación con el documentelemento y luego usar la scrollToppropiedad del windowelemento para encontrar qué tan abajo de la página se ha desplazado el usuario:

var scrollTop     = $(window).scrollTop(),
    elementOffset = $('#my-element').offset().top,
    distance      = (elementOffset - scrollTop);

La distancevariable ahora mantiene la distancia desde la parte superior del #my-elementelemento y el pliegue superior.

Aquí hay una demostración: http://jsfiddle.net/Rxs2m/

Tenga en cuenta que los valores negativos significan que el elemento está por encima del pliegue superior.

Jaspe
fuente
¿Cómo puedo verificar si la distancia es un número específico? Quiero hacer que un elemento sea adhesivo si está a 120 px de la parte superior
Thessa Verbruggen
@ThessaVerbruggen Puede verificar la distancevariable para ver si su valor es, 120pero recomendaría verificar un rango en lugar de un número exacto. Si, por ejemplo, te desplazas con la rueda del mouse, es muy posible que saltes más de 120. Entonces, si estás tratando de aplicar algo de CSS o algo cuando el elemento está dentro de los 120 px del pliegue superior, entonces quizás lo uses if (distance < 120) { /* do something */}. Aquí hay una demostración actualizada: jsfiddle.net/na5qL91o
Jasper el
Un problema si hago esto: la parte adhesiva parpadea cuando me desplazo. Supongo que porque se recalcula cuando me desplazo. ¿Algúna idea de cómo arreglar esto? Mi código: $ (ventana) .on ('scroll', function () {var scrollTop = $ (window) .scrollTop (), elementOffset = $ ('# secundario'). Offset (). Top, distance = (elementOffset - scrollTop); if (distancia <120) {$ ('# secundario'). addClass ('adhesivo');} más {$ ('# secundario'). removeClass ('adhesivo');}});
Thessa Verbruggen el
60

Vainilla:

window.addEventListener('scroll', function(ev) {

   var someDiv = document.getElementById('someDiv');
   var distanceToTop = someDiv.getBoundingClientRect().top;

   console.log(distanceToTop);
});

Abra la consola de su navegador y desplace su página para ver la distancia.

horahore
fuente
14
Esto solo funciona si el usuario no ha desplazado la página. De lo contrario, la distanceToTopdevolución es relativa (incluso puede ser negativa si el usuario se ha desplazado más allá). Para tener esto en cuenta, usewindow.pageYOffset + someDiv.getBoundingClientRect().top
ty.
2
@ty El OP está buscando la distancia a la parte superior de la pantalla, no a la parte superior del documento - un valor negativo sería válido en este caso
Drenai
16

Esto se puede lograr únicamente con JavaScript .

Veo que la respuesta que quería escribir fue respondida por Lynx en los comentarios a la pregunta.

Pero voy a escribir la respuesta de todos modos porque, al igual que yo, la gente a veces se olvida de leer los comentarios.

Entonces, si solo desea obtener la distancia de un elemento (en píxeles) desde la parte superior de la ventana de la pantalla, esto es lo que debe hacer:

// Fetch the element
var el = document.getElementById("someElement");  

use getBoundingClientRect ()

// Use the 'top' property of 'getBoundingClientRect()' to get the distance from top
var distanceFromTop = el.getBoundingClientRect().top; 

¡Eso es!

Espero que esto ayude a alguien :)

Furqan Rahamath
fuente
1
getBoundingClient () no funciona, en su lugar .getBoundingClientRect ()
Elnoor
@Elnoor Gracias por la sugerencia :) He realizado los cambios apropiados.
Furqan Rahamath
Simplemente increíble trabajo @MohammedFurqanRahamathM. Muchas gracias por tu respuesta :) ¡Funciona de maravilla! :)
Merianos Nikos
1
@MerianosNikos Gracias. Me alegra que haya sido de ayuda :)
Furqan Rahamath
1
pero esto solo funcionaría si no se ha vuelto a cargar en el medio de la página, ¿verdad?
Sagive SEO
7

Usé esto:

                              myElement = document.getElemenById("xyz");
Get_Offset_From_Start       ( myElement );  // returns positions from website's start position
Get_Offset_From_CurrentView ( myElement );  // returns positions from current scrolled view's TOP and LEFT

código:

function Get_Offset_From_Start (object, offset) { 
    offset = offset || {x : 0, y : 0};
    offset.x += object.offsetLeft;       offset.y += object.offsetTop;
    if(object.offsetParent) {
        offset = Get_Offset_From_Start (object.offsetParent, offset);
    }
    return offset;
}

function Get_Offset_From_CurrentView (myElement) {
    if (!myElement) return;
    var offset = Get_Offset_From_Start (myElement);
    var scrolled = GetScrolled (myElement.parentNode);
    var posX = offset.x - scrolled.x;   var posY = offset.y - scrolled.y;
    return {lefttt: posX , toppp: posY };
}
//helper
function GetScrolled (object, scrolled) {
    scrolled = scrolled || {x : 0, y : 0};
    scrolled.x += object.scrollLeft;    scrolled.y += object.scrollTop;
    if (object.tagName.toLowerCase () != "html" && object.parentNode) { scrolled=GetScrolled (object.parentNode, scrolled); }
    return scrolled;
}

    /*
    // live monitoring
    window.addEventListener('scroll', function (evt) {
        var Positionsss =  Get_Offset_From_CurrentView(myElement);  
        console.log(Positionsss);
    });
    */
T.Todua
fuente
+1 para mostrar que element.offsetTop existe. element.getBoundingClientRect (). top me está dando un comportamiento extraño. Estaba buscando obtener la distancia desde la parte superior de la página web hasta la parte superior del elemento.
alexandre1985
0

Usé esta función para detectar si el elemento es visible en el puerto de vista

Código:

const vh = Math.max(document.documentElement.clientHeight || 0, window.innerHeight || 0);
$(window).scroll(function(){
var scrollTop     = $(window).scrollTop(),
elementOffset = $('.for-scroll').offset().top,
distance      = (elementOffset - scrollTop);
if(distance < vh){
    console.log('in view');
}
else{
    console.log('not in view');
}
});
Moutasim Ahmad
fuente