Bir div / span etiketinin konumunu alın


103

Biri belirtilmediğinde bir veya öğesinin top& leftkonumunu nasıl alacağımı bana gösterebilir mi?divspan

yani:

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

Yukarıdakileri yaparsam:

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

Değeri 55pxdöndürülür. Ancak, bunu span'12a' için denersem, hiçbir şey geri dönmez.

Bir sayfada / özelliklerini belirtemediğim bir sürü div/ spans var , ancak doğrudan bu öğenin altında görüntülemem gerekiyor .topleftdiv

Yanıtlar:


100

Bu işlev size öğenin sayfaya göre x, y konumunu söyleyecektir. Temel olarak, öğenin tüm ebeveynlerini gözden geçirmeniz ve ofsetlerini bir araya getirmeniz gerekir.

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

Ancak, öğenin kabına göre yalnızca x, y konumunu istiyorsanız, ihtiyacınız olan tek şey şudur:

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

Doğrudan bunun altına bir öğe koymak için yüksekliğini de bilmeniz gerekir. Bu, offsetHeight / offsetWidth özelliğinde saklanır.

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

5
Ne yazık ki bu yöntem, öğe kenarlıklı bir tablonun içindeyken Chrome'da başarısız olur. BODY marjları nedeniyle IE6 standartları modunda da başarısız olacaktır.
GetFree

1
Bu kodun kullanıcıları için sadece bir uyarı. Bu, pencereye değil sayfaya bağlıdır. Kullanıcı kaydırma çubuklarını kullanarak gezinirse aynı değeri döndürür. Dikkatli ol.
Isaac Bolinger

teşekkürler @IsaacBolinger az önce fark etti. Biri bana pencere yeniden boyutlandırıldığında veya kullanıcı kaydırdığında değerleri nasıl değiştirdiğimi söyleyebilir mi?
David Fariña

@ DavidFariña Bunun için dojo'nun "dom-geometry" geometri modülünü kullandım. Bunu yerel olarak nasıl yapacağımı bilmiyorum.
Isaac Bolinger

Olumsuz oy verildi - Daha deneyimli kullanıcılar için açık olabilir, ancak el için tam olarak neyin aktarılması gerektiğini belirlemediniz (yani, lütfen bir örnek kullanım sağlayın).
Matt

184

Yöntemi getBoundingClientRect(), öğeye bir başvuru üzerine çağırabilirsiniz . Sonra inceleyebilirsiniz top, left, rightve / veya bottomözelliklerini ...

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

JQuery kullanıyorsanız, daha kısa ve öz kodu kullanabilirsiniz ...

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

11
Bu cevap için +1 getBoundingClientRect()kullanılmalıdır - ve bu kabul edilen cevap olmalıdır! Ancak bunun çalışması için "modern bir tarayıcıya" ihtiyacınız yok , burada gösterdiğim uyumluluk listesine bakın: stackoverflow.com/questions/1480133/… . IE 4.0+ (!), Chrome 1.0+, FF 3.0+, Safari 4.0+ ve Opera'da sorunsuz çalışıyor.
Sk8erPeter

25
getBoundingClientRect()Değerlerin belgeye değil, görüntü alanına göre döndürdüğünü unutmayın . Bunun için böyle bir şey istersiniz top = el.getBoundingClientRect().top + window.pageYOffset - el.ownerDocument.documentElement.clientTop.
Zack Bloom

1
Ayrıca dikkate getBoundingClientRectaldığına dikkat edin transform.
ExpExc

Kesin olarak konumlandırılmamış ilk çocuğun kenar boşluğu üst veya sol kenar boşluğu varsa, bu doğru değildir. Şu anda bu sayfada doğru bir çözüm bulunmadığından, bilen biri varsa, lütfen bir yanıt gönderin.
Curtis

16

@ Nickf'in cevabı işe yararken. Eski tarayıcıları umursamıyorsanız, bu saf Javascript sürümünü kullanabilirsiniz. IE9 + ve diğerlerinde çalışır

var rect = el.getBoundingClientRect();

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

12

Alex'in belirttiği gibi, belge akışına göre konumu elde etmek için jQuery ofset () kullanabilirsiniz. Üst öğeye göre x, y koordinatları için position () kullanın.

DÜZENLEME: Anahtarlı document.readyiçin window.loadçünkü loadtüm öğeleri bekler sadece DOM hazırlamak yerine boyutlarını olsun. Deneyimlerime göre, loaddaha az hatalı Javascript konumlandırılmış öğelere neden oluyor.

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

9

Sadece yukarı veya sol konuma ihtiyaç duyan herkes için, @ Nickf'in okunabilir kodunda küçük değişiklikler yapılması işi halleder.

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

ve

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.