Bir elemanın işlenen yüksekliğini nasıl elde edersiniz?


406

Bir elemanın işlenen yüksekliğini nasıl elde edersiniz?

<div>İçinde bazı içerikler bulunan bir öğeniz olduğunu varsayalım . İçerideki bu içerik yüksekliğini artıracak <div>. Yüksekliği açıkça ayarlamadığınızda "oluşturulan" yüksekliği nasıl elde edersiniz? Açıkçası denedim:

var h = document.getElementById('someDiv').style.height;

Bunu yapmak için bir hile var mı? Bu yardımcı olur jQuery kullanıyorum.


Yanıtlar:


183

Sadece olmalı

$('#someDiv').height();

jQuery ile. Bu, sarılmış kümedeki ilk öğenin yüksekliğini sayı olarak alır.

Kullanmaya çalışmak

.style.height

yalnızca özelliği ilk etapta ayarladıysanız çalışır. Çok faydalı değil!


1
Tek kelime - harika! Herkesin katılımı için teşekkürler. Bu konu hakkında iyi bilgi Lots. Bu, sayfaları CSS kullanarak ortalamama izin verecek ancak "konteyner" div'in toplam yüksekliğini CSS hackville'e girmeden doğru yapmak için jQuery kullanmamı sağlayacak. Tekrar teşekkürler.
BuddyJoe

3
jQuery kullanmıyor veya cant ya da istemiyorsanız bile ben kesinlikle sadece offsetHeight kullanarak bunu uygulamak kimseye öneriyor ve jQuery kaynağı indirir ve kullandıkları kodu bulmak için "height" arar. orada çılgınca şeyler var!
Simon_Weaver

1
@matejkramny - Bu soru ve cevap 5 yıldan fazla oldu . OP zaten kendi yerinde aynı / benzer mantığı yeniden uygulamak yerine jQuery kullanıyordu, neden zaten bir satır jQuery işlevini kullanmıyorsunuz? JQuery'nin bir çok şey için aşırıya kaçtığını kabul ediyorum ve vanilya JS'den korkmuyorum, ancak bir kütüphanede tam olarak ihtiyacınız olanı yapan bir işlev olduğunda, özellikle nedenlerle kullanmamak aptalca görünüyor Burada Buluş Değil "
Russ Cam

3
@matejkramny Soru sorurken OP'nin amacı, DOM'da ve sahne arkasında neler olduğunu anlamak değil, öğenin işlenen yüksekliğini elde etmekti; niyetleri buysa, yanlış soruyu sordular. İnsanların kullandıkları kütüphaneleri ve çerçeveleri, bilginin güç olduğunu ve bunların hepsini anlama eğiliminde olması gerektiğine katılıyorum, ancak bazen sadece belirli bir soruya cevap vermek istiyoruz. Aslında, yukarıdaki yorumlar zaten sahne arkasında neler olduğunu anlamak için jQuery kodunu incelemenizi önerir.
Russ Cam

21
OP için jQuery kullanmak geçerli bir cevaptır. Dünyanın geri kalanında o zamandan beri bunu görmek için, jQuery olmayan cevap en iyisidir. Belki de SO'nun bu gerçekliğe uyum sağlaması gerekir, belki de en yüksek oyu alan cevaplar kabul edilenlerden daha fazla vurgulanmalıdır.
Dimitris

1219

Şunlardan birini deneyin:

var h = document.getElementById('someDiv').clientHeight;
var h = document.getElementById('someDiv').offsetHeight;
var h = document.getElementById('someDiv').scrollHeight;

clientHeight yükseklik ve dikey dolgu içerir.

offsetHeight yükseklik, dikey dolgu ve dikey kenarlıkları içerir.

scrollHeight içerdiği belgenin yüksekliğini (kaydırma durumunda yalnızca yükseklikten daha büyük olacaktır), dikey dolgu ve dikey kenarlıkları içerir.


3
Teşekkürler, bu özellik hakkında bilmiyordum. IE8 + uyumludur.
lyubeto

IstemciHeight anlamı ile şaşırdım. İçinde bir sürü p öğesi olan bir div öğesi var ve içerik aşağıdan tarayıcının görüntülenebilir alanının çok ötesine gidiyor. Ve clientHeight'ın işlenen yüksekliği vermesini ve scrollHeight'ın tam uzunluğunu vermesini bekledim. Ancak neredeyse eşittirler (sadece marj, dolgu vb. İle farklılık gösterir).
bahti

