Bagaimana Anda mendapatkan tinggi elemen yang diberikan?

406

Bagaimana Anda mendapatkan tinggi elemen yang diberikan?

Katakanlah Anda memiliki <div>elemen dengan beberapa konten di dalamnya. Konten ini di dalam akan meregangkan ketinggian <div>. Bagaimana Anda mendapatkan tinggi "yang diberikan" ketika Anda belum menetapkan ketinggian secara eksplisit. Jelas, saya mencoba:

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

Apakah ada trik untuk melakukan ini? Saya menggunakan jQuery jika itu membantu.

Buddy Jo
sumber
lihat jawaban ini stackoverflow.com/questions/19581307/…
KarSho

Jawaban:

183

Seharusnya begitu

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

dengan jQuery. Ini mengambil ketinggian item pertama dalam set yang dibungkus sebagai angka.

Mencoba menggunakan

.style.height

hanya berfungsi jika Anda telah menetapkan properti di tempat pertama. Sangat tidak berguna!

Russ Cam
sumber
1
Satu kata - luar biasa! Terima kasih atas partisipasi semua orang. Banyak info bagus di utas ini. Ini akan memungkinkan saya untuk memusatkan halaman menggunakan CSS tetapi menggunakan jQuery untuk membuat ketinggian keseluruhan "wadah" div benar tanpa menjelajah ke CSS hackville. Terima kasih lagi.
BuddyJoe
3
bahkan jika Anda TIDAK menggunakan jQuery atau cant atau tidak mau, saya sangat menyarankan siapa pun yang mengimplementasikan ini hanya dengan menggunakan offsetHeight maju dan unduh sumber jQuery dan mencari "tinggi" untuk menemukan kode yang mereka gunakan. banyak hal gila terjadi di sana!
Simon_Weaver
1
@matejkramny - Pertanyaan dan jawaban ini lebih dari 5 tahun yang lalu . OP sudah menggunakan jQuery di situs mereka, daripada menerapkan kembali logika yang sama / mirip dengannya, mengapa tidak menggunakan fungsi jQuery satu baris yang sudah melakukannya? Saya setuju bahwa jQuery berlebihan untuk banyak hal dan saya tidak takut dengan vanilla JS, tetapi ketika ada fungsi di perpustakaan yang melakukan persis apa yang Anda butuhkan, tampaknya konyol untuk tidak menggunakannya, terutama karena alasan dari "Not Invented Here"
Russ Cam
3
@matejkramny Niat OP ketika mengajukan pertanyaan adalah untuk mendapatkan ketinggian elemen yang diberikan, bukan untuk memahami apa yang terjadi di DOM dan di belakang layar; jika itu niat mereka, mereka mengajukan pertanyaan yang salah. Saya setuju bahwa orang harus cenderung memahami perpustakaan dan kerangka kerja yang mereka gunakan, pengetahuan adalah kekuatan dan semua itu, tetapi kadang-kadang orang hanya ingin jawaban untuk pertanyaan tertentu. Memang, komentar di atas sudah menyarankan melihat melalui kode jQuery untuk memahami apa yang terjadi di balik layar.
Russ Cam
22
Untuk OP, menggunakan jQuery adalah jawaban yang valid. Untuk seluruh dunia melihat ini sejak saat itu, jawaban non-jQuery adalah yang terbaik. Mungkin SO perlu beradaptasi dengan kenyataan itu, mungkin jawaban dengan nilai tertinggi harus disoroti dalam beberapa cara lebih dari yang diterima.
Dimitris
1220

Coba salah satu dari:

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

clientHeight termasuk ketinggian dan bantalan vertikal.

offsetHeight termasuk ketinggian, bantalan vertikal, dan batas vertikal.

scrollHeight termasuk ketinggian dokumen yang terkandung (akan lebih besar dari sekadar tinggi jika terjadi pengguliran), bantalan vertikal, dan batas vertikal.

