CSS幅、高さ、オーバーフロー

幅と高さ

寸法プロパティ早見表

プロパティ よく使う値 用途
width 300px50%50vwauto 要素のコンテンツ幅
height 200px50%50vhauto 要素のコンテンツ高さ
min-width 320px50% 最小幅(小さすぎるのを防止)
max-width 1200px80% 最大幅(レスポンシブでよく使う)
min-height 200px100vh 最小高さ
max-height 400px 最大高さ(超えるとオーバーフロー)
overflow visiblehiddenscrollauto オーバーフローしたコンテンツの処理方法
overflow-x visiblehiddenscrollauto 水平方向のオーバーフロー制御
overflow-y visiblehiddenscrollauto 垂直方向のオーバーフロー制御

widthとheight

widthheightは要素のコンテンツエリアの寸法を設定します:

サンプル

HTML
<style>
.box {
  width: 300px;
  height: 200px;
  background: #f0f0f0;
}
</style>
<div class="box">寸法範囲を示すボックス要素</div>
▶ 試してみよう

よく使う単位

サンプル

HTML
<style>
.pixel {
  width: 300px;
  background: #e3f2fd;
}
.percent {
  width: 50%;
  background: #fce4ec;
}
.vw-vh {
  width: 50vw;
  height: 100vh;
  background: #e8f5e9;
}
.auto-width {
  width: auto;
  background: #fff3e0;
}
</style>
<div class="pixel">ピクセル単位:固定幅300px</div>
<div class="percent">パーセント単位:幅50%</div>
<div class="vw-vh">ビューポート単位:幅50vw</div>
<div class="auto-width">自動幅:コンテンツで決定</div>
▶ 試してみよう

min-width / max-width

要素の最小/最大幅を制限し、レスポンシブデザインでよく使用します:

サンプル

HTML
<style>
.container {
  width: 80%;
  max-width: 1200px;
  min-width: 320px;
  margin: 0 auto;
  background: #e8eaf6;
  padding: 10px;
}
</style>
<div class="container">レスポンシブ幅の制約を持つコンテナ</div>
▶ 試してみよう

min-height / max-height

サンプル

HTML
<style>
.card {
  min-height: 200px;
  max-height: 400px;
  background: #fff3e0;
  border: 1px solid #ccc;
}
</style>
<div class="card">最小/最大高さを持つカードコンポーネント。最大高さを超えるコンテンツはオーバーフローし、overflowプロパティで処理する必要があります。</div>
▶ 試してみよう

calc()関数

calc()は、プロパティ値で数学的計算(加算、減算、乗算、除算)を可能にするCSS関数です。最大の利点は異なる単位を混在できることです。

📌 calc()ルール: +-は両側にスペースが必要(calc(100% - 20px) ✅、calc(100%-20px) ❌)、*/のスペースは任意です。

サンプル

HTML
<style>
.layout {
  width: calc(100% - 300px);
  background: #e3f2fd;
  padding: 16px;
}

.sidebar {
  width: 300px;
  float: left;
  background: #fce4ec;
  padding: 16px;
  box-sizing: border-box;
}
</style>
<div class="layout">メインコンテンツ:幅 = 100% - 300px</div>
▶ 試してみよう

よく使うケース

  1. サイドバー + メインコンテンツ: .main { width: calc(100% - 300px); } 残りのスペースに適応
  2. 等間隔カード: .card { width: calc((100% - 40px) / 3); } 3カラムで20pxのギャップ
  3. レスポンシブフォント: font-size: calc(14px + 0.5vw); ベースサイズ + ビューポート増分
  4. 精密な中央揃え: left: calc(50% - 100px); transformの代替となる既知のオフセット

calc()の互換性

calc()はIE11+、Chrome 26+、Firefox 16+、Safari 7+でサポートされており、モダンプロジェクトで安全に使用できます。calc()で文字列の連結を避けるだけです。

オーバーフロー制御

💡 overflow-xとoverflow-y: 水平方向と垂直方向のオーバーフローに異なる値を設定すると、一方がautoに強制される場合があります。ベストプラクティスはoverflowの省略形を使用することです。

要素のコンテンツが設定された幅/高さを超えると、「オーバーフロー」が発生します。overflowプロパティは、オーバーフローしたコンテンツの処理方法を制御します。

overflowの値

サンプル

HTML
<style>
.visible {
  overflow: visible;
  background: #fce4ec;
  height: 50px;
}
.hidden {
  overflow: hidden;
  background: #e8f5e9;
  height: 50px;
}
.scroll {
  overflow: scroll;
  background: #fff3e0;
  height: 50px;
}
.auto {
  overflow: auto;
  background: #e3f2fd;
  height: 50px;
}
</style>
<div class="visible">表示エリア(オーバーフローはボックスの外側に表示)</div>
<div class="hidden">超過時にコンテンツがクリップされる(オーバーフロー非表示)</div>
<div class="scroll">コンテンツが収まってもスクロールバーが常に表示</div>
<div class="auto">コンテンツがオーバーフローした場合のみスクロールバーが表示</div>
▶ 試してみよう

各方向の制御

サンプル

