Làm thế nào để bạn có được chiều cao kết xuất của một yếu tố?


406

Làm thế nào để bạn có được chiều cao kết xuất của một yếu tố?

Giả sử bạn có một <div>yếu tố với một số nội dung bên trong. Nội dung này bên trong sẽ kéo dài chiều cao của <div>. Làm thế nào để bạn có được chiều cao "được kết xuất" khi bạn không đặt chiều cao một cách rõ ràng. Rõ ràng, tôi đã thử:

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

Có một mẹo để làm điều này? Tôi đang sử dụng jQuery nếu điều đó có ích.


xem câu trả lời này stackoverflow.com/questions/19581307/
Mạnh

Câu trả lời:


183

Nó chỉ nên là

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

với jQuery. Điều này lấy chiều cao của mục đầu tiên trong tập được bọc dưới dạng số.

Đang cố gắng sử dụng

.style.height

chỉ hoạt động nếu bạn đã đặt thuộc tính ở vị trí đầu tiên. Không hữu ích lắm!


1
Một từ - tuyệt vời! Cảm ơn sự tham gia của mọi người. Rất nhiều thông tin tốt về chủ đề này. Điều này sẽ cho phép tôi căn giữa các trang bằng CSS nhưng sử dụng jQuery để làm cho chiều cao tổng thể của div "container" chính xác mà không cần mạo hiểm vào CSS hackville. Cảm ơn một lần nữa.
BuddyJoe

3
ngay cả khi bạn KHÔNG sử dụng jQuery hoặc không thể hoặc không muốn, tôi thực sự khuyên mọi người nên thực hiện điều này bằng cách chỉ sử dụng offsetHeight đi trước và tải xuống nguồn jQuery và tìm kiếm "chiều cao" để tìm mã họ sử dụng. rất nhiều thứ điên rồ đang diễn ra ở đó!
Simon_Weaver

1
@matejkramny - Câu hỏi và câu trả lời này đã hơn 5 năm trước . OP đã sử dụng jQuery trên trang web của họ thay vì triển khai lại logic tương tự / tương tự anh ấy / cô ấy, tại sao không sử dụng hàm jQuery một dòng đã làm điều đó? Tôi đồng ý rằng jQuery quá mức cần thiết cho nhiều thứ và tôi không sợ vanilla JS, nhưng khi có một chức năng trong thư viện thực hiện chính xác những gì bạn cần, có vẻ như thật ngớ ngẩn khi không sử dụng nó, đặc biệt là vì lý do của "Không được phát minh ở đây"
Russ Cam

3
@matejkramny Ý định của OP khi đặt câu hỏi là lấy chiều cao được hiển thị của phần tử, không hiểu những gì đang xảy ra trong DOM và đằng sau hậu trường; nếu đó là ý định của họ, họ đã hỏi sai câu hỏi. Tôi đồng ý rằng mọi người nên có khuynh hướng hiểu các thư viện và khung mà họ sử dụng, kiến ​​thức là sức mạnh và tất cả những thứ đó, nhưng đôi khi người ta chỉ muốn một câu trả lời cho một câu hỏi cụ thể. Thật vậy, các ý kiến ​​trên đã đề nghị xem qua mã jQuery để hiểu những gì đang diễn ra sau hậu trường.
Nga Cam

22
Đối với OP, sử dụng jQuery là một câu trả lời hợp lệ. Đối với phần còn lại của thế giới nhìn thấy điều này từ đó trở đi, câu trả lời không phải là jQuery là câu trả lời hay nhất. Có lẽ SO cần thích nghi với thực tế đó, có lẽ những câu trả lời được bình chọn cao nhất nên được làm nổi bật theo một cách nào đó hơn những câu được chấp nhận.
Dimitris

1220

Hãy thử một trong:

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

clientHeight bao gồm chiều cao và đệm dọc.

offsetHeight bao gồm chiều cao, đệm dọc và đường viền dọc.

scrollHeight bao gồm chiều cao của tài liệu chứa (sẽ lớn hơn chiều cao chỉ trong trường hợp cuộn), đệm dọc và viền dọc.


