Ottieni la posizione di un tag div / span


103

Qualcuno può mostrarmi come ottenere la posizione top& leftdi un elemento divo spanquando non è specificato?

vale a dire:

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

In quanto sopra, se lo faccio:

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

55pxViene restituito il valore di . Tuttavia, se lo provo per span"12a", non viene restituito nulla.

Ho un mucchio di div/ spani su una pagina per cui non posso specificare le proprietà top/ left, ma ho bisogno di visualizzare divdirettamente sotto quell'elemento.

Risposte:


100

Questa funzione ti dirà la posizione x, y dell'elemento rispetto alla pagina. Fondamentalmente devi scorrere tutti i genitori dell'elemento e aggiungere i loro offset insieme.

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

Tuttavia, se desideri solo la posizione x, y dell'elemento rispetto al suo contenitore, tutto ciò di cui hai bisogno è:

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

Per mettere un elemento direttamente sotto questo, dovrai anche conoscere la sua altezza. Viene archiviato nella proprietà offsetHeight / offsetWidth.

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

5
Sfortunatamente questo metodo non riesce in Chrome quando l'elemento si trova all'interno di una tabella con bordo. Non funzionerà anche in modalità standard IE6 a causa dei margini BODY.
GetFree

1
Solo un avvertimento per gli utenti di questo codice. Questo è relativo alla pagina e non alla finestra. Restituisce lo stesso valore se l'utente scorre utilizzando le barre di scorrimento. Stai attento.
Isaac Bolinger

grazie @IsaacBolinger lo ha appena notato. Qualcuno può dirmi come faccio a modificare i valori quando la finestra viene ridimensionata o l'utente scorre?
David Fariña

@ DavidFariña Ho usato il modulo di geometria "dom-geometry" del dojo per questo. Non so come farlo in modo nativo.
Isaac Bolinger

Downvoted - Può essere ovvio per gli utenti più esperti, ma non hai specificato cosa esattamente deve essere passato per el (ad esempio, fornisci un esempio di utilizzo).
Matt

184

Puoi chiamare il metodo getBoundingClientRect()su un riferimento all'elemento. Quindi è possibile esaminare i top, left, righte / o bottomle proprietà ...

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

Se usi jQuery, puoi usare il codice più succinto ...

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

11
+1 per questa risposta, getBoundingClientRect()dovrebbe essere usato - e questa dovrebbe essere la risposta accettata! Ma non hai bisogno di un "browser moderno" per farlo funzionare, guarda l'elenco di compatibilità che ho mostrato qui: stackoverflow.com/questions/1480133/… . Funziona bene in IE 4.0+ (!), Chrome 1.0+, FF 3.0+, Safari 4.0+ e Opera.
Sk8erPeter

25
Nota che getBoundingClientRect()restituisce valori relativi alla finestra, non al documento. Per questo, vorresti qualcosa di simile top = el.getBoundingClientRect().top + window.pageYOffset - el.ownerDocument.documentElement.clientTop.
Zack Bloom

1
Si noti inoltre che getBoundingClientRecttiene transformconto.
ExpExc

Questo non è accurato se il primo figlio non posizionato in modo assoluto ha il margine superiore o il margine sinistro. Al momento non esiste una soluzione accurata in questa pagina, quindi se qualcuno lo sa, per favore pubblica una risposta.
Curtis

16

Mentre la risposta di @ nickf funziona. Se non ti interessano i browser meno recenti, puoi utilizzare questa versione Javascript pura. Funziona in IE9 + e altri

var rect = el.getBoundingClientRect();

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

12

Come ha notato Alex, puoi usare jQuery offset () per ottenere la posizione relativa al flusso del documento. Usa position () per le sue coordinate x, y relative al genitore.

EDIT: attivato document.readyper window.loadperché loadattende tutti gli elementi in modo da ottenere le loro dimensioni invece di preparare semplicemente il DOM. Nella mia esperienza, loadrisulta in un minor numero di elementi posizionati in modo errato JavaScript.

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

9

Per chiunque abbia bisogno solo della posizione in alto o a sinistra, leggere modifiche al codice leggibile di @ Nickf fa il trucco.

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

e

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

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.