HTML
<style>
.box {
  overflow-x: hidden;
  overflow-y: auto;
  width: 200px;
  height: 80px;
  background: #f5f5f5;
  border: 1px solid #ddd;
}
</style>
<div class="box">水平方向のオーバーフローは非表示、垂直方向は自動スクロールで全コンテンツを表示するボックス要素</div>
▶ 試してみよう

よく使うケース

1. テキストの省略

text-overflowと組み合わせて単一行テキストの切り捨て:

サンプル

HTML
<style>
.ellipsis {
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  width: 200px;
  border: 1px solid #ccc;
  padding: 8px;
  background: #f9f9f9;
}
</style>
<div class="ellipsis">これは長いテキストで、コンテナの幅を超えると省略記号で切り捨てられます</div>
▶ 試してみよう

2. 画像のクロップ

固定サイズのコンテナでオーバーフローを非表示にして画像を処理:

サンプル

HTML
<style>
.avatar {
  width: 100px;
  height: 100px;
  overflow: hidden;
  border-radius: 50%;
  background: #e0e0e0;
}
.avatar img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}
</style>
<div class="avatar">アバターコンテナ(円形クロップ)</div>
▶ 試してみよう

3. スクロールコンテナ

固定高さのスクロール可能エリアを作成:

サンプル

HTML
<style>
.scroll-box {
  height: 300px;
  overflow-y: auto;
  border: 1px solid #ddd;
  padding: 10px;
  background: #fafafa;
}
</style>
<div class="scroll-box">
  <p>行1:スクロールコンテナは大きなコンテンツを表示できます</p>
  <p>行2:コンテンツが高さを超えるとスクロールバーが表示されます</p>
  <p>行3:スクロールして非表示のコンテンツを表示</p>
  <p>行4:overflow-y: autoで実装</p>
  <p>行5:コンテンツが多いほどスクロールも多くなります</p>
  <p>行6:コメントセクション、お知らせなどに適しています</p>
</div>
▶ 試してみよう

4. フロートのクリア

親にoverflow: hiddenまたはoverflow: autoを設定すると、子のフロート効果をクリア:

サンプル

HTML
<style>
.clearfix {
  overflow: hidden;
  background: #e8eaf6;
  padding: 10px;
}
</style>
<div class="clearfix">フロートクリアコンテナ(overflow: hiddenがBFCをトリガー)</div>
▶ 試してみよう

object-fit(画像/動画の適応)

object-fitは、<img><video>の置換要素がコンテナサイズに適応する方法を制御します:

サンプル

HTML
<style>
.image-container {
  width: 300px;
  height: 200px;
  background: #f5f5f5;
  border: 2px dashed #aaa;
  display: flex;
  align-items: center;
  justify-content: center;
  margin-bottom: 10px;
}
.image-container img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}
</style>
<div class="image-container">画像コンテナ(実際の画像に置き換え)</div>
▶ 試してみよう

CSSの寸法関数

calc()

calc()は、CSSで動的な寸法計算を可能にし、異なる単位を混在できます:

サンプル

HTML
<style>
.calc-demo {
  width: calc(100% - 40px);
  height: calc(50vh - 60px);
  background: #e3f2fd;
  border: 1px solid #90caf9;
  display: flex;
  align-items: center;
  justify-content: center;
}
</style>
<div class="calc-demo">幅は自動的に40pxを引き算、高さはビューポートの半分から60pxを引いた値</div>
▶ 試してみよう

注意: 演算子の両側にはスペースが必要です。さもないと認識されません。


❓ よくある質問

Q height: 100%が効かないのはなぜですか?
A パーセントの高さは親の高さに相対的です。親の高さがauto(コンテンツで決定)の場合、子のheight: 100%は計算できません——親がまだ自身の高さを決定していないからです。パーセントの高さを機能させるには、親に明示的な高さの値が必要です。
Q max-width: 100%とwidth: 100%の違いは何ですか?
A width: 100%は要素を強制的に親の幅と等しくします。max-width: 100%は「親の幅を超えない」ことを意味します——要素が自然に小さければ、小さいままです。レスポンシブ画像にmax-width: 100%を使用するのがベストプラクティスです。
Q overflow: hiddenはオーバーフローしたコンテンツをすべて非表示にしますか?
A はい。overflow: hiddenは要素の寸法を超えるすべてのコンテンツをクリップします。オーバーフローしたコンテンツをスクロールする必要がある場合は、overflow: auto(必要時にスクロールバーが表示)またはoverflow: scroll(スクロールバーを常に表示)を使用してください。overflow: hiddenはフロートの問題を解決するためにBFC(ブロック整形コンテキスト)をトリガーするためにもよく使用されます。

📖 まとめ

📝 演習

  1. 「レスポンシブコンテナ」を作成してください——幅80%、最大幅1200px、最小幅320px、水平方向に中央揃え。
  2. 固定サイズの画像コンテナ(300×200)を作成し、大きな画像をobject-fit: coverで歪みなく埋めてください。
  3. 「単一行テキストの省略」と「複数行テキストのオーバーフロー」エフェクトを実装してください(ヒント:複数行は-webkit-line-clampを使用)。
  4. calc()を使用して「フル画面からナビゲーションバーの高さを引いた」レイアウトを実装してください。
100%