3
Cảm ơn, tôi đã không biết về khách sạn này. Nó cũng tương thích với IE8 +.
lyubeto

Tôi bối rối với ý nghĩa của clientHeight. Tôi có một phần tử div có một loạt các phần tử p trong đó và nội dung vượt xa khu vực có thể xem được của trình duyệt trở xuống. Và tôi mong đợi clientHeight sẽ cho chiều cao được hiển thị và scrollHeight sẽ cho toàn bộ chiều dài. Nhưng chúng gần như bằng nhau (chỉ khác nhau bởi lề, phần đệm, v.v.).
bahti

10
@bahti trừ khi bản thân nó có chiều cao hạn chế và tràn: ẩn hoặc một dạng tràn nào đó: cuộn, phần tử sẽ mở rộng (cho dù theo quan điểm của bạn hay không) để hiển thị tất cả nội dung và scrollHeight và clientHeight sẽ bằng nhau.
Ulad Kasach

4
Câu trả lời tuyệt vời, nhưng về mặt logic, các đường viền ảnh hưởng đến chiều cao của một phần tử là các đường viền trên và dưới, nằm ngang. Câu trả lời này gọi chúng là "đường viền dọc". Chỉ cần nghĩ rằng tôi đã giảm 2 xu của mình
Kehlan Krumme

1
Từ những gì tôi biết, .clientWidth/.clientHeight KHÔNG bao gồm chiều rộng cuộn nếu cuộn được hiển thị. Nếu bạn muốn bao gồm chiều rộng cuộn, có thể sử dụng element.getBoundingClientRect().width thay thế
Dmitry Gonchar

151

NON JQUERY vì có một loạt các liên kết sử dụng elem.style.heighttrong đầu các câu trả lời này ...

SỨC KHỎE ĐẦU TƯ:
https://developer.mozilla.org/en-US/docs/Web/API/Euity.clientHeight

document.getElementById(id_attribute_value).clientHeight;

NGOÀI TRỜI:
https://developer.mozilla.org/en-US/docs/Web/API/HTMLEuity.offsetHeight

document.getElementById(id_attribute_value).offsetHeight; 

Hoặc một trong những tài liệu tham khảo yêu thích của tôi: http://youmightnotneedjquery.com/


49

Bạn có thể sử dụng .outerHeight()cho mục đích này.

Nó sẽ cung cấp cho bạn chiều cao hoàn trả của phần tử. Ngoài ra, bạn không cần thiết lập bất kỳ css-heightyếu tố nào. Để phòng ngừa, bạn có thể giữ chiều cao của nó tự động để nó có thể được hiển thị theo chiều cao của mỗi nội dung.

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

Để có cái nhìn rõ ràng về các chức năng này, bạn có thể vào trang web của jQuery hoặc một bài viết chi tiết tại đây .

nó sẽ xóa sự khác biệt giữa .height()/ innerHeight()/outerHeight()


1
Cảm ơn. Khi làm việc với phao, tôi gặp nhiều rắc rối với chiều cao tự động nhưng sau đó thiếu kinh nghiệm. Tôi thường không thiết lập chiều cao ngoại trừ trong một số tập lệnh bố cục phức tạp, ban đầu tôi xóa trường nhưng đặt nó bằng nhau cho mỗi khối (Div) kết thúc với cùng một đỉnh. Thậm chí sự khác biệt một pixel giữa các khối có thể làm hỏng bố cục khi thay đổi kích thước cửa sổ.
DHorse

1
BTW, tôi nghĩ rằng offset có một số cách sử dụng phụ thuộc phiên bản trình duyệt liên quan đến lề mà điều này loại bỏ.
DHorse

2
Câu hỏi không gọi cho jQuery. Ừ
dthree

1
@dthree Tôi nghĩ rằng anh ấy đã đề cập rõ ràng rằng anh ấy đang sử dụng jQuery. (cũng được bao gồm trong Thẻ) :)
mở và miễn phí vào