10
@bahti sınırlı bir yüksekliğe ve taşmaya sahip olmadığı sürece: gizli veya bir tür taşma: kaydırma, öğe tüm içeriği göstermek için genişler (görünümünüzde olsun veya olmasın) ve scrollHeight ve clientHeight eşit olacaktır.
Ulad Kasach

4
Büyük cevap, ancak mantıksal olarak, bir elemanın yüksekliğini etkileyen sınırlar yatay olan üst ve alt sınırlardır. Bu cevap onlara "dikey kenarlıklar" adını verir. Sadece 2
sentimi

1
Bildiğim kadarıyla, kaydırma gösteriliyorsa .clientWidth/.clientHeight kaydırma genişliğini dahil ETMEYİN . Kaydırma genişliğinin eklenmesini istiyorsanız element.getBoundingClientRect().width bunun yerine kullanabilirsiniz
Dmitry Gonchar


49

.outerHeight()Bu amaçla kullanabilirsiniz .

Size elemanın tam olarak işlenmiş yüksekliğini verecektir. Ayrıca, herhangi bir css-heightöğeyi ayarlamanız gerekmez . Önlem için yüksekliğini otomatik tutabilirsiniz, böylece içeriğin yüksekliğine göre işlenebilir.

//if you need height of div excluding margin/padding/border
$('#someDiv').height();

//if you need height of div with padding but without border + margin
$('#someDiv').innerHeight();

// if you need height of div including padding and border
$('#someDiv').outerHeight();

//and at last for including border + margin + padding, can use
$('#someDiv').outerHeight(true);

Bu işlevi net bir şekilde görmek için jQuery'nin sitesine veya ayrıntılı bir gönderiye buradan gidebilirsiniz .

o temizleyecektir farkı arasındaki .height()/ innerHeight()/outerHeight()


1
Teşekkürler. Şamandıralarla çalışırken yükseklikte otomatik olarak çok fazla sorun yaşadım ama o zaman deneyimsizdim. Ben genellikle başlangıçta alanı temizlemek ama aynı top ile biten her blok (Div) için eşit olarak ayarlamak bazı karmaşık düzen komut dosyası dışında yükseklik ayarlamamış. Bloklar arasındaki bir piksel farkı bile pencereleri yeniden boyutlandırırken düzeni bozabilir.
DHorse

1
BTW, offset'in bu ortadan kaldırdığı kenar boşluklarıyla ilgili bazı tarayıcı sürümüne bağlı kullanımları olduğunu düşünüyorum.
DHorse

2
Soru jQuery için gerekli değildir. Ugh.
dthree

1
@ dthree Açıkça jQuery kullandığını belirtti (Etiketler de dahil) :)
açık ve ücretsiz

45

Bir elemanın yüksekliği (float döner) elde etmek için bunu kullanın :

document.getElementById('someDiv').getBoundingClientRect().height

Sanal DOM kullandığınızda da çalışır . Ben Vue böyle kullanın:

this.$refs['some-ref'].getBoundingClientRect().height

1
getBoundingClientRect (). height bir kayan noktalı sayı döndürür (diğerleri tamsayı döndürürken), nice :)
Ari

31
style = window.getComputedStyle(your_element);

o zaman basitçe: style.height


14

Kesinlikle kullanın

$('#someDiv').height()   // to read it

veya

$('#someDiv').height(newHeight)  // to set it

Bunu ek bir cevap olarak gönderiyorum çünkü öğrendiğim birkaç önemli şey var.

Hemen hemen offsetHeight kullanarak tuzağa düştüm. Olan şey bu :

  • Öğemin sahip olduğu özellikleri izlemek için bir hata ayıklayıcı kullanmanın eski hilesini kullandım
  • Hangisinin beklediğim değerin etrafında bir değeri olduğunu gördüm
  • OfsetHeight - bu yüzden kullandım.
  • Sonra gizli bir DIV ile işe yaramadı fark
  • MaxHeight'ı hesapladıktan sonra saklanmayı denedim ama bu beceriksiz görünüyordu - bir karmaşa içinde.
  • Bir arama yaptım - jQuery.height () keşfetti ve kullandım
  • yüksekliği bulmak () gizli elemanlarda bile çalışır
  • sadece eğlence için yükseklik / genişlik jQuery uygulamasını kontrol ettim

İşte bunun bir kısmı:

