121 votes

Obtenir la position d'une balise div/span

Quelqu'un peut-il me montrer comment obtenir le top & left position d'un div o span lorsqu'un élément n'est pas spécifié ?

ie :

<span id='11a' style='top:55px;' onmouseover="GetPos(this);">stuff</span>
<span id='12a' onmouseover="GetPos(this);">stuff</span>

Dans ce qui précède, si je le fais :

document.getElementById('11a').style.top

La valeur de 55px est renvoyé. Cependant, si j'essaie de le faire pour span 12a', alors rien n'est renvoyé.

J'ai un tas de div / span sur une page dont je ne peux pas préciser le top / left mais j'ai besoin d'afficher un div directement sous cet élément.

226voto

alex Points 186293

Vous pouvez appeler la méthode getBoundingClientRect() sur une référence à l'élément. Vous pouvez alors examiner le top , left , right et/ou bottom les propriétés...

var offsets = document.getElementById('11a').getBoundingClientRect();
var top = offsets.top;
var left = offsets.left;

Si vous utilisez jQuery, vous pouvez utiliser le code plus succinct...

var offsets = $('#11a').offset();
var top = offsets.top;
var left = offsets.left;

11 votes

+1 pour cette réponse, getBoundingClientRect() devrait être utilisé - et ce devrait être la réponse acceptée ! Mais vous n'avez pas besoin d'un "navigateur moderne" pour que cela fonctionne, voir la liste de compatibilité que j'ai montrée ici : stackoverflow.com/questions/1480133/ . Il fonctionne bien dans IE 4.0+ ( !), Chrome 1.0+, FF 3.0+, Safari 4.0+ et Opera.

27 votes

Notez que getBoundingClientRect() renvoie des valeurs relatives à la fenêtre d'affichage, et non au document. Pour cela, il faut quelque chose comme top = el.getBoundingClientRect().top + window.pageYOffset - el.ownerDocument.documentElement.clientTop .

1 votes

Notez également que getBoundingClientRect prend transform en compte.

104voto

nickf Points 185423

Cette fonction vous indiquera la position x,y de l'élément par rapport à la page. En fait, vous devez passer en revue tous les parents de l'élément et additionner leurs décalages.

function getPos(el) {
    // yay readability
    for (var lx=0, ly=0;
         el != null;
         lx += el.offsetLeft, ly += el.offsetTop, el = el.offsetParent);
    return {x: lx,y: ly};
}

Toutefois, si vous souhaitez simplement connaître la position x et y de l'élément par rapport à son conteneur, il vous suffit d'utiliser la commande suivante :

var x = el.offsetLeft, y = el.offsetTop;

Pour placer un élément directement sous celui-ci, vous devez également connaître sa hauteur. Celle-ci est enregistrée dans la propriété offsetHeight/offsetWidth.

var yPositionOfNewElement = el.offsetTop + el.offsetHeight + someMargin;

5 votes

Malheureusement, cette méthode échoue dans Chrome lorsque l'élément se trouve dans un tableau avec bordure. Elle échouera également dans le mode standard d'IE6 en raison des marges du BODY.

1 votes

Juste un avertissement pour les utilisateurs de ce code. Il est relatif à la page et non à la fenêtre. Il renvoie la même valeur si l'utilisateur se déplace en utilisant les barres de défilement. Soyez prudent.

0 votes

Merci @IsaacBolinger, je viens de le remarquer. Quelqu'un peut-il me dire comment faire pour que les valeurs soient modifiées lorsque la fenêtre est redimensionnée ou que l'utilisateur fait défiler la page ?

19voto

Benjamin Points 417

Alors que la réponse de @nickf fonctionne. Si vous ne vous souciez pas des anciens navigateurs, vous pouvez utiliser cette version purement Javascript. Fonctionne dans IE9+, et autres

var rect = el.getBoundingClientRect();

var position = {
  top: rect.top + window.pageYOffset,
  left: rect.left + window.pageXOffset
};

12voto

Dylan Valade Points 2529

Comme Alex l'a noté, vous pouvez utiliser jQuery offset() pour obtenir la position relative au flux du document. Utilisez position() pour obtenir ses coordonnées x,y par rapport au parent.

EDIT : Changement document.ready para window.load porque load attend tous les éléments pour que vous obteniez leur taille au lieu de simplement préparer le DOM. D'après mon expérience, load permet de réduire le nombre d'éléments mal positionnés par Javascript.

$(window).load(function(){ 
  // Log the position with jQuery
  var position = $('#myDivInQuestion').position();
  console.log('X: ' + position.left + ", Y: " + position.top );
});

9voto

Jens Frandsen Points 151

Pour ceux qui n'ont besoin que de la position haute ou gauche, de légères modifications au code lisible de @Nickf font l'affaire.

function getTopPos(el) {
    for (var topPos = 0;
        el != null;
        topPos += el.offsetTop, el = el.offsetParent);
    return topPos;
}

y

function getLeftPos(el) {
    for (var leftPos = 0;
        el != null;
        leftPos += el.offsetLeft, el = el.offsetParent);
    return leftPos;
}

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