strager
sumber
3
Terima kasih, saya tidak tahu tentang properti ini. Ini juga kompatibel dengan IE8 +.
lyubeto
Saya bingung dengan arti dari clientHeight. Saya memiliki elemen div yang memiliki banyak elemen p di dalamnya dan kontennya jauh melampaui area browser yang dapat dilihat ke bawah. Dan saya mengharapkan clientHeight untuk memberikan tinggi yang diberikan, dan scrollHeight untuk memberikan panjang penuh. Tetapi mereka hampir sama (hanya berbeda dengan margin, padding dll).
bahti
10
@bahti kecuali ia sendiri memiliki ketinggian dan luapan terbatas: tersembunyi atau beberapa bentuk luapan: gulir, elemen akan meluas (baik dalam tampilan Anda atau tidak) untuk menampilkan semua konten dan scrollHeight dan clientHeight akan sama.
Ulad Kasach
4
Jawaban yang bagus, tetapi secara logis, batas yang mempengaruhi ketinggian elemen adalah batas atas dan bawah, yang horizontal. Jawaban ini merujuk kepada mereka sebagai "batas vertikal." Hanya berpikir saya akan menjatuhkan 2 sen saya
Kehlan Krumme
1
Dari apa yang saya tahu, .clientWidth/.clientHeight JANGAN sertakan lebar gulir jika gulir ditampilkan. Jika Anda ingin lebar gulir dimasukkan, gunakan element.getBoundingClientRect().width saja
Dmitry Gonchar
49

Kamu bisa menggunakan .outerHeight() untuk tujuan ini.

Ini akan memberi Anda ketinggian elemen penuh. Anda juga tidak perlu mengatur css-heightelemen apa pun . Untuk berjaga-jaga, Anda dapat menjaga ketinggiannya secara otomatis sehingga dapat dirender sesuai ketinggian konten.

//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);

Untuk tampilan yang jelas dari fungsi-fungsi ini Anda dapat pergi ke situs jQuery atau posting rinci di sini .

itu akan menghapus perbedaan antara .height()/ innerHeight()/outerHeight()

terbuka dan gratis
sumber
1
Terima kasih. Dalam bekerja dengan kendaraan hias, saya memiliki banyak masalah dengan ketinggian mobil tetapi tidak berpengalaman pada waktu itu. Saya biasanya belum menetapkan tinggi kecuali dalam beberapa skrip tata letak yang kompleks di mana saya awalnya membersihkan bidang tetapi mengaturnya agar sama untuk setiap blok (Div) yang berakhir dengan bagian atas yang sama. Bahkan perbedaan satu piksel di antara blok dapat merusak tata letak saat mengubah ukuran jendela.
DHorse
1
BTW, saya pikir offset memiliki beberapa penggunaan tergantung versi browser mengenai margin yang dihilangkan ini.
DHorse
2
Pertanyaannya tidak meminta jQuery. Ugh.
dthree
1
@dtree Saya pikir dia jelas menyebutkan dia menggunakan jQuery. (juga termasuk dalam Tag) :)
buka dan gratis
45

Saya menggunakan ini untuk mendapatkan ketinggian elemen (return float) :

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

Ini juga berfungsi ketika Anda menggunakan DOM virtual . Saya menggunakannya di Vue seperti ini:

this.$refs['some-ref'].getBoundingClientRect().height
Daantje
sumber
1
getBoundingClientRect (). height mengembalikan angka floating-point (sementara yang lain mengembalikan integer), bagus :)
Ari
31
style = window.getComputedStyle(your_element);

maka cukup: style.height

Feiteira
sumber
14

Pasti digunakan

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

atau

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

Saya memposting ini sebagai jawaban tambahan karena ada beberapa hal penting yang baru saya pelajari.

Saya hampir jatuh ke dalam perangkap sekarang menggunakan offsetHeight. Inilah yang terjadi :

  • Saya menggunakan trik lama yang bagus untuk menggunakan debugger untuk 'melihat' properti apa yang dimiliki elemen saya
  • Saya melihat mana yang memiliki nilai di sekitar nilai yang saya harapkan
  • Itu offsetHeight - jadi saya menggunakannya.
  • Kemudian saya menyadari itu tidak bekerja dengan DIV tersembunyi
  • Saya mencoba bersembunyi setelah menghitung maxHeight tapi itu tampak canggung - berantakan.
  • Saya melakukan pencarian - menemukan jQuery.height () - dan menggunakannya
  • menemukan ketinggian () berfungsi bahkan pada elemen tersembunyi
  • hanya untuk bersenang-senang saya memeriksa implementasi jQuery tinggi / lebar

Ini hanya sebagian saja:

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

Yup itu terlihat pada KEDUA gulir dan offset. Jika gagal, akan terlihat lebih jauh, dengan mempertimbangkan peramban akun dan masalah kompatibilitas css. Dengan kata lain STUFF I DONT CARE ABOUT - atau mau.

Tapi saya tidak harus. Terima kasih jQuery!

Moral dari cerita: jika jQuery memiliki metode untuk sesuatu itu mungkin karena alasan yang baik, kemungkinan terkait dengan kompatibilitas.

Jika Anda belum membaca daftar metode jQuery baru-baru ini saya sarankan Anda melihatnya.

