Ich möchte wissen, wie die X- und Y-Position von HTML-Elementen wie img
und div
in JavaScript relativ zum Browserfenster ermittelt wird.
Ich möchte wissen, wie die X- und Y-Position von HTML-Elementen wie img
und div
in JavaScript relativ zum Browserfenster ermittelt wird.
Antworten:
Der richtige Ansatz ist element.getBoundingClientRect()
:
var rect = element.getBoundingClientRect();
console.log(rect.top, rect.right, rect.bottom, rect.left);
Internet Explorer hat dies unterstützt, solange Sie sich wahrscheinlich darum kümmern, und es wurde schließlich in CSSOM-Ansichten standardisiert . Alle anderen Browser haben es vor langer Zeit übernommen .
Einige Browser geben auch Eigenschaften für Höhe und Breite zurück, obwohl dies nicht dem Standard entspricht. Wenn Sie sich Sorgen über die Kompatibilität älterer Browser machen, überprüfen Sie die Revisionen dieser Antwort auf eine optimierte, sich verschlechternde Implementierung.
Die von zurückgegebenen Werte element.getBoundingClientRect()
beziehen sich auf das Ansichtsfenster. Wenn Sie es relativ zu einem anderen Element benötigen, subtrahieren Sie einfach ein Rechteck vom anderen:
var bodyRect = document.body.getBoundingClientRect(),
elemRect = element.getBoundingClientRect(),
offset = elemRect.top - bodyRect.top;
alert('Element is ' + offset + ' vertical pixels from <body>');
<body>
.
element.getBoundingClientRect().top
Gibt bei einem position: fixed
Element in iOS (iPhone 8) keinen korrekten oberen Versatz zurück, wenn es ein fokussiertes Eingabeelement enthält und die virtuelle Tastatur nach oben gerutscht ist. Wenn der tatsächliche Versatz von der Oberseite des Fensters beispielsweise 200 Pixel beträgt, wird er als 420 Pixel gemeldet, wobei 220 Pixel die Höhe der virtuellen Tastatur ist. Wenn Sie Elemente festlegen position: absolute
und an derselben Position wie fest positionieren, erhalten Sie die richtigen 200 Pixel. Ich kenne keine Lösung dafür.
Die Bibliotheken gehen einige Längen, um genaue Offsets für ein Element zu erhalten.
Hier ist eine einfache Funktion, die die Arbeit unter allen Umständen erledigt, die ich versucht habe.
function getOffset( el ) {
var _x = 0;
var _y = 0;
while( el && !isNaN( el.offsetLeft ) && !isNaN( el.offsetTop ) ) {
_x += el.offsetLeft - el.scrollLeft;
_y += el.offsetTop - el.scrollTop;
el = el.offsetParent;
}
return { top: _y, left: _x };
}
var x = getOffset( document.getElementById('yourElId') ).left;
Dies hat bei mir funktioniert (geändert von der Antwort mit der höchsten Stimme):
function getOffset(el) {
const rect = el.getBoundingClientRect();
return {
left: rect.left + window.scrollX,
top: rect.top + window.scrollY
};
}
Damit können wir anrufen
getOffset(element).left
oder
getOffset(element).top
div
dessen Mitte CSS zentriert ist top:50%, left:50%; transform:translate(-50%, -50%);
... ausgezeichnet. Stimmen Sie der @ ScottBiggs-Frage zu. Logisch ist es, nach Einfachheit zu suchen.
rect
verwenden var
, let
oder const
. Ansonsten ist es definiert als window.rect
.
left: rect.left + window.scrollX + (rect.width / 2), top: rect.top + window.scrollY + (rect.height / 2)
wird die mittlere Position eines Elements zurückgeben
Wenn Sie es nur in Javascript getan wollen , sind hier einige Einzeiler mitgetBoundingClientRect()
window.scrollY + document.querySelector('#elementId').getBoundingClientRect().top // Y
window.scrollX + document.querySelector('#elementId').getBoundingClientRect().left // X
Die erste Zeile gibt offsetTop
Y relativ zum Dokument zurück. Die zweite Zeile gibt beispielsweise offsetLeft
X relativ zum Dokument zurück.
getBoundingClientRect()
ist eine Javascript-Funktion, die die Position des Elements relativ zum Ansichtsfenster des Fensters zurückgibt.
HTML-Elemente in den meisten Browsern haben: -
offsetLeft
offsetTop
Diese geben die Position des Elements relativ zu seinem nächsten übergeordneten Element mit Layout an. Auf dieses übergeordnete Element kann häufig über die Eigenschaft offsetParent zugegriffen werden.
IE und FF3 haben
clientLeft
clientTop
Diese Eigenschaften sind weniger verbreitet. Sie geben eine Elementposition mit dem übergeordneten Clientbereich an (der aufgefüllte Bereich ist Teil des Clientbereichs, Rand und Rand jedoch nicht).
Wenn die Seite mindestens "DIV" enthält, wirft die von meouw angegebene Funktion den Wert "Y" über die aktuellen Seitengrenzen hinaus. Um die genaue Position zu finden, müssen Sie sowohl offsetParent's als auch parentNode's verarbeiten.
Probieren Sie den folgenden Code aus (er ist auf FF2 geprüft):
var getAbsPosition = function(el){
var el2 = el;
var curtop = 0;
var curleft = 0;
if (document.getElementById || document.all) {
do {
curleft += el.offsetLeft-el.scrollLeft;
curtop += el.offsetTop-el.scrollTop;
el = el.offsetParent;
el2 = el2.parentNode;
while (el2 != el) {
curleft -= el2.scrollLeft;
curtop -= el2.scrollTop;
el2 = el2.parentNode;
}
} while (el.offsetParent);
} else if (document.layers) {
curtop += el.y;
curleft += el.x;
}
return [curtop, curleft];
};
Sie können zwei Eigenschaften hinzufügen Element.prototype
, um den oberen / linken Rand eines Elements abzurufen.
Object.defineProperty( Element.prototype, 'documentOffsetTop', {
get: function () {
return this.offsetTop + ( this.offsetParent ? this.offsetParent.documentOffsetTop : 0 );
}
} );
Object.defineProperty( Element.prototype, 'documentOffsetLeft', {
get: function () {
return this.offsetLeft + ( this.offsetParent ? this.offsetParent.documentOffsetLeft : 0 );
}
} );
Das nennt man so:
var x = document.getElementById( 'myDiv' ).documentOffsetLeft;
Hier ist eine Demo , die Ergebnisse zu jQuery zu vergleichen offset().top
und .left
: http://jsfiddle.net/ThinkingStiff/3G7EZ/
Element.prototype
im Allgemeinen als schlechte Idee angesehen . Es ist sehr schwierig, Code zu pflegen. Dieser Code berücksichtigt auch nicht das Scrollen.
So rufen Sie die Position relativ zur Seite effizient und ohne Verwendung einer rekursiven Funktion ab: (einschließlich IE)
var element = document.getElementById('elementId'); //replace elementId with your element's Id.
var rect = element.getBoundingClientRect();
var elementLeft,elementTop; //x and y
var scrollTop = document.documentElement.scrollTop?
document.documentElement.scrollTop:document.body.scrollTop;
var scrollLeft = document.documentElement.scrollLeft?
document.documentElement.scrollLeft:document.body.scrollLeft;
elementTop = rect.top+scrollTop;
elementLeft = rect.left+scrollLeft;
Wie wäre es mit so etwas, indem wir die ID des Elements übergeben und es links oder oben zurückgibt, können wir sie auch kombinieren:
1) links finden
function findLeft(element) {
var rec = document.getElementById(element).getBoundingClientRect();
return rec.left + window.scrollX;
} //call it like findLeft('#header');
2) finde oben
function findTop(element) {
var rec = document.getElementById(element).getBoundingClientRect();
return rec.top + window.scrollY;
} //call it like findTop('#header');
oder 3) links und oben zusammen finden
function findTopLeft(element) {
var rec = document.getElementById(element).getBoundingClientRect();
return {top: rec.top + window.scrollY, left: rec.left + window.scrollX};
} //call it like findTopLeft('#header');
Möglicherweise ist es besser, ein JavaScript-Framework zu verwenden, das über Funktionen verfügt, mit denen solche Informationen (und vieles mehr!) Browserunabhängig zurückgegeben werden können. Hier sind ein paar:
Mit diesen Frameworks können Sie Folgendes tun:
$('id-of-img').top
die y-Pixel-Koordinate des Bildes ermitteln.
jQuery .offset () ruft die aktuellen Koordinaten des ersten Elements ab oder legt die Koordinaten jedes Elements in der Gruppe der übereinstimmenden Elemente relativ zum Dokument fest.
Ich habe die Antwort von @ meouw genommen, in der clientLeft hinzugefügt, die den Rand zulässt, und dann drei Versionen erstellt:
getAbsoluteOffsetFromBody - Ähnlich wie bei @ meouw wird hier die absolute Position relativ zum Hauptteil oder HTML-Element des Dokuments abgerufen (abhängig vom Mackenmodus).
getAbsoluteOffsetFromGivenElement - gibt die absolute Position relativ zum angegebenen Element (relativeEl) zurück. Beachten Sie, dass das angegebene Element das Element el enthalten muss. Andernfalls verhält es sich genauso wie getAbsoluteOffsetFromBody. Dies ist nützlich, wenn zwei Elemente in einem anderen (bekannten) Element enthalten sind (optional mehrere Knoten im Knotenbaum) und diese an derselben Position positionieren möchten.
getAbsoluteOffsetFromRelative - Gibt die absolute Position relativ zum ersten übergeordneten Element mit position: relative zurück. Dies ähnelt getAbsoluteOffsetFromGivenElement aus demselben Grund, geht jedoch nur bis zum ersten übereinstimmenden Element.
getAbsoluteOffsetFromBody = function( el )
{ // finds the offset of el from the body or html element
var _x = 0;
var _y = 0;
while( el && !isNaN( el.offsetLeft ) && !isNaN( el.offsetTop ) )
{
_x += el.offsetLeft - el.scrollLeft + el.clientLeft;
_y += el.offsetTop - el.scrollTop + el.clientTop;
el = el.offsetParent;
}
return { top: _y, left: _x };
}
getAbsoluteOffsetFromGivenElement = function( el, relativeEl )
{ // finds the offset of el from relativeEl
var _x = 0;
var _y = 0;
while( el && el != relativeEl && !isNaN( el.offsetLeft ) && !isNaN( el.offsetTop ) )
{
_x += el.offsetLeft - el.scrollLeft + el.clientLeft;
_y += el.offsetTop - el.scrollTop + el.clientTop;
el = el.offsetParent;
}
return { top: _y, left: _x };
}
getAbsoluteOffsetFromRelative = function( el )
{ // finds the offset of el from the first parent with position: relative
var _x = 0;
var _y = 0;
while( el && !isNaN( el.offsetLeft ) && !isNaN( el.offsetTop ) )
{
_x += el.offsetLeft - el.scrollLeft + el.clientLeft;
_y += el.offsetTop - el.scrollTop + el.clientTop;
el = el.offsetParent;
if (el != null)
{
if (getComputedStyle !== 'undefined')
valString = getComputedStyle(el, null).getPropertyValue('position');
else
valString = el.currentStyle['position'];
if (valString === "relative")
el = null;
}
}
return { top: _y, left: _x };
}
Wenn Sie immer noch Probleme haben, insbesondere beim Scrollen, können Sie sich http://www.greywyvern.com/?post=331 ansehen. Ich habe mindestens einen fragwürdigen Code in getStyle bemerkt, der in Ordnung sein sollte, vorausgesetzt, die Browser verhalten sich , aber den Rest habe ich überhaupt nicht getestet.
Wenn Sie jQuery verwenden, das Dimensions-Plugin hervorragend und ermöglicht es Ihnen, genau anzugeben, was Sie möchten.
z.B
Relative Position, absolute Position, absolute Position ohne Polsterung, mit Polsterung ...
Es geht weiter, sagen wir einfach, Sie können viel damit anfangen.
Der Vorteil der Verwendung von jQuery ist außerdem die geringe Dateigröße und die einfache Verwendung. Ohne jQuery können Sie danach nicht mehr auf JavaScript zurückgreifen.
Dies ist der beste Code, den ich erstellt habe (funktioniert auch in iframes, im Gegensatz zu jQuerys offset ()). Das Webkit scheint sich etwas anders zu verhalten.
Basierend auf meouws Kommentar:
function getOffset( el ) {
var _x = 0;
var _y = 0;
while( el && !isNaN( el.offsetLeft ) && !isNaN( el.offsetTop ) ) {
_x += el.offsetLeft - el.scrollLeft;
_y += el.offsetTop - el.scrollTop;
// chrome/safari
if ($.browser.webkit) {
el = el.parentNode;
} else {
// firefox/IE
el = el.offsetParent;
}
}
return { top: _y, left: _x };
}
Wenn Sie jQuery verwenden, kann dies eine einfache Lösung sein:
<script>
var el = $("#element");
var position = el.position();
console.log( "left: " + position.left + ", top: " + position.top );
</script>
Unterschied zwischen klein und klein
function getPosition( el ) {
var x = 0;
var y = 0;
while( el && !isNaN( el.offsetLeft ) && !isNaN( el.offsetTop ) ) {
x += el.offsetLeft - el.scrollLeft;
y += el.offsetTop - el.scrollTop;
el = el.offsetParent;
}
return { top: y, left: x };
}
Schauen Sie sich ein Beispiel für Koordinaten an: http://javascript.info/tutorial/coordinates
<svg>
Elemente, zum Beispiel, haben nicht offsetLeft
, offsetTop
und offsetParent
Eigenschaften.
DIV
oder IMG
nicht SVG
. "Beispielkoordinaten anzeigen"? Sie können das Objekt svg als Positionsaufruf getOffsetRect finden. Versuchen Sie, die Objektarbeit abhängig zu machen.
Der sauberste Ansatz, den ich gefunden habe, ist eine vereinfachte Version der von jQuery's verwendeten Technik offset
. Ähnlich wie bei einigen anderen Antworten beginnt es mit getBoundingClientRect
; Es verwendet dann das window
und das documentElement
, um die Bildlaufposition sowie Dinge wie den Rand auf dem body
(oft die Standardeinstellung) anzupassen .
var rect = el.getBoundingClientRect();
var docEl = document.documentElement;
var rectTop = rect.top + window.pageYOffset - docEl.clientTop;
var rectLeft = rect.left + window.pageXOffset - docEl.clientLeft;
Während dies bei so vielen Antworten sehr wahrscheinlich verloren geht, haben die Top-Lösungen hier bei mir nicht funktioniert.
Soweit ich das beurteilen konnte, hätte keine der anderen Antworten geholfen.
Situation :
Auf einer HTML5-Seite hatte ich ein Menü, das ein Navigationselement in einem Header war (nicht DER Header, sondern ein Header in einem anderen Element).
Ich wollte, dass die Navigation oben bleibt, sobald ein Benutzer zu ihr gescrollt hat, aber zuvor war die Kopfzeile absolut positioniert (damit ich sie etwas anderes leicht überlagern kann).
Die oben genannten Lösungen haben nie eine Änderung ausgelöst, da sich .offsetTop nicht ändern würde, da dies ein absolut positioniertes Element war. Zusätzlich war die .scrollTop-Eigenschaft einfach die Spitze des obersten Elements ... das heißt 0 und wäre immer 0.
Alle Tests, die ich mit diesen beiden durchgeführt habe (und die gleichen mit den Ergebnissen von getBoundingClientRect), haben mir nicht gesagt, ob der obere Rand der Navigationsleiste jemals zum oberen Rand der sichtbaren Seite gescrollt hat (wie in der Konsole angegeben, blieben sie beim Scrollen einfach die gleichen Zahlen aufgetreten).
Lösung
Die Lösung für mich war die Verwendung
window.visualViewport.pageTop
Der Wert der pageTop-Eigenschaft spiegelt den sichtbaren Bereich des Bildschirms wider, sodass ich verfolgen kann, wo sich ein Element in Bezug auf die Grenzen des sichtbaren Bereichs befindet.
Es ist wahrscheinlich unnötig zu sagen, dass ich diese Lösung jedes Mal verwenden werde, wenn ich mich mit dem Scrollen beschäftige, um programmgesteuert auf die Bewegung von Elementen zu reagieren, die gescrollt werden.
Hoffe es hilft jemand anderem.
WICHTIGER HINWEIS: Dies scheint derzeit in Chrome und Opera zu funktionieren und definitiv nicht in Firefox (6-2018) ... bis Firefox VisualViewport unterstützt. Ich empfehle, diese Methode NICHT zu verwenden (und ich hoffe, dass sie es bald tun ... es macht viel sinnvoller als der Rest).
UPDATE:
Nur ein Hinweis zu dieser Lösung.
Während ich immer noch finde, dass das, was ich entdeckt habe, sehr wertvoll für Situationen ist, in denen "... programmgesteuert auf Bewegungen von Elementen reagiert wird, die gescrollt werden". anwendbar. Die bessere Lösung für das Problem, das ich hatte, war die Verwendung von CSS zum Einstellen Position: klebrigauf dem Element. Wenn Sie Sticky verwenden, kann ein Element ohne Verwendung von Javascript oben bleiben (
HINWEIS: Manchmal
funktioniert dies nicht so effektiv wie das Ändern des Elements in "Fixed", aber für die meisten Anwendungen ist der Sticky-Ansatz wahrscheinlich überlegen.)
UPDATE01:
Also habe ich das erkannt Für eine andere Seite hatte ich eine Anforderung, bei der ich die Position eines Elements in einem leicht komplexen Bildlauf-Setup ermitteln musste (Parallaxe plus Elemente, die als Teil einer Nachricht vorbeirollen). In diesem Szenario wurde mir klar, dass das Folgende den Wert lieferte, den ich verwendete, um zu bestimmen, wann etwas zu tun ist:
let bodyElement = document.getElementsByTagName('body')[0];
let elementToTrack = bodyElement.querySelector('.trackme');
trackedObjPos = elementToTrack.getBoundingClientRect().top;
if(trackedObjPos > 264)
{
bodyElement.style.cssText = '';
}
Hoffe, diese Antwort ist jetzt allgemeiner nützlich.
Ich habe es so gemacht, damit es mit alten Browsern kompatibel ist.
// For really old browser's or incompatible ones
function getOffsetSum(elem) {
var top = 0,
left = 0,
bottom = 0,
right = 0
var width = elem.offsetWidth;
var height = elem.offsetHeight;
while (elem) {
top += elem.offsetTop;
left += elem.offsetLeft;
elem = elem.offsetParent;
}
right = left + width;
bottom = top + height;
return {
top: top,
left: left,
bottom: bottom,
right: right,
}
}
function getOffsetRect(elem) {
var box = elem.getBoundingClientRect();
var body = document.body;
var docElem = document.documentElement;
var scrollTop = window.pageYOffset || docElem.scrollTop || body.scrollTop;
var scrollLeft = window.pageXOffset || docElem.scrollLeft || body.scrollLeft;
var clientTop = docElem.clientTop;
var clientLeft = docElem.clientLeft;
var top = box.top + scrollTop - clientTop;
var left = box.left + scrollLeft - clientLeft;
var bottom = top + (box.bottom - box.top);
var right = left + (box.right - box.left);
return {
top: Math.round(top),
left: Math.round(left),
bottom: Math.round(bottom),
right: Math.round(right),
}
}
function getOffset(elem) {
if (elem) {
if (elem.getBoundingClientRect) {
return getOffsetRect(elem);
} else { // old browser
return getOffsetSum(elem);
}
} else
return null;
}
Weitere Informationen zu Koordinaten in JavaScript finden Sie hier: http://javascript.info/tutorial/coordinates
Um den Gesamtversatz eines Elements zu erhalten, können Sie alle übergeordneten Versätze rekursiv zusammenfassen:
function getParentOffsets(el): number {
if (el.offsetParent) {
return el.offsetParent.offsetTop + getParentOffset(el.offsetParent);
} else {
return 0;
}
}
Mit dieser Dienstprogrammfunktion beträgt der gesamte obere Versatz eines dom-Elements:
el.offsetTop + getParentOffsets(el);
/**
*
* @param {HTMLElement} el
* @return {{top: number, left: number}}
*/
function getDocumentOffsetPosition(el) {
var position = {
top: el.offsetTop,
left: el.offsetLeft
};
if (el.offsetParent) {
var parentPosition = getDocumentOffsetPosition(el.offsetParent);
position.top += parentPosition.top;
position.left += parentPosition.left;
}
return position;
}
Vielen Dank an ThinkingStiff für die Antwort , dies ist nur eine andere Version davon.
Ich habe die Lösung von Andy E erfolgreich verwendet, um ein Bootstrap 2-Modal zu positionieren, je nachdem, auf welchen Link in einer Tabellenzeile ein Benutzer klickt. Die Seite ist eine Tapestry 5-Seite und das unten stehende Javascript wird in die Java-Seitenklasse importiert.
Javascript:
function setLinkPosition(clientId){
var bodyRect = document.body.getBoundingClientRect(),
elemRect = clientId.getBoundingClientRect(),
offset = elemRect.top - bodyRect.top;
offset = offset + 20;
$('#serviceLineModal').css("top", offset);
}}
Mein Modalcode:
<div id="serviceLineModal" class="modal hide fade add-absolute-position" data-backdrop="static"
tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" style="top:50%;">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">x</button>
<h3 id="myModalLabel">Modal header</h3>
</div>
<div class="modal-body">
<t:zone t:id="modalZone" id="modalZone">
<p>You selected service line number: ${serviceLineNumberSelected}</p>
</t:zone>
</div>
<div class="modal-footer">
<button class="btn" data-dismiss="modal" aria-hidden="true">Close</button>
<!-- <button class="btn btn-primary">Save changes</button> -->
</div>
Der Link in der Schleife:
<t:loop source="servicesToDisplay" value="service" encoder="encoder">
<tr style="border-right: 1px solid black;">
<td style="white-space:nowrap;" class="add-padding-left-and-right no-border">
<a t:type="eventLink" t:event="serviceLineNumberSelected" t:context="service.serviceLineNumber"
t:zone="pageZone" t:clientId="modalLink${service.serviceLineNumber}"
onmouseover="setLinkPosition(this);">
<i class="icon-chevron-down"></i> <!-- ${service.serviceLineNumber} -->
</a>
</td>
Und der Java-Code in der Seitenklasse:
void onServiceLineNumberSelected(String number){
checkForNullSession();
serviceLineNumberSelected = number;
addOpenServiceLineDialogCommand();
ajaxResponseRenderer.addRender(modalZone);
}
protected void addOpenServiceLineDialogCommand() {
ajaxResponseRenderer.addCallback(new JavaScriptCallback() {
@Override
public void run(JavaScriptSupport javascriptSupport) {
javascriptSupport.addScript("$('#serviceLineModal').modal('show');");
}
});
}
Hoffe das hilft jemandem, dieser Beitrag hat geholfen.
Nach vielen Recherchen und Tests scheint dies zu funktionieren
function getPosition(e) {
var isNotFirefox = (navigator.userAgent.toLowerCase().indexOf('firefox') == -1);
var x = 0, y = 0;
while (e) {
x += e.offsetLeft - e.scrollLeft + (isNotFirefox ? e.clientLeft : 0);
y += e.offsetTop - e.scrollTop + (isNotFirefox ? e.clientTop : 0);
e = e.offsetParent;
}
return { x: x + window.scrollX, y: y + window.scrollY };
}
Ich dachte nur, ich würde das auch da rauswerfen.
Ich konnte es nicht in älteren Browsern testen, aber es funktioniert in den neuesten Top 3. :)
Element.prototype.getOffsetTop = function() {
return ( this.parentElement )? this.offsetTop + this.parentElement.getOffsetTop(): this.offsetTop;
};
Element.prototype.getOffsetLeft = function() {
return ( this.parentElement )? this.offsetLeft + this.parentElement.getOffsetLeft(): this.offsetLeft;
};
Element.prototype.getOffset = function() {
return {'left':this.getOffsetLeft(),'top':this.getOffsetTop()};
};
Da verschiedene Browser Rahmen, Auffüllungen, Ränder usw. auf unterschiedliche Weise rendern. Ich habe eine kleine Funktion geschrieben, um die oberen und linken Positionen eines bestimmten Elements in jedem gewünschten Stammelement in einer genauen Dimension abzurufen:
function getTop(root, offset) {
var rootRect = root.getBoundingClientRect();
var offsetRect = offset.getBoundingClientRect();
return offsetRect.top - rootRect.top;
}
Um die linke Position abzurufen, müssen Sie Folgendes zurückgeben:
return offsetRect.left - rootRect.left;
Holen Sie sich die Position von div in Bezug auf links und oben
var elm = $('#div_id'); //get the div
var posY_top = elm.offset().top; //get the position from top
var posX_left = elm.offset().left; //get the position from left
el.offsetTop
und el.offsetLeft
(das OP sagt nichts über jQuery ... Ich bin nicht sicher, warum Ihre Antwort auch jQuery verwendet ...)