【初心者必見】CSSで親要素の高さを取得する方法まとめ|100%・vh・JS併用まで完全解説

【初心者必見】CSSで親要素の高さを取得する方法まとめ|100%・vh・JS併用まで完全解説

2026.02.12

はじめに:親要素の高さを「取得したい」と思ったあなたへ

CSSでレイアウトを組んでいると、ほぼ確実にぶつかるのがこの問題です。

  • 子要素を親要素の高さに合わせたい
  • height: 100% がなぜか効かない
  • スマホだけ高さが崩れる
  • 横スクロールが出てレイアウトが破綻する

私も駆け出しの頃、「100%って書いてるのに100%にならないってどういうこと?」と本気で混乱しました。
でもこれはセンスの問題ではありません。CSSの高さ計算の仕組みを知らないだけです。

この記事では、

  • なぜ height:100% が効かないのか
  • vh / min-height の正しい使い方
  • Flex / Gridで高さを揃える考え方
  • JavaScriptで親要素の高さを取得する方法
  • スマホ崩れ・横スクロール問題の原因

まで、実務で何度も修正してきた視点で解説します。


結論:CSSで親要素の高さは「取得」できない

CSSでは親要素の高さを値として取得することはできません。
height:100% は「親に明示的な高さがある場合のみ」有効です。

この一文を理解できれば、この記事の8割はクリアです。


なぜCSSで親要素の高さが取得できないのか

CSSは「値を読み取る言語」ではありません。
あくまで「ルールを宣言する言語」です。

.child {
  height: 100%;
}

この100%は、

  • 親要素に高さが明示されている
  • その値を基準に割合を計算できる

という条件があって初めて成立します。

親が height: auto; の場合、基準値が存在しません。
つまり「計算できない」状態なのです。


height:100%が効かない典型例

<div class="parent">
  <div class="child"></div>
</div>
.parent {
  height: auto;
}

.child {
  height: 100%;
}

なぜ効かないのか?

  • 親は中身に応じて高さが決まる(auto)
  • 子は親の高さを基準にしたい
  • でも親の高さが確定していない

この「循環依存」が原因です。

ここで無理に absolute を使ったり、transformで逃げたりすると、
後でスマホ崩れや横スクロール問題の原因になります。


解決方法①:親に明示的な高さを与える

.parent {
  height: 300px;
}

.child {
  height: 100%;
}

メリット

  • 確実に動作
  • デバッグしやすい

デメリット

  • レスポンシブに弱い
  • コンテンツ増減で破綻しやすい

LPのヒーロー固定ブロックなど限定用途ならOKです。


解決方法②:vhを使う(画面基準)

.parent {
  height: 100vh;
}

vhとは

  • 1vh = ビューポート高さの1%
  • 100vh = 画面いっぱい

ヒーローセクションでよく使われます。


スマホで100vhがズレる問題

iPhone Safariでは、

  • アドレスバーの表示/非表示で高さが変動
  • 100vhが実画面と一致しない

最近は 100dvh を使うのがベストです。

height: 100dvh;

ここを知らないと、スマホだけレイアウトが崩れます。


解決方法③:min-heightで安全設計

.parent {
  min-height: 100vh;
}

実務ではこちらをよく使います。

  • 最低高さを確保
  • 中身が増えれば自動で伸びる
  • スマホ崩れに強い

固定より「伸びる設計」の方が事故が少ないです。


解決方法④:Flexboxで高さを揃える(実務最強)

高さを取得するのではなく、揃える発想に切り替えます。

.parent {
  display: flex;
}

.child {
  flex: 1;
}

なぜこれで揃うのか?

Flexは余白を分配するレイアウトモデルです。
高さを明示しなくても、コンテナ基準で自動調整されます。

よくある失敗

align-items: stretch;

実はこれデフォルト。
上書きして崩しているケース、かなり多いです。


解決方法⑤:CSS Gridで高さ共有

.parent {
  display: grid;
}

Gridはセル単位でサイズを共有します。

  • 単純な高さ揃え → Flex
  • 複雑なレイアウト → Grid

この使い分けが重要です。


JavaScriptで親要素の高さを取得する方法

CSSでは数値取得不可。
でもJSなら可能です。

const parent = document.querySelector('.parent');
const height = parent.offsetHeight;
console.log(height);

取得できる高さの違い

プロパティ 内容
offsetHeight border + padding込み
clientHeight padding込み
scrollHeight 内部コンテンツ全体

用途によって使い分けます。


CSS変数とJSを組み合わせる実務パターン

const parent = document.querySelector('.parent');

function updateHeight() {
  document.documentElement.style.setProperty(
    '--parent-height',
    parent.offsetHeight + 'px'
  );
}

updateHeight();
window.addEventListener('resize', updateHeight);
.child {
  height: var(--parent-height);
}

これで動的同期が可能です。


DevToolsで高さ問題を調査する手順

高さが崩れたら、必ずやります。

① 親要素を選択

→ Computedタブでheight確認

② autoになっていないか確認

③ overflow指定の有無を確認

④ 100vwを使っていないか確認


横スクロール問題との関係

意外と多い原因:

  • width: 100vw;
  • 負のmargin
  • absolute配置のはみ出し

100vwはスクロールバー幅を含むため、
横スクロールの原因になります。

対策は:

width: 100%;

を使うこと。


よくある勘違いチェックリスト

☑ CSSで高さを取得できると思っている
☑ autoでも100%が効くと思っている
☑ 子要素だけで解決しようとする
☑ absoluteで無理やり合わせる
☑ スマホ検証を後回しにする

当てはまったら設計を見直しましょう。


目的別の最適解まとめ

親と同じ高さにしたい

→ Flex / Grid

画面いっぱいにしたい

→ 100dvh

最低高さを確保したい

→ min-height

数値として使いたい

→ JavaScript


まとめ:高さは「取得」ではなく「設計」で解決する

CSSでは親要素の高さを直接取得することはできません。

しかし、

  • 高さ計算の仕組みを理解する
  • レイアウトモデルを正しく使う
  • 必要ならJavaScriptを併用する

これだけで、ほとんどの高さ問題は解決します。

height:100%が効く条件を理解できれば、
CSSレイアウトは一段レベルが上がります。

そして次に悩むのは「幅」です。
それはまた別の記事で解説します。

タグ:

#CSS #HTML #レイアウト #レスポンシブ #初心者向け