要素のレンダリングされた高さをどのように取得しますか?


406

要素のレンダリングされた高さをどのように取得しますか?

<div>中にコンテンツがある要素があるとしましょう。内部のこのコンテンツは、の高さを伸ばし<div>ます。高さを明示的に設定していない場合に、「レンダリングされた」高さを取得するにはどうすればよいですか。明らかに、私は試しました:

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

これを行うためのトリックはありますか?それが役立つ場合は、jQueryを使用しています。


回答:


183

それだけです

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

jQueryで。ラップされたセットの最初のアイテムの高さを数値として取得します。

使ってみる

.style.height

最初にプロパティを設定した場合にのみ機能します。あまり役に立たない!


1
一言-すごい!皆様のご参加ありがとうございました。このスレッドに関するたくさんの良い情報。これにより、CSSを使用してページを中央に配置できますが、jQueryを使用して、CSSハックビルに手を出すことなく、「コンテナー」divの全体の高さを正しくします。再度、感謝します。
BuddyJoe 2009

3
jQueryを使用していない、またはできない、またはしたくない場合でも、offsetHeightだけを使用してこれを実装する人にjQueryソースをダウンロードして「height」を検索し、使用するコードを見つけてください。そこにはクレイジーなものがたくさんあります!
Simon_Weaver 2009

1
@matejkramny-この質問と回答は5年以上前です。OPは既にサイトでjQueryを使用していたので、同じ/類似のロジックを自分で再実装するのではなく、すでにそれを実行している1行のjQuery関数を使用してみませんか?jQueryは多くのことに対して過剰であり、私はバニラJSを恐れていませんが、ライブラリーに必要な機能を正確に実行する関数がある場合、特に理由により、それを使用しないのはばかげているように思われます「ここでは発明されていない」の
Russ Cam '27年

3
@matejkramny OPが質問をするときの意図は、要素のレンダリングされた高さを取得することであり、DOMと舞台裏で何が起こっているのかを理解することではありません。それが彼らの意図であるならば、彼らは間違った質問をしました。私は人々が彼らが使用するライブラリとフレームワークを理解する傾向があるべきであることに同意します、知識は力であり、それだけですが、時には特定の質問への答えを望みます。実際、上記のコメントは、jQueryコードを調べて、舞台裏で何が行われているのかを理解することをすでに示唆しています。
ラスカム

22
OPにとって、jQueryの使用は有効な答えです。それ以降、世界の他の国では、jQuery以外の回答が最適です。おそらく、SOはその現実に適応する必要があります。おそらく、最も投票数の多い回答を、受け入れられた回答よりも何らかの方法で強調する必要があります。
Dimitris

1220

次のいずれかを試してください。

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

clientHeight 高さと垂直方向のパディングが含まれます。

offsetHeight 高さ、垂直パディング、および垂直ボーダーが含まれます。

scrollHeight 含まれているドキュメントの高さ(スクロールの場合は高さよりも大きくなります)、垂直パディング、垂直ボーダーが含まれます。


3
ありがとう、私はこの物件について知りませんでした。IE8 +にも対応しています。
lyubeto 14

clientHeightの意味に困惑しています。たくさんのp要素を含むdiv要素があり、コンテンツがブラウザーの表示可能領域をはるかに超えて下に移動します。そして、私はclientHeightがレンダリングされた高さを与え、scrollHeightが全長を与えると期待していました。しかし、それらはほとんど同じです(マージン、パディングなどが異なるだけです)。
バハティ2015

10
@bahtiそれ自体の高さが制限されていて、overflow:hiddenまたはなんらかの形式のoverflow:scrollがない限り、要素は(ビュー内かどうかに関係なく)展開してすべてのコンテンツを表示し、scrollHeightとclientHeightは等しくなります。
Ulad Kasach

4
正解ですが、論理的には、要素の高さに影響を与える境界は、水平方向の上部と下部の境界です。この回答では、それらを「垂直境界」と呼んでいます。私は私の2セントを落とすと思った
Kehlan Krumme

1
私が知っていることから、スクロールが表示されている場合.clientWidth/.clientHeight はスクロール幅を含めないください。スクロール幅を含める場合は、element.getBoundingClientRect().width 代わりに使用できます
Dmitry Gonchar

151

これらの回答の上部に使用されているリンクの束があったので、JQUERY以外 ...elem.style.height

内部高さ:https :
//developer.mozilla.org/en-US/docs/Web/API/Element.clientHeight

document.getElementById(id_attribute_value).clientHeight;

外側の高さ:https :
//developer.mozilla.org/en-US/docs/Web/API/HTMLElement.offsetHeight

document.getElementById(id_attribute_value).offsetHeight; 

または私のお気に入りの参照の1つ:http : //youmightnotneedjquery.com/


49

.outerHeight()この目的に使用できます。

