Déterminez la distance entre le haut d'un div et le haut de la fenêtre avec javascript

127

Comment déterminer la distance entre le haut d'un div et le haut de l'écran actuel? Je veux juste la distance en pixels du haut de l'écran actuel, pas du haut du document. J'ai essayé quelques trucs comme .offset()et .offsetHeight, mais je ne peux tout simplement pas m'envelopper dans mon cerveau. Merci!

Joël Eckroth
la source
2
vous voudrez peut-être vérifier ceci
Joseph
7
el.getBoundingClientRect().top+window.scrollY
caub
3
@caub Eh, c'est juste el.getBoundingClientRect().top. L'ajout de la position de défilement s'ajoute à la distance par rapport au haut du document. developer.mozilla.org/de/docs/Web/API/Element/…
lynx
oui, je voulais juste annuler la demande
caub

Réponses:

239

Vous pouvez utiliser .offset()pour obtenir le décalage par rapport à l' documentélément, puis utiliser la scrollToppropriété de l' windowélément pour trouver à quelle distance de la page l'utilisateur a fait défiler:

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

La distancevariable contient maintenant la distance entre le haut de l' #my-elementélément et le pli supérieur.

Voici une démo: http://jsfiddle.net/Rxs2m/

Notez que les valeurs négatives signifient que l'élément est au-dessus du pli supérieur.

Jaspe
la source
Comment puis-je vérifier si la distance est un nombre spécifique? Je veux rendre un élément collant s'il est à 120 pixels du haut
Thessa Verbruggen
@ThessaVerbruggen Vous pouvez vérifier la distancevariable pour voir si sa valeur est 120mais je recommanderais de vérifier une plage au lieu d'un nombre exact. Si, par exemple, vous faites défiler avec une molette de souris, vous pourriez très bien sauter plus de 120. Donc, si vous essayez d'appliquer du CSS ou quelque chose lorsque l'élément est à moins de 120 pixels du pli supérieur, alors peut-être utiliser if (distance < 120) { /* do something */}. Voici une démo mise à jour: jsfiddle.net/na5qL91o
Jasper
Un problème si je fais cela: la partie collante clignote lorsque je fais défiler. J'imagine parce qu'il recalcule quand je fais défiler. Une idée de comment résoudre ce problème? Mon code: $ (window) .on ('scroll', function () {var scrollTop = $ (window) .scrollTop (), elementOffset = $ ('# secondary'). Offset (). Top, distance = (elementOffset - scrollTop); if (distance <120) {$ ('# secondaire'). addClass ('sticky');} else {$ ('# secondary'). removeClass ('sticky');}});
Thessa Verbruggen
60

Vanille:

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

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

   console.log(distanceToTop);
});

Ouvrez la console de votre navigateur et faites défiler votre page pour voir la distance.

horahore
la source
14
Cela ne fonctionne que si l'utilisateur n'a pas fait défiler la page. Sinon, le distanceToTopretour est relatif (peut même être négatif si l'utilisateur a défilé). Pour en tenir compte, utilisezwindow.pageYOffset + someDiv.getBoundingClientRect().top
ty.
2
@ty L'OP est à la recherche de la distance vers le haut de l'écran, pas au haut du document - une valeur négative serait valable dans ce cas
Drenai
16

Cela peut être réalisé uniquement avec JavaScript .

Je vois que la réponse que je voulais écrire a été répondu par lynx dans les commentaires à la question.

Mais je vais quand même écrire une réponse car tout comme moi, les gens oublient parfois de lire les commentaires.

Donc, si vous voulez juste obtenir la distance d'un élément (en pixels) du haut de votre fenêtre d'écran, voici ce que vous devez faire:

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

utilisez getBoundingClientRect ()

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

C'est tout!

J'espère que cela aide quelqu'un :)

Furqan Rahamath
la source
1
getBoundingClient () ne fonctionne pas, à la place .getBoundingClientRect ()
Elnoor
@Elnoor Merci pour la suggestion :) J'ai apporté les modifications appropriées.
Furqan Rahamath
Un travail tout simplement génial @MohammedFurqanRahamathM. Merci beaucoup pour votre réponse :) Cela fonctionne comme un charme !! :)
Merianos Nikos
1
@MerianosNikos Merci. Je suis content que cela ait été utile :)
Furqan Rahamath
1
mais cela ne fonctionnerait que si vous n'avez pas rechargé au milieu de la page, n'est-ce pas?
Sagive SEO
7

J'ai utilisé ceci:

                              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

code:

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
la source
+1 pour montrer que element.offsetTop existe. element.getBoundingClientRect (). top me donne un comportement étrange. Je cherchais à obtenir la distance entre le haut de la page Web et le haut de l'élément.
alexandre1985
0

J'ai utilisé cette fonction pour détecter si l'élément est visible dans le port de vue

Code:

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
la source