Bir HTML öğesinin gerçek genişliğini ve yüksekliğini nasıl alabilirim?


893

<div>Tarayıcı ekranına ortalamak istediğim bir tane olduğunu varsayalım (görünüm alanı). Bunu yapmak için, <div>elemanın genişliğini ve yüksekliğini hesaplamam gerekiyor .

Ne kullanmalıyım? Lütfen tarayıcı uyumluluğu hakkında bilgi ekleyin.


9
Herhangi bir yöntemle bir öğenin yüksekliğini elde etmenin , tarayıcıyı sayfadaki tüm öğelerin konumunu (yeniden akış) yeniden hesaplamasını sağladığı için her zaman bir performans etkisi olduğunu unutmayın. Bu nedenle, çok fazla yapmaktan kaçının. Ödemeye bu listeyi tür şeylerin yeniden düzenlenmesine neden ne için.
Marcelo Lazaroni

Yanıtlar:


1286

.offsetWidthVe .offsetHeightözelliklerini kullanmalısınız . Notlar elemente aittir, değil .style.

var width = document.getElementById('foo').offsetWidth;

İşlev.getBoundingClientRect() , CSS dönüşümleri gerçekleştirdikten sonra öğenin boyutlarını ve konumunu kayan nokta sayısı olarak döndürür.

> console.log(document.getElementById('id').getBoundingClientRect())
DOMRect {
    bottom: 177,
    height: 54.7,
    left: 278.5,​
    right: 909.5,
    top: 122.3,
    width: 631,
    x: 278.5,
    y: 122.3,
}

174
Dikkat! Son zamanlarda öğede belirli DOM değişiklikleri yaptıysanız offsetHeight / offsetWidth, 0 değerini döndürebilir. Öğeyi değiştirdikten sonra bu kodu setTimeout çağrısında çağırmanız gerekebilir.
Dan Fabulich


30
Hangi koşullarda 0 döndürür?
Çita

46
@JDandChips: offsetWidthöğe ise 0 display:noneolurken, hesaplanan widthbu örnekte yine de pozitif bir değere sahip olabilir. visibility:hiddenetkilemez offsetWidth.
MrWhite

21
@Supuhstar'ın her ikisi de farklı anlamlara sahiptir. offsetWidthiçerik, dolgu ve kenarlıklar dahil olmak üzere "bütün" kutusunu döndürür; while clientWidth, yalnızca içerik kutusunun boyutunu döndürür (böylece öğede sıfır olmayan dolgu ve / veya kenarlık olduğunda daha küçük bir değere sahip olur). (mod netlik için düzenlenmiştir)
Edurne Pascual

200

Bir göz atın Element.getBoundingClientRect().

Bu yöntem içeren bir nesne döndürür width, heightve diğer bazı faydalı değerler:

{
    width: 960,
    height: 71,
    top: 603,
    bottom: 674,
    left: 360,
    right: 1320
}

Örneğin:

var element = document.getElementById('foo');
var positionInfo = element.getBoundingClientRect();
var height = positionInfo.height;
var width = positionInfo.width;

Bunun bazen geri döndükleri yerde bulunmadığı .offsetWidthve bu konudaki sorunlara sahip olmadığına inanıyorum (buradaki yorumlarda tartışıldığı gibi ).offsetHeight0

Diğer bir fark, en yakın tamsayıya yuvarlanacak ve kesilecek getBoundingClientRect()kesirli pikselleri döndürebilir ..offsetWidth.offsetHeight

IE8 Not : IE8 ve altı getBoundingClientRectiçin yükseklik ve genişlik döndürmez . *

Eğer varsa gerekir IE8 destekleyen, kullanımı .offsetWidthve .offsetHeight:

var height = element.offsetHeight;
var width = element.offsetWidth;

Bu yöntemle döndürülen nesnenin gerçekten normal bir nesne olmadığını belirtmek gerekir . Özellikleri numaralandırılamaz (örneğin, Object.keyskutudan çıktığı gibi çalışmaz.)

Burada daha fazla bilgi: En iyi nasıl bir ClientRect / DomRect düz bir nesneye dönüştürmek

Referans:


8
getboundingClientRect () ise CSS ile ölçekli elemanların gerçek genişliğini ve yüksekliğini döndürür offsetHeightve offsetWidtholmayacaktır.
Luke

66

