Determina la distanza dalla cima di un div alla cima della finestra con javascript


127

Come posso determinare la distanza tra la cima di un div e la cima della schermata corrente? Voglio solo la distanza in pixel dalla parte superiore della schermata corrente, non dalla parte superiore del documento. Ho provato alcune cose come .offset()e .offsetHeight, ma non riesco proprio a farci impazzire. Grazie!


2
ti consigliamo di dare un'occhiata
Joseph

7
el.getBoundingClientRect().top+window.scrollY
Caub

3
@caub Eh, è solo el.getBoundingClientRect().top. L'aggiunta della posizione di scorrimento aumenta la distanza dalla parte superiore del documento. developer.mozilla.org/de/docs/Web/API/Element/…
lynx

sì, volevo solo sminuire
caub

Risposte:


239

È possibile utilizzare .offset()per ottenere l'offset rispetto documentall'elemento e quindi utilizzare la scrollTopproprietà windowdell'elemento per trovare fino a che punto della pagina l'utente ha effettuato lo scorrimento:

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

La distancevariabile ora mantiene la distanza dalla parte superiore #my-elementdell'elemento e dalla piega superiore.

Ecco una demo: http://jsfiddle.net/Rxs2m/

Si noti che i valori negativi indicano che l'elemento si trova sopra la piega superiore.


Come posso verificare se la distanza è un numero specifico? Voglio rendere un elemento appiccicoso se è a 120px dalla cima
Thessa Verbruggen,

@ThessaVerbruggen Puoi controllare la distancevariabile per vedere se il suo valore è, 120ma consiglierei di verificare un intervallo anziché un numero esatto. Se, ad esempio, scorri con una rotellina del mouse, potresti benissimo saltare oltre 120. Quindi, se stai cercando di applicare un po 'di CSS o qualcosa quando l'elemento si trova entro 120px dalla piega superiore, allora potresti usare if (distance < 120) { /* do something */}. Ecco una demo aggiornata: jsfiddle.net/na5qL91o
Jasper

Un problema se lo faccio: la parte adesiva lampeggia quando scorro. Immagino perché ricalcola quando scorro. Qualche idea su come risolvere questo problema? Il mio codice: $ (window) .on ('scroll', function () {var scrollTop = $ (window) .scrollTop (), elementOffset = $ ('# secondario'). Offset (). Top, distance = (elementOffset - scrollTop); if (distanza <120) {$ ('# secondario'). addClass ('sticky');} else {$ ('# secondario'). removeClass ('sticky');}});
Thessa Verbruggen,

60

Vaniglia:

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

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

   console.log(distanceToTop);
});

Apri la console del browser e scorri la pagina per vedere la distanza.


14
Funziona solo se l'utente non ha fatto scorrere la pagina. Altrimenti distanceToToprestituito è relativo (può anche essere negativo se l'utente è passato oltre). Per tenerne conto, utilizzarewindow.pageYOffset + someDiv.getBoundingClientRect().top
ty.

2
@ty L'OP sta cercando la distanza dalla parte superiore dello schermo, non dalla parte superiore del documento - un valore negativo sarebbe valido in questo caso
Drenai

16

Ciò può essere ottenuto esclusivamente con JavaScript .

Vedo che la risposta che volevo scrivere ha ricevuto una risposta dalla lince nei commenti alla domanda.

Ma scriverò comunque una risposta perché, proprio come me, a volte le persone dimenticano di leggere i commenti.

Quindi, se vuoi solo ottenere la distanza di un elemento (in Pixel) dalla parte superiore della finestra dello schermo, ecco cosa devi fare:

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

usa getBoundingClientRect ()

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

Questo è tutto!

Spero che questo aiuti qualcuno :)


1
getBoundingClient () non funziona, invece .getBoundingClientRect ()
Elnoor,

@Elnoor Grazie per il suggerimento :) Ho apportato le modifiche appropriate.
Furqan Rahamath,

Semplicemente fantastico lavoro @MohammedFurqanRahamathM. Grazie mille per la tua risposta :) Funziona come un fascino !! :)
Merianos Nikos,

1
@MerianosNikos Grazie. Sono contento che sia stato di aiuto :)
Furqan Rahamath,

1
ma questo funzionerebbe solo se non sei stato ricaricato nel mezzo della pagina giusto?
Sagive SEO

7

Ho usato questo:

                              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

codice:

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);
    });
    */

+1 per mostrare che element.offsetTop esiste. element.getBoundingClientRect (). top mi sta dando un comportamento strano. Stavo cercando di ottenere la distanza dalla parte superiore della pagina Web fino alla parte superiore dell'elemento.
alexandre1985,

0

Ho usato questa funzione per rilevare se l'elemento è visibile nella porta di visualizzazione

Codice:

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');
}
});
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.