45

Tôi sử dụng điều này để có được chiều cao của một phần tử (trả về float) :

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

Nó cũng hoạt động khi bạn sử dụng DOM ảo . Tôi sử dụng nó trong Vue như thế này:

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

1
getBoundingClientRect (). height trả về số dấu phẩy động (trong khi các số khác trả về số nguyên), đẹp :)
Ari

31
style = window.getComputedStyle(your_element);

sau đó chỉ đơn giản là: style.height


14

Chắc chắn sử dụng

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

hoặc là

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

Tôi đang đăng bài này như một câu trả lời bổ sung vì có một vài điều quan trọng tôi vừa học được.

Tôi gần như rơi vào cái bẫy ngay bây giờ khi sử dụng offsetHeight. Đây là những gì đã xảy ra :

  • Tôi đã sử dụng thủ thuật cũ tốt là sử dụng trình gỡ lỗi để 'xem' các thuộc tính mà phần tử của tôi có
  • Tôi đã thấy cái nào có giá trị xung quanh giá trị mà tôi đang mong đợi
  • Đó là offsetHeight - vì vậy tôi đã sử dụng nó.
  • Sau đó tôi nhận ra nó không hoạt động với một DIV ẩn
  • Tôi đã cố gắng che giấu sau khi tính toán maxHeight nhưng điều đó có vẻ vụng về - gặp rắc rối.
  • Tôi đã thực hiện tìm kiếm - phát hiện ra jQuery.height () - và đã sử dụng nó
  • tìm ra chiều cao () hoạt động ngay cả trên các yếu tố ẩn
  • chỉ để cho vui, tôi đã kiểm tra việc triển khai jQuery về chiều cao / chiều rộng

Đây chỉ là một phần của nó:

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

Yup nó nhìn vào cuộn BÓNG và bù đắp. Nếu thất bại, nó có vẻ xa hơn, tính đến các vấn đề tương thích với trình duyệt và css. Nói cách khác, NHÂN VIÊN TÔI KHÔNG CHĂM SÓC - hoặc muốn.

Nhưng tôi không phải làm thế. Cảm ơn jQuery!

Đạo đức của câu chuyện: nếu jQuery có một phương thức cho một cái gì đó có lẽ vì một lý do chính đáng, có khả năng liên quan đến tương thích.

Nếu bạn chưa đọc qua danh sách các phương thức jQuery gần đây, tôi khuyên bạn nên xem qua.


Xem bình luận khác của bạn ở cấp độ câu hỏi. Tôi đang bán trên jQuery. Đã được một lúc. Nhưng điều này đã niêm phong thỏa thuận. Tôi rất thích thực tế điều đơn giản này sẽ giải quyết 100 vấn đề về bố cục cho tôi (chủ yếu trên các trang Intranet nơi tôi biết JavaScript đang chạy).
BuddyJoe

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

4
thêm giải thích cho giải pháp của bạn
Freelancer

sau đó offsetHeight
Ritwik

6
Thuộc tính này sẽ làm tròn giá trị thành một số nguyên . Nếu bạn cần một giá trị nổi , hãy sử dụngelem.getBoundingClientRect().height
Penny Liu

12

Tôi đã tạo một mã đơn giản thậm chí không cần JQuery và có thể sẽ giúp một số người. Nó nhận được tổng chiều cao của 'ID1' sau khi được tải và sử dụng nó trên 'ID2'

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

Sau đó, chỉ cần đặt cơ thể để tải nó

<body onload='anyName()'>

Nó rất hữu ích và tôi sử dụng một cái gì đó tương tự trong mã phức tạp hơn.
DHorse

10

Hừm, chúng ta có thể lấy hình học Element ...

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

Làm thế nào về JS đơn giản này?


1
var geometry; geometry={};có thể chỉ đơn giản làvar geometry={};
Mark Schultheiss

10

Tôi nghĩ cách tốt nhất để làm điều này vào năm 2020 là sử dụng js đơn giản và getBoundingClientRect().height;

