58 votes

jQuery obtient la position d'un élément par rapport à un autre élément

J'ai donc un div comme :

<div class="uiGrid">

<div class="trigger"></div>

</div>

Et je veux connaître la position du déclencheur de l'uiGrid et j'ai essayé les deux :

$('.trigger').offset('.uiGrid');

$('.trigger').position('.uiGrid');

mais aucun des deux ne l'a compris. Offset est relatif au document et position est relatif au parent et non à l'élément spécifié.

Comment dois-je m'y prendre ? Merci

0 votes

Essayez de changer la position de votre div d'habillage en position relative dans le CSS. [ stackoverflow.com/questions/2842432/

89voto

bitsMix Points 1904

Fais la soustraction toi-même...

var relativeY = $("elementA").offset().top - $("elementB").offset().top;

18 votes

En fait, il n'y a rien de tel que offset().y c'est offset().top

0 votes

A fonctionné parfaitement sur Chrome, mais Firefox donne des chiffres totalement différents

0 votes

Pour mon cas d'utilisation, comme les chiffres de Firefox sont un peu différents, j'ai simplement arrondi les chiffres. relativeY au dixième le plus proche

11voto

Ce que vous pouvez faire ici, c'est de soustraire la valeur de la propriété du parent de celle de l'enfant.

var x = $('child-div').offset().top - $('parent-div').offset().top;

0 votes

Où mettre ces valeurs de soustraction ?

0 votes

Merci" est apprécié. Désolé, j'ai oublié de le montrer en l'assignant à une variable. Donc ce que vous devez faire, c'est définir une variable et assigner la valeur de soustraction. var x = $('child-div').offset().top - $('parent-div').offset().top ;

7 votes

Pourquoi avez-vous ressenti le besoin de poster une réponse redondante 2,5 ans après la publication d'une réponse acceptée ?

4voto

A. Morel Points 1115

Le problème pour moi était le fait que j'étais dans un div avec une barre de défilement et que je devais pouvoir prendre en compte la partie cachée jusqu'à l'élément Root.

Si j'utilise ".offset()", cela me donne des valeurs erronées, car cela ne prend pas en compte la partie cachée de la barre de défilement qui est relative au document.

Cependant, j'ai réalisé que la propriété ".offsetTop" relative à son premier parent positionné (offsetParent) était toujours correcte. J'ai donc créé une boucle pour aller récursivement à l'élément Root en additionnant les valeurs de ".offsetTop" :

J'ai créé ma propre fonction jquery pour ça :

jQuery.fn.getOffsetTopFromRootParent = function () {
    let elem = this[0];
    let offset = 0;
    while (elem.offsetParent != null) {
        offset += elem.offsetTop;
        elem = $(elem.offsetParent)[0];
        if (elem.offsetParent === null) {
            offset += elem.offsetTop;
        }
    }
    return offset;
};

Vous pouvez utiliser la même chose avec ".offsetLeft" je suppose...

Si vous voulez obtenir la position d'un élément par rapport à un autre élément pour répondre à la question :

let fromElem = $("#fromElemID")[0];
let offset = 0;
while (fromElem.id.toUpperCase() != "toElemID".toUpperCase()) {
    offset += fromElem.offsetTop;
    fromElem = $(fromElem.offsetParent)[0];
}
return offset;

Un élément (offsetParent) est dit positionné s'il possède un attribut CSS de position relative, absolue ou fixe.

4voto

Vous ne comprenez pas ce que vous voulez dire. ....

En plus de ça, essayez :

myPosY = $('.trigger').offset().left - $('.uiGrid').offset().left;
myPosX = $('.trigger').offset().top - $('.uiGrid').offset().top;

0 votes

Oh mais : myPosY est en haut, myPosX est à gauche

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