161 votes

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

Comment déterminer la distance entre le haut d'une division et le haut de l'écran actuel ? Je veux simplement connaître la distance en pixels entre le haut de l'écran actuel et le haut du document. J'ai essayé plusieurs choses comme .offset() et .offsetHeight mais je n'arrive pas à me faire à l'idée. Merci.

2 votes

Vous pourriez vouloir regardez ça

10 votes

el.getBoundingClientRect().top+window.scrollY

5 votes

Eh, c'est juste el.getBoundingClientRect().top . En ajoutant la position de défilement, on obtient la distance jusqu'au sommet du document. developer.mozilla.org/de/docs/Web/API/Element/

264voto

Jasper Points 54859

Vous pouvez utiliser .offset() pour obtenir le décalage par rapport à la document puis utiliser l'élément scrollTop de l window pour savoir jusqu'où l'utilisateur a fait défiler la page :

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

Le site distance contient maintenant la distance entre le sommet de l'arbre et le sommet de l'arbre. #my-element et le pli supérieur.

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

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

0 votes

Comment puis-je vérifier si la distance est un nombre spécifique ? Je veux rendre un élément collant s'il se trouve à 120px du haut.

1 votes

@ThessaVerbruggen Vous pouvez vérifier la distance pour voir si la valeur de la variable est 120 mais je recommanderais de vérifier une fourchette plutôt qu'un nombre exact. Si, par exemple, vous faites défiler la page avec la molette de la souris, vous pouvez très bien passer au-dessus de 120. Donc, si vous essayez d'appliquer une CSS ou autre lorsque l'élément se trouve à moins de 120px du pli supérieur, utilisez peut-être if (distance < 120) { /* do something */} . Voici une démo mise à jour : jsfiddle.net/na5qL91o

0 votes

Un seul problème : la partie adhésive clignote lorsque je fais défiler la page. Je suppose que c'est parce qu'elle se recalcule lorsque je fais défiler la page. Avez-vous une idée de la façon de 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) { $('#secondary').addClass('sticky') ; } else { $('#secondary').removeClass('sticky') ; } }); ; la partie adhésive clignote lorsque je la fais défiler. }) ;

94voto

horahore Points 791

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.

34 votes

Cela ne fonctionne que si l'utilisateur n'a pas fait défiler la page. Sinon, distanceToTop retourné est relatif (peut même être négatif si l'utilisateur est passé devant). Pour en tenir compte, utilisez window.pageYOffset + someDiv.getBoundingClientRect().top

3 votes

Le PO cherche la distance au sommet de l'écran, pas au sommet du document - une valeur négative serait valide dans ce cas.

0 votes

C'est également ce dont j'avais besoin. J'utilise la bibliothèque Vue-toasted et elle ne permet d'afficher les toasts qu'à des positions absolues sur l'écran. Je voulais que le toast s'affiche à proximité du bouton sur lequel je cliquais dans un tableau et j'ai finalement dû utiliser getBoundingClientRect().top dans un événement de défilement. J'ai également fait la même chose dans un événement de redimensionnement. Vous pourriez envisager d'ajouter cette fonction lors du calcul de la distance par rapport au haut de l'écran, car on ne sait jamais ce que le client va faire.

38voto

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

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

Mais je vais quand même répondre parce que, tout comme moi, les gens oublient parfois de lire les commentaires.

Ainsi, si vous souhaitez simplement obtenir la distance (en pixels) d'un élément par rapport au haut de la fenêtre de votre écran, voici ce que vous devez faire :

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

utiliser getBoundingClientRect()

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

C'est ça !

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

1 votes

GetBoundingClient() ne fonctionne pas, mais plutôt .getBoundingClientRect()

0 votes

@Elnoor Merci pour la suggestion :) J'ai apporté les modifications appropriées.

0 votes

Un travail impressionnant @MohammedFurqanRahamathM. Merci beaucoup pour votre réponse :) Cela fonctionne comme un charme ! ! :)

8voto

snm-yah Points 2067

J'ai utilisé ça :

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

0 votes

+1 pour avoir montré que element.offsetTop existe. element.getBoundingClientRect().top me donne un comportement étrange. Je cherche à obtenir la distance entre le haut de la page Web et le haut de l'élément.

0voto

moutasim ahmad Points 1

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X