Đây là một ví dụ

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

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

Ngoài việc có được heightcách này, chúng tôi còn có quyền truy cập vào một loạt các nội dung khác về div.

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

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


8

Vì vậy, đây có phải là câu trả lời?

"Nếu bạn cần tính toán một cái gì đó nhưng không hiển thị nó, hãy đặt phần tử thành visibility:hiddenposition:absolute, thêm nó vào cây DOM, lấy offsetHeight và xóa nó. (Đó là những gì mà thư viện nguyên mẫu thực hiện sau các dòng tôi đã kiểm tra lần trước)."

Tôi có cùng một vấn đề về một số yếu tố. Không có jQuery hoặc Prototype được sử dụng trên trang web nhưng tôi hoàn toàn ủng hộ việc mượn kỹ thuật này nếu nó hoạt động. Như một ví dụ về một số điều không hoạt động, tiếp theo là những gì đã làm, tôi có đoạn mã sau:

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

mà về cơ bản là thử mọi thứ và mọi thứ chỉ để có kết quả bằng không. ClientHeight không ảnh hưởng. Với các yếu tố vấn đề, tôi thường nhận được NaN trong Base và 0 ở độ cao Offset và Scroll. Sau đó tôi đã thử giải pháp Thêm DOM và clientRects để xem nó có hoạt động ở đây không.

Ngày 29 tháng 6 năm 2011, tôi thực sự đã cập nhật mã để thử cả thêm vào DOM và clientHeight với kết quả tốt hơn tôi mong đợi.

1) clientHeight cũng là 0.

2) Dom thực sự đã cho tôi một chiều cao tuyệt vời.

3) ClientRects trả về một kết quả gần giống với kỹ thuật DOM.

Bởi vì các phần tử được thêm vào có tính chất lỏng, khi chúng được thêm vào phần tử DOM Temp trống khác, chúng được hiển thị theo chiều rộng của vùng chứa đó. Điều này trở nên kỳ lạ, bởi vì nó ngắn hơn 30px so với cuối cùng.

Tôi đã thêm một vài ảnh chụp nhanh để minh họa cách tính chiều cao khác nhau. Khối menu hiển thị bình thường Khối menu được thêm vào phần tử DOM Temp

Sự khác biệt chiều cao là rõ ràng. Tôi chắc chắn có thể thêm định vị tuyệt đối và ẩn nhưng tôi chắc chắn rằng nó sẽ không có hiệu lực. Tôi tiếp tục bị thuyết phục rằng điều này sẽ không hoạt động!

(Tôi lạc đề thêm) Chiều cao đi ra (ám) thấp hơn chiều cao được hiển thị thực. Điều này có thể được giải quyết bằng cách đặt độ rộng của phần tử DOM Temp phù hợp với cha mẹ hiện có và có thể được thực hiện khá chính xác trên lý thuyết. Tôi cũng không biết điều gì sẽ dẫn đến việc loại bỏ chúng và thêm chúng trở lại vị trí hiện tại của chúng. Khi họ đến thông qua một kỹ thuật InternalHTML, tôi sẽ tìm cách sử dụng phương pháp khác này.

* TUY NHIÊN * Không ai trong số đó là cần thiết. Trong thực tế, nó hoạt động như quảng cáo và trả lại chiều cao chính xác !!!

Khi tôi có thể làm cho các menu hiển thị trở lại một cách đáng kinh ngạc, DOM đã trả lại chiều cao chính xác cho mỗi bố cục chất lỏng ở đầu trang (279px). Đoạn mã trên cũng sử dụng getClientRects trả về 280px.

Điều này được minh họa trong ảnh chụp nhanh sau đây (được lấy từ Chrome sau khi làm việc.)
nhập mô tả hình ảnh ở đây

Bây giờ tôi có ý tưởng không rõ tại sao thủ thuật nguyên mẫu đó hoạt động, nhưng có vẻ như vậy. Ngoài ra, getClientRects cũng hoạt động.