NOT : Bu cevap 2008 yılında yazılmıştır. O zaman çoğu insan için en iyi çapraz tarayıcı çözümü gerçekten jQuery kullanmaktı. Cevabı burada gelecek kuşaklar için bırakıyorum ve jQuery kullanıyorsanız, bunu yapmanın iyi bir yoludur. Başka bir çerçeve veya saf JavaScript kullanıyorsanız, kabul edilen cevap muhtemelen gitmenin yoludur.

JQuery 1.2.6 itibariyle çekirdek birini kullanabilirsiniz CSS fonksiyonları , heightve width(veya outerHeightve outerWidthuygun olanları).

var height = $("#myDiv").height();
var width = $("#myDiv").width();

var docHeight = $(document).height();
var docWidth = $(document).width();

45

Herkes için yararlı olması durumunda, ben aynı css ile bir metin kutusu, düğme ve div koymak:

width:200px;
height:20px;
border:solid 1px #000;
padding:2px;

<input id="t" type="text" />
<input id="b" type="button" />
<div   id="d"></div>

Chrome, firefox ve ie-edge'de denedim, jquery ile ve onsuz denedim ve denedim ve onsuz denedim box-sizing:border-box. Her zaman ile<!DOCTYPE html>

Sonuçlar:

                                                               Firefox       Chrome        IE-Edge    
                                                              with   w/o    with   w/o    with   w/o     box-sizing

$("#t").width()                                               194    200    194    200    194    200
$("#b").width()                                               194    194    194    194    194    194
$("#d").width()                                               194    200    194    200    194    200

$("#t").outerWidth()                                          200    206    200    206    200    206
$("#b").outerWidth()                                          200    200    200    200    200    200
$("#d").outerWidth()                                          200    206    200    206    200    206

$("#t").innerWidth()                                          198    204    198    204    198    204
$("#b").innerWidth()                                          198    198    198    198    198    198
$("#d").innerWidth()                                          198    204    198    204    198    204

$("#t").css('width')                                          200px  200px  200px  200px  200px  200px
$("#b").css('width')                                          200px  200px  200px  200px  200px  200px
$("#d").css('width')                                          200px  200px  200px  200px  200px  200px

$("#t").css('border-left-width')                              1px    1px    1px    1px    1px    1px
$("#b").css('border-left-width')                              1px    1px    1px    1px    1px    1px
$("#d").css('border-left-width')                              1px    1px    1px    1px    1px    1px

$("#t").css('padding-left')                                   2px    2px    2px    2px    2px    2px
$("#b").css('padding-left')                                   2px    2px    2px    2px    2px    2px
$("#d").css('padding-left')                                   2px    2px    2px    2px    2px    2px

document.getElementById("t").getBoundingClientRect().width    200    206    200    206    200    206
document.getElementById("b").getBoundingClientRect().width    200    200    200    200    200    200
document.getElementById("d").getBoundingClientRect().width    200    206    200    206    200    206

document.getElementById("t").offsetWidth                      200    206    200    206    200    206
document.getElementById("b").offsetWidth                      200    200    200    200    200    200
document.getElementById("d").offsetWidth                      200    206    200    206    200    206

1
Açık olmak gerekirse ... bu tarayıcılardan herhangi biri birbirinden farklı bir şey yapıyor mu? Ben Ayrıca, aşağı-oylama (henüz) değilim ... bir farklılık bulamıyorum, ama bu değil gerçekten kolayca bunu editted olabilir gerçi doğrudan soruya cevap.
Zach Lysobey

1
Soruyu cevaplamayı hedeflemedi - zaten cevaplandı. Sadece bazı yararlı bilgiler ve evet tüm ana son sürüm tarayıcıları bu değerler üzerinde hemfikirdir - ki bu iyi bir şeydir.
Graham

3
Şey ... niyetiniz soruyu cevaplamak değilse , o zaman bu gerçekten buraya ait değildir ("cevap" olarak). Bunu bazı harici kaynaklara (belki bir GitHub gist veya bir blog yazısı) koyarak ve orijinal Soru ya da cevaplardan birine bir yorumda bağlamayı düşünürdüm.
Zach Lysobey

21
@ZachLysobey Her kuralın istisnaları vardır - ve bu görmek harika, faydalı bir şeydir.
Dan Nissenbaum

16