それはあなたに要素の完全なレンダリングされた高さを与えます。また、css-height要素を設定する必要はありません。予防策として、コンテンツの高さに従ってレンダリングできるように、高さを自動に保つことができます。

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

これらの関数の明確なビューについては、jQueryのサイトまたはここの詳細な投稿を参照してください

それがクリアされます違いの間を.height()/ innerHeight()/outerHeight()


1
ありがとう。フロートでの作業では、高さ自動で多くの問題がありましたが、そのときは経験がありませんでした。私は通常、最初にフィールドをクリアするが、同じトップで終わる各ブロック(Div)に等しくなるように設定するいくつかの複雑なレイアウトスクリプトを除いて、高さを設定していません。ブロック間の1ピクセルの違いでも、ウィンドウのサイズを変更するときにレイアウトを台無しにする可能性があります。
DHorse 2013

1
ところで、オフセットには、これによって排除されるマージンに関して、ブラウザのバージョンに依存する用途があると思います。
DHorse 2013

2
質問はjQueryを必要としません。ああ。
dthree 2017

1
@dthree彼はjQueryを使用していることを明確に述べたと思います。(タグにも含まれます):)
オープンで無料

45

これを使用して要素の高さを取得します(floatを返します)

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

仮想DOMを使用する場合にも機能します。私はVueで次のように使用します。

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

1
getBoundingClientRect()。heightは浮動小数点数を返します(他は整数を返します)、nice :)
Ari


14

絶対に使う

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

または

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

私がこれまでに学んだ重要なことがいくつかあるので、これを追加の回答として投稿します。

私はちょうど今ちょうどoffsetHeightを使用するという罠に陥りました。これが起こったことです:

  • デバッガーを使用して、私の要素のプロパティを「監視」するという古き良きトリックを使用しました
  • どれが私が期待していた値の周りの値を持っているかを見ました
  • それはoffsetHeightだったので、それを使用しました。
  • その後、非表示のDIVでは機能しないことに気付きました
  • maxHeightを計算した後で非表示にしてみましたが、見苦しいようでした-混乱しました。
  • 私は検索を行いました-jQuery.height()を発見し-それを使用しました
  • 隠された要素でもheight()が機能することが判明
  • ちょうど楽しみのために、高さ/幅のjQuery実装をチェックしました

以下はその一部です。

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

うん、それはスクロールとオフセットの両方を見る。それが失敗した場合、ブラウザとCSSの互換性の問題を考慮に入れて、さらに調べます。言い換えれば、私は気にしないでください-またはしたいです。

しかし、私はする必要はありません。jQueryに感謝!

話の教訓:jQueryが何かのためのメソッドを持っている場合、それはおそらく互換性に関連するおそらく正当な理由によるものです。

最近、jQueryのメソッドリストを読んでいない場合は、ぜひご覧ください。


質問レベルで他のコメントを見ました。私はjQueryで販売しています。しばらく行っています。しかし、これで契約は成立した。私はこの単純なことで何百ものレイアウトの問題を解決できるという事実が大好きです(ほとんどがJavaScriptが実行されていることがわかっているイントラネットサイトで)。
BuddyJoe 2009

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

4
ソリューションに説明を追加
Freelancer

次に、offsetHeight
Ritwik

6
このプロパティは値を整数に丸めます。浮動小数点値が必要な場合は、elem.getBoundingClientRect().height
Penny Liu

12

私は、JQueryを必要とせず、おそらく何人かの人々を助ける単純なコードを作成しました。ロード後に「ID1」の全高を取得し、「ID2」で使用します

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

次に、本体をロードするように設定します

<body onload='anyName()'>

それは便利で、より複雑なコードでも同じようなものを採用しています。
DHorse 2013

10

要素のジオメトリを取得できます...

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

この単純なJSはどうですか?


1
var geometry; geometry={};単にすることができますvar geometry={};
マークシュルタイス

10

2020年にこれを行う最良の方法は、プレーンなjsと getBoundingClientRect().height;

ここに例があります

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

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

取得の上にheightこのように、我々はまた、およそ他の原料の束へのアクセス権を持っていますdiv

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

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


8

これが答えですか?

「何かを計算する必要があるが表示しない場合は、要素をに設定しvisibility:hiddenposition:absoluteそれをDOMツリーに追加し、offsetHeightを取得して削除します(これは、プロトタイプライブラリが最後にチェックした行の背後にあるものです)。」

多くの要素で同じ問題があります。サイトで使用するjQueryまたはPrototypeはありませんが、機能する場合は、この手法を借用することに賛成です。機能しなかったいくつかの例として、何が続いたのか、次のコードを示します。

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

これは基本的に何もせず、すべてゼロの結果を得るためだけに試みます。影響のないClientHeight。問題のある要素を使用すると、通常はベースでNaNが取得され、オフセットとスクロールの高さがゼロになります。次に、Add DOMソリューションとclientRectsを試して、ここで機能するかどうかを確認しました。