Tôi nghi ngờ nguyên nhân của tất cả những rắc rối này với các yếu tố đặc biệt này là việc sử dụng InternalHTML thay vì appendChild, nhưng đó chỉ là suy đoán thuần túy vào thời điểm này.


6

offsetHeight, thông thường.

Nếu bạn cần tính toán một cái gì đó nhưng không hiển thị nó, hãy đặt phần tử thành visibility:hiddenposition:absolute, thêm nó vào cây DOM, lấy offsetHeightvà loại bỏ nó. (Đó là những gì thư viện nguyên mẫu làm đằng sau hậu trường lần trước tôi đã kiểm tra).


hấp dẫn. Tôi chưa bao giờ kiểm tra nguyên mẫu. Bất cứ ý tưởng tại sao jQuery không làm điều đó đằng sau hậu trường?
Simon_Weaver

Tôi thấy rằng khi gặp khó khăn và đã thử nghiệm kỹ thuật đó và nó hoạt động khá tốt trong JavaScript đơn giản
DHorse

5

Đôi khi offsetHeight sẽ trả về 0 vì phần tử bạn đã tạo chưa được hiển thị trong Dom. Tôi đã viết chức năng này cho các trường hợp như vậy:

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

bạn cần sao chép phần tử nếu không nó sẽ bị xóa hoàn toàn khỏi dom, dường như mã của bạn sẽ xảy ra.
punkbit

Mã này không có ý định giữ phần tử trong DOM. Dự định sẽ đưa nó vào DOM chỉ trong một thời gian ngắn (đủ lâu để hiển thị nó và lấy chiều cao của nó), sau đó nó đưa nó ra ngoài. Sau này bạn có thể đặt phần tử vào dom ở nơi khác sau (biết chiều cao của nó sẽ là bao nhiêu trước khi bạn làm). Lưu ý tên hàm "getHeight"; đó là tất cả những gì mã dự định làm.
Lonnie hay nhất

@punkbit: Tôi hiểu ý của bạn. Yếu tố của bạn đã ở trong dom. Mã tôi đã viết là cho một phần tử chưa có trong DOM. Nhân bản sẽ tốt hơn, như bạn nói, bởi vì nó không quan trọng nếu yếu tố đó có ở trong vòm hay không.
Lonnie hay nhất

@punkbit: Tôi đã sửa đổi mã sử dụng nhân bản, nhưng chưa kiểm tra nó.
Lonnie hay nhất

Vâng, đó là quan điểm của tôi. Dường như với tôi rằng anh ta nói "phần tử" cho một phần tử hiện có trong DOM. Nhưng tất cả đều tốt! Không nhận được nó sai.
punkbit

4

Nếu bạn đang sử dụng jQuery, đặt cược tốt nhất của bạn là .outerHeight()hoặc .height(), như đã nêu.

Nếu không có jQuery, bạn có thể kiểm tra kích thước hộp đang sử dụng và thêm các phần đệm khác nhau + viền + clientHeight hoặc bạn có thể sử dụng getComputingStyle :

var h = getComputingStyle (document.getEuityById ('someDiv')). height;

h bây giờ sẽ là một chuỗi như "53.825px".

Và tôi không thể tìm thấy tài liệu tham khảo, nhưng tôi nghĩ rằng tôi nghe thấy getComputedStyle()có thể tốn kém, vì vậy đây có thể không phải là thứ bạn muốn gọi cho mỗi window.onscrollsự kiện (nhưng sau đó, cũng không phải là của jQuery height()).


Khi bạn có chiều cao từ getComputedStyle, sử dụng parseInt(h, 10)để lấy số nguyên cho các phép tính.
RhodanV5500


1

Nếu tôi hiểu chính xác câu hỏi của bạn, thì có lẽ điều gì đó như thế này sẽ giúp ích:

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

Bạn đã thiết lập chiều cao trong css cụ thể? Nếu bạn không cần sử dụng offsetHeight;hơn làheight

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

8
offsetHeight là một thuộc tính của chính phần tử, không phải theo kiểu của nó.
Shog9
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.