MDN'ye göre : Elemanların boyutlarının belirlenmesi

offsetWidthve offsetHeight"görünür içeriğin genişliği, kaydırma çubukları (varsa), dolgu ve kenarlık dahil olmak üzere bir öğenin kapladığı toplam alan miktarını döndür"

clientWidthve clientHeight"dolgu dahil ancak kenarlık, kenar boşlukları veya kaydırma çubukları hariç gerçek görüntülenen içeriğin ne kadar yer kapladığını"

scrollWidthve scrollHeight"şu anda ne kadarının görünür olduğuna bakılmaksızın içeriğin gerçek boyutunu" döndürür

Dolayısıyla, ölçülen içeriğin geçerli görüntülenebilir alanın dışında olup olmayacağına bağlıdır.


5

Yalnızca IE7 ve daha eski sürümler için hesaplamanız gerekir (ve yalnızca içeriğinizin boyutu sabit değilse). Hack'i CSS2'yi desteklemeyen eski IE'lerle sınırlamak için HTML koşullu yorumları kullanmanızı öneririm. Diğer tüm tarayıcılar için bunu kullanın:

<style type="text/css">
    html,body {display:table; height:100%;width:100%;margin:0;padding:0;}
    body {display:table-cell; vertical-align:middle;}
    div {display:table; margin:0 auto; background:red;}
</style>
<body><div>test<br>test</div></body>

Bu mükemmel bir çözüm. <div>Herhangi bir boyutta ortalar ve içeriğinin boyutuna küçültür.


3

Elemanlar stillerini değiştirmek kolaydır, ancak değeri okumak biraz zordur.

Javascript'te getComputedStyle yerleşik yöntem çağrısını kullanmadığınız sürece JavaScript, css'den (dahili / harici) gelen herhangi bir öğe stili özelliğini (elem.style) okuyamaz.

getComputedStyle (öğe [, sözde])

Öğe: Değerinin okunacağı öğe.
sözde: Gerekirse sözde öğe, örneğin :: önce. Boş bir dize veya hiçbir bağımsız değişken, öğenin kendisi anlamına gelir.

Sonuç, elem.style gibi stil özelliklerine sahip, ancak şimdi tüm css sınıflarına göre bir nesnedir.

Örneğin, burada stil kenar boşluğunu görmez:

<head>
  <style> body { color: red; margin: 5px } </style>
</head>
<body>

  <script>
    let computedStyle = getComputedStyle(document.body);

    // now we can read the margin and the color from it

    alert( computedStyle.marginTop ); // 5px
    alert( computedStyle.color ); // rgb(255, 0, 0)
  </script>

</body>

Böylece javaScript kodunuzu, genişliğini / yüksekliğini veya başka bir özelliğini almak istediğiniz öğenin getComputedStyle'sini içerecek şekilde değiştirdi

window.onload = function() {

    var test = document.getElementById("test");
    test.addEventListener("click", select);


    function select(e) {                                  
        var elementID = e.target.id;
        var element = document.getElementById(elementID);
        let computedStyle = getComputedStyle(element);
        var width = computedStyle.width;
        console.log(element);
        console.log(width);
    }

}

Hesaplanmış ve çözülmüş değerler

CSS'de iki kavram vardır:

Hesaplanan stil değeri, CSS kademesinin sonucu olarak tüm CSS kuralları ve CSS devralma uygulandıktan sonraki değerdir. Yükseklik gibi görünebilir: 1em veya yazı tipi boyutu:% 125.

Çözülmüş bir stil değeri, öğeye nihayet uygulanan değerdir. 1em veya% 125 gibi değerler görecelidir. Tarayıcı hesaplanan değeri alır ve tüm birimleri sabit ve mutlak yapar, örneğin: yükseklik: 20 piksel veya yazı tipi boyutu: 16 piksel. Geometri özellikleri için, çözülen değerler genişlik gibi bir kayan noktaya sahip olabilir: 50.5 piksel.

Hesaplanan değerleri almak için uzun zaman önce getComputedStyle oluşturuldu, ancak çözülen değerlerin çok daha kullanışlı olduğu ve standardın değiştiği ortaya çıktı.
Yani bugünlerde getComputedStyle aslında özelliğin çözümlenmiş değerini döndürür.

Lütfen aklınızda bulundurun:

getComputedStyle tam özellik adını gerektirir