Math.max(
Math.max(document.body["scroll" + name], document.documentElement["scroll" + name]),
Math.max(document.body["offset" + name], document.documentElement["offset" + name])
) 

Evet, İKİ kaydırma ve ofsete bakar. Bu başarısız olursa, tarayıcı ve css uyumluluk sorunlarını dikkate alarak daha da fazla görünüyor. Başka bir deyişle STUFF I CARO HAKKINDA - ya da istiyorum.

Ama zorunda değilim. Teşekkürler jQuery!

Hikayenin ahlakı: jQuery'nin bir şey için bir yöntemi varsa, muhtemelen iyi bir nedenden ötürü, muhtemelen uyumlulukla ilgilidir.

Son zamanlarda jQuery yöntem listesini okumadıysanız, bir göz atmanızı öneririm.


Diğer yorumunuzu soru düzeyinde gördünüz. JQuery'de satıldım. Bir süredir. Ama bu anlaşmayı imzaladı. Bu basit şeyin benim için (çoğunlukla JavaScript'in çalıştığını bildiğim Intranet sitelerinde) düzen sorunlarını çözeceği gerçeğine aşığım.
BuddyJoe

13
document.querySelector('.project_list_div').offsetHeight;

4
çözümünüze açıklama ekleyin
Freelancer

Sonra offsetHeight
Ritwik

6
Bu özellik, değeri bir tamsayıya yuvarlar . Bir kayan nokta değerine ihtiyacınız varsa , kullanınelem.getBoundingClientRect().height
Penny Liu

12

JQuery'ye bile ihtiyaç duymayan basit bir kod yaptım ve muhtemelen bazı insanlara yardım edeceğim. Yüklendikten sonra toplam 'ID1' yüksekliğini alır ve 'ID2' üzerinde kullanır

function anyName(){
    var varname=document.getElementById('ID1').offsetHeight;
    document.getElementById('ID2').style.height=varname+'px';
}

Sonra sadece vücudu yükleyecek şekilde ayarlayın

<body onload='anyName()'>

Yararlı ve daha karmaşık kodda benzer bir şey istihdam.
DHorse

10

Hm Element geometrisini alabiliriz ...

var geometry;
geometry={};
var element=document.getElementById(#ibims);
var rect = element.getBoundingClientRect();
this.geometry.top=rect.top;
this.geometry.right=rect.right;
this.geometry.bottom=rect.bottom;
this.geometry.left=rect.left;
this.geometry.height=this.geometry.bottom-this.geometry.top;
this.geometry.width=this.geometry.right-this.geometry.left;
console.log(this.geometry);

Peki ya bu düz JS?


1
var geometry; geometry={};sadece olabilirvar geometry={};
Mark Schultheiss

10

Bunu 2020'de yapmanın en iyi yolunun düz js ve getBoundingClientRect().height;

İşte bir örnek

let div = document.querySelector('div');
let divHeight = div.getBoundingClientRect().height;

console.log(`Div Height: ${divHeight}`);
<div>
  How high am I? 🥴
</div>

heightBu şekilde elde etmenin yanı sıra, hakkında bir sürü başka öğeye de erişebiliriz div.

let div = document.querySelector('div');
let divInfo = div.getBoundingClientRect();

console.log(divInfo);
<div>What else am I? 🥴</div>


8

Peki bu cevap mı?

"Bir şeyi hesaplamanız gerekiyor, ancak göstermiyorsanız, öğeyi visibility:hiddenve olarak ayarlayın, position:absoluteDOM ağacına ekleyin, offsetHeight'ı alın ve kaldırın. (Prototip kütüphanesi son kontrol ettiğim satırların arkasında bunu yapar)."

Aynı sorun bir dizi unsurda da var. Sitede kullanılacak jQuery veya Prototype yok ama eğer işe yararsa tekniği ödünç almaktan yanayım. Çalışamayan bazı şeylerin bir örneği olarak, ardından ne yaptı, ben aşağıdaki kodu var:

// Layout Height Get
function fnElementHeightMaxGet(DoScroll, DoBase, elementPassed, elementHeightDefault)
{
    var DoOffset = true;
    if (!elementPassed) { return 0; }
    if (!elementPassed.style) { return 0; }
    var thisHeight = 0;
    var heightBase = parseInt(elementPassed.style.height);
    var heightOffset = parseInt(elementPassed.offsetHeight);
    var heightScroll = parseInt(elementPassed.scrollHeight);
    var heightClient = parseInt(elementPassed.clientHeight);
    var heightNode = 0;
    var heightRects = 0;
    //
    if (DoBase) {
        if (heightBase > thisHeight) { thisHeight = heightBase; }
    }
    if (DoOffset) {
        if (heightOffset > thisHeight) { thisHeight = heightOffset; }
    }
    if (DoScroll) {
        if (heightScroll > thisHeight) { thisHeight = heightScroll; }
    }
    //
    if (thisHeight == 0) { thisHeight = heightClient; }
    //
    if (thisHeight == 0) { 
        // Dom Add:
        // all else failed so use the protype approach...
        var elBodyTempContainer = document.getElementById('BodyTempContainer');
        elBodyTempContainer.appendChild(elementPassed);
        heightNode = elBodyTempContainer.childNodes[0].offsetHeight;
        elBodyTempContainer.removeChild(elementPassed);
        if (heightNode > thisHeight) { thisHeight = heightNode; }
        //
        // Bounding Rect:
        // Or this approach...
        var clientRects = elementPassed.getClientRects();
        heightRects = clientRects.height;
        if (heightRects > thisHeight) { thisHeight = heightRects; }
    }
    //
    // Default height not appropriate here
    // if (thisHeight == 0) { thisHeight = elementHeightDefault; }
    if (thisHeight > 3000) {
        // ERROR
        thisHeight = 3000;
    }
    return thisHeight;
}

temelde her şeyi dener ve sadece sıfır sonuç almak için her şeyi dener. Etkisi olmayan ClientHeight. Sorunlu elemanlarla tipik olarak Tabanda NaN, Ofset ve Kaydırma yüksekliklerinde sıfır elde ederim. Daha sonra burada çalışıp çalışmadığını görmek için DOM çözümü ve clientRects ekle denedim.

29 Haz 2011, gerçekten DOM ve clientHeight eklemeyi beklediğimden daha iyi sonuçlarla eklemek için kodu güncelledim.

1) clientHeight da 0 idi.