Simon_Weaver
sumber
Lihat komentar Anda yang lain di tingkat pertanyaan. Saya dijual di jQuery. Sudah beberapa saat. Tapi ini menyegel kesepakatan. Saya jatuh cinta pada kenyataan bahwa hal sederhana ini akan menyelesaikan masalah tata letak 100-an untuk saya (kebanyakan di situs Intranet di mana saya tahu JavaScript berjalan).
BuddyJoe
13
document.querySelector('.project_list_div').offsetHeight;
Ritwik
sumber
4
tambahkan penjelasan ke solusi Anda
Freelancer
kemudian offsetHeight
Ritwik
6
Properti ini akan membulatkan nilainya menjadi integer . Jika Anda membutuhkan nilai float , gunakanelem.getBoundingClientRect().height
Penny Liu
12

Saya membuat kode sederhana yang bahkan tidak perlu JQuery dan mungkin akan membantu beberapa orang. Ia mendapatkan tinggi total 'ID1' setelah dimuat dan menggunakannya pada 'ID2'

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

Kemudian atur saja tubuh untuk memuatnya

<body onload='anyName()'>
Robuske
sumber
Ini berguna dan saya menggunakan sesuatu yang serupa dalam kode yang lebih kompleks.
DHorse
10

Hm kita bisa mendapatkan geometri Elemen ...

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

Bagaimana dengan JS polos ini?

Thomas Ludewig
sumber
1
var geometry; geometry={};bisa dengan mudahvar geometry={};
Mark Schultheiss
10

Saya pikir cara terbaik untuk melakukan ini pada tahun 2020 adalah dengan menggunakan js dan getBoundingClientRect().height;

Ini sebuah contoh

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

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

Selain mendapatkan heightcara ini, kami juga memiliki akses ke banyak hal lain tentang div.

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

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

Oneezy
sumber
8

Jadi ini jawabannya?

"Jika Anda perlu menghitung sesuatu tetapi tidak menunjukkannya, setel elemen ke visibility:hiddendanposition:absolute , tambahkan ke pohon DOM, dapatkan offsetHeight, dan hapus. (Itulah yang dilakukan perpustakaan prototipe di belakang garis saat terakhir kali saya memeriksa)."

Saya memiliki masalah yang sama pada sejumlah elemen. Tidak ada jQuery atau Prototipe untuk digunakan di situs tapi saya semua mendukung meminjam teknik jika berhasil. Sebagai contoh beberapa hal yang gagal berfungsi, diikuti oleh apa yang berhasil, saya memiliki kode berikut:

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

yang pada dasarnya mencoba apa saja untuk mendapatkan hasil nol. ClientHeight tanpa pengaruh. Dengan elemen masalah saya biasanya mendapatkan NaN di Base dan nol di ketinggian Offset dan Scroll. Saya kemudian mencoba solusi Add DOM dan clientRects untuk melihat apakah itu berfungsi di sini.

29 Jun 2011, saya memang memperbarui kode untuk mencoba menambahkan DOM dan clientHeight dengan hasil yang lebih baik dari yang saya harapkan.

1) clientHeight juga 0.

2) Dom benar-benar memberi saya ketinggian yang hebat.

3) ClientRects mengembalikan hasil yang hampir identik dengan teknik DOM.

Karena elemen yang ditambahkan bersifat fluida, ketika mereka ditambahkan ke elemen DOM Temp yang sebaliknya kosong, elemen-elemen tersebut diberikan sesuai dengan lebar wadah itu. Ini jadi aneh, karena itu 30px lebih pendek daripada akhirnya.

Saya menambahkan beberapa foto untuk menggambarkan bagaimana ketinggian dihitung secara berbeda. Blok menu yang diberikan secara normal Blok menu ditambahkan ke elemen DOM Temp

Perbedaan ketinggiannya jelas. Saya tentu saja dapat menambahkan posisi absolut dan tersembunyi tetapi saya yakin itu tidak akan berpengaruh. Saya terus diyakinkan bahwa ini tidak akan berhasil!

(Saya ngelantur lebih jauh) Ketinggian yang keluar (menjadikan) lebih rendah dari tinggi yang diberikan benar. Ini dapat diatasi dengan mengatur lebar elemen Temp DOM agar sesuai dengan induk yang ada dan dapat dilakukan secara cukup akurat dalam teori. Saya juga tidak tahu apa hasil dari menghapus mereka dan menambahkannya kembali ke lokasi mereka yang ada. Ketika mereka tiba melalui teknik innerHTML saya akan mencari menggunakan pendekatan yang berbeda ini.

* NAMUN * Tidak ada yang diperlukan. Bahkan itu berfungsi seperti yang diiklankan dan mengembalikan ketinggian yang benar !!!