2011年6月29日、実際にコードを更新して、DOMとclientHeightの両方に追加して、予想よりも良い結果が得られるようにしました。

1)clientHeightも0でした。

2)ドムは実際に私に素晴らしい高さを与えました。

3)ClientRectsは、DOM手法とほぼ同じ結果を返します。

追加された要素は本質的に流動的であるため、他の場合は空のDOM Temp要素に追加されると、それらはそのコンテナの幅に従ってレンダリングされます。最終的には30px短くなるので、これは奇妙になります。

高さの計算方法が異なる例を示すために、いくつかのスナップショットを追加しました。 通常レンダリングされるメニューブロック DOM Temp要素に追加されたメニューブロック

高さの違いは明らかです。私は確かに絶対配置を追加して非表示にすることができますが、それは効果がないと確信しています。私はこれがうまくいかないと確信し続けました!

(さらに説明します)高さが実際のレンダリングされた高さよりも低くなります(レンダリング)。これは、DOM Temp要素の幅を既存の親と一致するように設定することで対処でき、理論的にはかなり正確に実行できます。また、それらを削除して既存の場所に戻すとどうなるかわかりません。彼らがinnerHTMLテクニックを介して到着したとき、私はこの異なるアプローチを使用して探します。

*しかし*それは必要ありませんでした。実際、それは宣伝どおりに機能し、正しい高さを返しました!!!

メニューを再び表示できるようになったとき、驚くべきことに、DOMはページ上部の流動レイアウトごとに正しい高さ(279px)を返しました。上記のコードは、280pxを返すgetClientRectsも使用しています。

これは次のスナップショットに示されています(Chromeから動作した後に取得)。
ここに画像の説明を入力してください

今、私はそのプロトタイプのトリックが機能する理由を考えていませんが、そうです。または、getClientRectsも機能します。

これらの特定の要素に関するこのすべての問題の原因は、appendChildの代わりにinnerHTMLを使用したためだと思いますが、これは現時点では純粋な推測です。


6

offsetHeight、通常。

何かを計算する必要があるが表示しない場合は、要素をvisibility:hiddenandに設定し、position:absoluteそれをDOMツリーに追加して、を取得してoffsetHeight削除します。(これは、前回チェックしたときにプロトタイプライブラリが舞台裏で行っていることです)。


面白い。私はプロトタイプをチェックしたことがありません。jQueryが舞台裏でそれをしない理由は何ですか?
Simon_Weaver 2009

私は問題があることを知り、そのテクニックをテストしたところ、プレーンJavaScriptで非常にうまく機能しました
DHorse

5

作成した要素がまだDomでレンダリングされていないため、offsetHeightがゼロを返すことがあります。私はそのような状況のためにこの関数を書きました:

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

要素を複製する必要があります。そうしないと、DOMから完全に削除されて、コードから完全に削除されます。
punkbit

このコードは、要素をDOMに保持することを意図したものではありません。それをDOMに簡単に(レンダリングして高さを取得するのに十分な長さ)入れてから取り出すことを目的としています。後で要素を別の場所にdomに配置できます(実行する前に、その高さを知っておいてください)。関数名「getHeight」に注意してください。それがコードが意図するすべてです。
ロニーベスト

@punkbit:私はあなたの意味を理解しています。あなたの要素はすでにdomにあります。私が書いたコードは、まだDOMに含まれていない要素用です。あなたが言うように、要素がdomにあるかどうかに関係なく、クローニングはより良いでしょう。
ロニーベスト

@punkbit:クローンを使用してコードを変更しましたが、テストしていません。
ロニーベスト

そう、それが私のポイントでした。彼はDOMの既存の要素について「要素」と言っているように見えました。しかし、すべて良い!誤解しないでください。
punkbit 2016

4

すでにjQueryを使用している.outerHeight()場合は.height()、述べたように、最善の策はまたはです。

jQueryを使用しない場合は、使用中のボックスのサイズを確認して、さまざまなパディング+ボーダー+ clientHeightを合計するgetComputedStyleを使用できます

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

h これで、「53.825px」のような文字列になります。

そして、私はリファレンスを見つけることができませんが、私はgetComputedStyle()高価になる可能性があると聞いたので、それはおそらく各window.onscrollイベントで呼び出す必要があるものではありません(しかし、jQueryのものではありませんheight())。


からの高さを取得したらgetComputedStyle、を使用parseInt(h, 10)して計算用の整数を取得します。
RhodanV5500 2016年


1

私があなたの質問を正しく理解していれば、おそらくこのようなものが役立つでしょう:

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

特にCSSで高さを設定しましたか?使用していない場合は、使用するのoffsetHeight;ではなくheight

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

8
offsetHeightは、要素自体のプロパティであり、スタイルではありません。
Shog9 2009
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.