2) Dom aslında bana büyük bir yükseklik verdi.

3) ClientRects, DOM tekniğiyle neredeyse aynı sonucu döndürür.

Eklenen elemanlar doğada akışkan olduklarından, aksi takdirde boş bir DOM Temp elemanına eklendiğinde, bu kabın genişliğine göre oluşturulurlar. Bu garipleşiyor, çünkü sonunda 30 piksel daha kısa.

Yüksekliğin nasıl farklı hesaplandığını göstermek için birkaç anlık görüntü ekledim. Normal şekilde oluşturulan menü bloğu DOM Temp öğesine menü bloğu eklendi

Yükseklik farkları açıktır. Kesinlikle mutlak konumlandırma ve gizli ekleyebilirim ama bunun bir etkisi olmayacağından eminim. Bunun işe yaramayacağına ikna olmaya devam ettim!

(Daha fazla inceliyorum) Yükseklik gerçek görüntülenen yükseklikten daha düşük çıkıyor (çıkıyor). Bu, DOM Temp öğesinin genişliği mevcut üst öğeyle eşleşecek şekilde ayarlanarak ele alınabilir ve teoride oldukça doğru bir şekilde yapılabilir. Ayrıca bunları kaldırıp mevcut konumlarına geri eklemekten ne elde edeceğimi de bilmiyorum. Bir innerHTML tekniği ile geldiklerinde bu farklı yaklaşımı kullanarak bakacağım.

* ANCAK * Hiçbiri gerekli değildi. Aslında reklamı olarak çalıştı ve doğru yüksekliği döndü !!!

Menüleri tekrar şaşırtıcı bir şekilde görünür hale getirebildiğimde, DOM sayfanın üstündeki sıvı düzeni başına doğru yüksekliği döndürmüştü (279 piksel). Yukarıdaki kod ayrıca 280 piksel döndüren getClientRects kullanır.