Ketika saya bisa membuat menu terlihat lagi dengan luar biasa DOM telah mengembalikan ketinggian yang tepat per tata letak cairan di bagian atas halaman (279px). Kode di atas juga menggunakan getClientRects yang mengembalikan 280px.

Ini diilustrasikan dalam snapshot berikut (diambil dari Chrome sekali berfungsi.)
masukkan deskripsi gambar di sini

Sekarang saya tidak tahu mengapa trik prototipe itu berhasil, tetapi sepertinya begitu. Atau, getClientRects juga berfungsi.

Saya menduga penyebab semua masalah ini dengan elemen-elemen khusus ini adalah penggunaan innerHTML bukan appendChild, tapi itu adalah spekulasi murni pada titik ini.

DHorse
sumber
6

offsetHeight, biasanya.

Jika Anda perlu menghitung sesuatu tetapi tidak menunjukkannya, setel elemen ke visibility:hiddendan position:absolute, tambahkan ke pohon DOM, dapatkan offsetHeight, dan hapus. (Itulah yang dilakukan perpustakaan prototipe di belakang layar terakhir kali saya periksa).

htoip
sumber
menarik. Saya belum pernah memeriksa prototipe. tahu mengapa jQuery tidak melakukan itu di belakang layar?
Simon_Weaver
Saya melihat bahwa ketika mengalami kesulitan dan menguji teknik itu dan itu bekerja cukup baik dalam JavaScript biasa
DHorse
5

Terkadang offsetHeight akan mengembalikan nol karena elemen yang Anda buat belum dirender di Dom. Saya menulis fungsi ini untuk keadaan seperti itu:

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;
}
Lonnie Best
sumber
Anda perlu mengkloning elemen itu jika tidak akan dihapus dari dom sepenuhnya sepertinya dari kode Anda itulah yang akan terjadi.
punkbit
Kode ini tidak dimaksudkan untuk menyimpan elemen dalam DOM. Ini dimaksudkan untuk memasukkannya ke dalam DOM hanya sebentar (cukup lama untuk membuatnya dan mendapatkan ketinggiannya), kemudian membawanya keluar. Anda kemudian dapat memasukkan elemen ke dalam dom di tempat lain nanti (mengetahui apa ketinggiannya sebelum Anda melakukannya). Perhatikan nama fungsi "getHeight"; hanya itu yang ingin dilakukan oleh kode.
Lonnie Best
@punkbit: Saya mengerti maksud Anda. Elemen Anda sudah ada di dalam dom. Kode yang saya tulis adalah untuk elemen yang belum ada di DOM. Kloning akan lebih baik, seperti yang Anda katakan, karena tidak masalah jika elemennya ada di dom atau tidak.
Lonnie Best
@ punkbit: Saya memodifikasi penggunaan kode kloning, tetapi belum mengujinya.
Lonnie Best
ya, itu maksud saya. Tampak bagi saya bahwa ia mengatakan "elemen" untuk elemen yang ada di DOM. Tapi semuanya baik-baik saja! Jangan salah.
punkbit
4

Jika Anda sudah menggunakan jQuery, taruhan terbaik Anda adalah .outerHeight()atau.height() , seperti yang telah dinyatakan.

Tanpa jQuery, Anda dapat mencentang ukuran kotak yang digunakan dan menambahkan berbagai bantalan + batas + clientHeight, atau Anda dapat menggunakan getComputedStyle :

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

h sekarang akan menjadi string seperti "53.825px".

Dan saya tidak dapat menemukan referensi, tapi saya pikir saya dengar getComputedStyle()bisa mahal, jadi itu mungkin bukan sesuatu yang ingin Anda panggil pada setiap window.onscrollacara (tapi kemudian, tidak juga jQuery height()).

chbrown
sumber
Setelah Anda memiliki ketinggian getComputedStyle, gunakan parseInt(h, 10)untuk mendapatkan bilangan bulat untuk perhitungan.
RhodanV5500
2

Dengan Mootools :

$('someDiv').getSize().y

kwcto
sumber
1

Jika saya memahami pertanyaan Anda dengan benar, maka mungkin sesuatu seperti ini akan membantu:

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');
    } 
}
LuisBento
sumber
-4

Sudahkah Anda mengatur ketinggian di css secara spesifik? Jika belum, Anda harus menggunakan offsetHeight;daripadaheight

var h = document.getElementById('someDiv').style.offsetHeight;
Steerpike
sumber
8
offsetHeight adalah properti dari elemen itu sendiri, bukan dari gayanya.
Shog9