Her zaman, paddingLeft veya height veya width gibi tam olarak istediğiniz özelliği istemelisiniz. Aksi takdirde doğru sonuç garanti edilmez.

Örneğin, paddingLeft / paddingTop özellikleri varsa, getComputedStyle (elem) .padding için ne almalıyız? Bilinen dolgulardan hiçbir şey mi yoksa “üretilen” bir değer mi? Burada standart bir kural yok.

Başka tutarsızlıklar da var. Örnek olarak, bazı tarayıcılar (Chrome) aşağıdaki belgede 10 piksel gösterir ve bazıları (Firefox) - şunları yapmaz:

<style>
  body {
    margin: 30px;
    height: 900px;
  }
</style>
<script>
  let style = getComputedStyle(document.body);
  alert(style.margin); // empty string in Firefox
</script>

daha fazla bilgi için https://javascript.info/styles-and-classes


1

element.offsetWidth ve element.offsetHeight, önceki gönderide önerildiği gibi yapmalıdır.

Ancak, içeriği yalnızca ortalamak istiyorsanız, bunu yapmanın daha iyi bir yolu vardır. Xhtml katı DOCTYPE kullandığınızı varsayarsak. kenar boşluğu: 0, otomatik özellik ve piksel cinsinden gereken genişliği gövde etiketine ayarlayın. İçerik, sayfaya ortalanacak şekilde hizalanır.


1
Bazı dikey kriterleri (örn. Bilinen boyutta içerik) karşılayamazsanız, CSS ile doğru bir ağrı olan dikey olarak da ortalamak istediğini düşünüyorum
Greg

1

... CSS'in div'ı ortaya koymasına yardımcı olduğu anlaşılıyor ...

<style>
 .monitor {
 position:fixed;/* ... absolute possible if on :root */
 top:0;bottom:0;right:0;left:0;
 visibility:hidden;
 }
 .wrapper {
 width:200px;/* this is size range */
 height:100px;
 position:absolute;
 left:50%;top:50%;
 visibility:hidden;
 }

 .content {
 position:absolute;
 width: 100%;height:100%;
 left:-50%;top:-50%;
 visibility:visible;
 }

</style>

 <div class="monitor">
  <div class="wrapper">
   <div class="content">

 ... so you hav div 200px*100px on center ...

  </div>
 </div>
</div>

0

ayrıca bu kodu kullanabilirsiniz:

var divID = document.getElementById("divid");

var h = divID.style.pixelHeight;

1
Hmm, Chrome ve IE9'da çalışıyor, Firefox'ta çalışmıyor gibi görünüyor. Yalnızca belirli belge türleri için mi çalışır?
BrainSlugs83

1
pixelHeight, artık kullanılmaması gereken bir Internet Explorer
buluşuydu

0

tarayıcının ekran bağlantı noktasında ortalamanız gerekiyorsa; sadece CSS ile başarabilirsiniz

yourSelector {
    position: fixed;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
} 

-2

Belirli bir Dom öğesinin yüksekliğini belirleyen WKWebView kodu (tüm sayfa için düzgün çalışmıyor)

let html = "<body><span id=\"spanEl\" style=\"font-family: '\(taskFont.fontName)'; font-size: \(taskFont.pointSize - 4.0)pt; color: rgb(\(red), \(blue), \(green))\">\(textValue)</span></body>"
webView.navigationDelegate = self
webView.loadHTMLString(taskHTML, baseURL: nil)

func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
    webView.evaluateJavaScript("document.getElementById(\"spanEl\").getBoundingClientRect().height;") { [weak self] (response, error) in
        if let nValue = response as? NSNumber {

        }
    }
}

açık olmak gerekirse, bu iOS swiftkodu, değil mi? JavaScript değil. Bir downvote stopaj ediyorum (b / bu aslında oldukça yararlı olabilir c) ama bu lütfen unutmayın değil soruyu cevaplamak ve muhtemelen başka daha uygun olacağını, iOS belirli bir sorum var. Eğer zaten yoksa, belki bir soru sormayı ve kendi kendine cevap vermeyi düşünün.
Zach Lysobey

-3

OffsetWidth 0 değerini döndürürse, öğenin style width özelliğini alabilir ve bir sayı arayabilirsiniz. "100 piksel" -> 100

/\d*/.exec(MyElement.style.width)

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.