Bu, aşağıdaki anlık görüntüde gösterilmiştir (çalıştıktan sonra Chrome'dan alınır.)
resim açıklamasını buraya girin

Şimdi bu prototip hilesinin neden işe yaradığına dair hiçbir fikrim yok, ama öyle görünüyor. Alternatif olarak, getClientRects de çalışır.

Tüm bu sorunların nedeninin bu belirli unsurlarla nedeninin appendChild yerine innerHTML kullanımı olduğundan şüpheleniyorum, ancak bu noktada saf spekülasyon.


6

offsetHeight, genelde.

Bir şeyi hesaplamanız gerekiyor, ancak göstermiyorsanız, öğeyi visibility:hiddenve olarak ayarlayın position:absolute, DOM ağacına ekleyin, alın offsetHeightve kaldırın. (Prototip kütüphanesinin en son kontrol ettiğimde sahne arkasında yaptığı şey budur).


ilginç. prototipi hiç kontrol etmedim. neden jQuery bunu sahne arkasında yapmadı?
Simon_Weaver

Zorluklar yaşadığımda bunu gördüm ve bu tekniği test ettim ve sade JavaScript'te oldukça iyi çalıştı
DHorse

5

Oluşturduğunuz öğe henüz Dom'da oluşturulmadığı için bazen offsetHeight sıfır döndürür. Bu işlevi bu tür durumlar için yazdım:

function getHeight(element)
{
    var e = element.cloneNode(true);
    e.style.visibility = "hidden";
    document.body.appendChild(e);
    var height = e.offsetHeight + 0;
    document.body.removeChild(e);
    e.style.visibility = "visible";
    return height;
}

öğeyi klonlamanız gerekir, aksi takdirde dom'dan tamamen kaldırılacaktır, kodunuzdan görünecektir.
punkbit

Bu kod, öğeyi DOM'da tutmaya yönelik değildir. DOM'a kısa bir süre koymak (onu işlemek ve yüksekliğini elde etmek için yeterince uzun), daha sonra çıkarır. Daha sonra elemanı daha sonra başka bir yerde dom'a koyabilirsiniz (yüksekliğinin sizden önce ne olacağını bilmek). "GetHeight" işlev adına dikkat edin; kodun yapmak istediği bu.
Lonnie Best

@punkbit: Ne demek istediğini anlıyorum. Öğeniz zaten dom'ta. Yazdığım kod henüz DOM'da olmayan bir öğe içindir. Dediğiniz gibi klonlama daha iyi olurdu, çünkü elementin dom'da olup olmadığı önemli değildir.
Lonnie Best

@punkbit: Kod kullanımını klonlamayı değiştirdim, ancak test etmedim.
Lonnie Best

evet, benim amacım buydu. Bana DOM'daki mevcut bir eleman için "eleman" dediğini gördü. Ama hepsi iyi! Yanlış anlama.
punkbit

4

Zaten jQuery kullanıyorsanız, en iyi bahsiniz .outerHeight()veya .height()belirtildiği gibi.

JQuery olmadan, kullanımda kutu boyutlandırmasını kontrol edebilir ve çeşitli dolgular + kenarlıklar + clientHeight ekleyebilirsiniz veya getComputedStyle'ı kullanabilirsiniz :

var h = getComputedStyle (document.getElementById ('someDiv')). yükseklik;

h artık "53.825 piksel" gibi bir dize olacaktır.

Ve referans bulamıyorum, ancak getComputedStyle()pahalı olabileceğini duydum , bu yüzden muhtemelen her window.onscrollolayda aramak istediğiniz bir şey değil (ama o zaman, ikisi de jQuery's height()).


Birinden yüksekliğe ulaştığınızda getComputedStyle, parseInt(h, 10)hesaplamalar için bir tamsayı almak için kullanın .
RhodanV5500


1

Sorunuzu doğru anladıysam, belki böyle bir şey yardımcı olacaktır:

function testDistance(node1, node2) {
    /* get top position of node 1 */
    let n1Pos = node1.offsetTop;
    /* get height of node 1 */
    let n1Height = node1.clientHeight;
    /* get top position of node 2 */
    let n2Pos = node2.offsetTop;
    /* get height of node 2 */
    let n2Height = node2.clientHeight;

    /* add height of both nodes */
    let heightTogether = n1Height + n2Height;
    /* calculate distance from top of node 1 to bottom of node 2 */
    let actualDistance = (n2Pos + n2Height) - n1Pos;

    /* if the distance between top of node 1 and bottom of node 2
       is bigger than their heights combined, than there is something between them */
    if (actualDistance > heightTogether) {
        /* do something here if they are not together */
        console.log('they are not together');
    } else {
        /* do something here if they are together */
        console.log('together');
    } 
}

-4

Özellikle css'deki yüksekliği ayarladınız mı? Eğer kullanmadıysanız kullanmak offsetHeight;yerineheight

var h = document.getElementById('someDiv').style.offsetHeight;

8
offsetHeight, stilinin değil, öğenin kendisinin bir özelliğidir.
Shog9
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.