【html&css】width(横幅)とheight(高さ)の指定とボックスモデル

html-and-css-width-height

本記事では、CSSにおけるwidth(横幅)とheight(高さ)の指定方法について解説します。

Webデザインの初心者でも分かりやすく丁寧に説明していきます。

目次

HTMLの前提知識

width(横幅)とheight(高さ)を理解するために、以下の用語も把握しておきましょう。

widthとheightを理解するために
  • HTML要素
  • 親要素と子要素

HTML要素

<タグ名>タグの中身</タグ名>

要素は、<タグ名>〜</タグ名>のかたまり全体を表します。

例えば、<p>これは例文です。</p>は1つのHTML要素です。

親要素と子要素

<div>
  <p>これは例文です。</p>
</div>

<div>要素の中に<p>要素が入っている場合、「<div>要素の子要素は<p>要素」になります。

逆に、「<p>要素の親要素は<div>要素」と言い換えることもできます。

CSSにおけるwidth(横幅)とheight(高さ)

width = 「要素の横幅」
height = 「要素の高さ」

上記を把握した上で、以下の内容を解説していきます。

widthとheightについて
  • widthとheightの書き方
  • ボックスモデル
  • px, %, autoの違いと使い分け

widthとheightの書き方

ブラウザ上に、横幅200px、高さ100pxの「青い四角い箱」を作るための最もシンプルなコードです。

HTMLコード表示
<div class="simple-box"></div>
CSSコード表示
.simple-box {
  width: 200px;  /* 横幅を200pxにする */
  height: 100px; /* 高さを100pxにする */
  background-color: #2589d0; /* 分かりやすいように青色を塗る */
}
  • セレクタ:.simple-box { ... }
    「HTMLのsimple-boxといったクラス名がついた要素に対して命令を出す」という合図です。
  • プロパティ:widthheight
    「横幅」や「高さ」といった、変更したい項目を指定します。
  • 値:200px100px
    「200pxにする」といった具体的な数値を指定します。
    最後に必ず;(セミコロン)をつけるのがルールです。

次に、ボックスモデルの理解を深めていきましょう。

ボックスモデル

ボックスモデルを構成する「4つの層」を理解しましょう。

ボックスモデルの4つの層
  1. Content(コンテンツ)
    役割: テキストや画像そのものが入る一番内側の領域
    width/heightが適用される範囲
  2. Padding(パディング)
    役割: コンテンツと枠線の間の「内側の余白」
  3. Border(ボーダー)
    役割: パディングの外側を囲む「枠線」
  4. Margin(マージン)
    役割: 枠線の外側にある「隣の要素との距離(外側の余白)」

上記だけではイメージが掴みにくいと思うので、実際にボックスモデルを表現してみます。

また、様々なプロパティを記載していますが、まずは直感的にボックスモデルによってサイズ感が変わるんだといった印象を持てれば他は理解しなくてよいです。

content-box
(260pxになる)
border-box
(200pxのまま)
HTMLコード表示
<div class="container">
  <div class="box content-box">
    <div class="inner">content-box<br>(260pxになる)</div>
  </div>

  <div class="box border-box">
    <div class="inner">border-box<br>(200pxのまま)</div>
  </div>
</div>
CSSコード表示
.container {
  display: flex;
  justify-content: center;
  gap: 50px;
  padding: 20px;
  background-color: #f0f0f0;
}

/* 共通の基本設定 */
.box {
  width: 200px;        /* 横幅 200px */
  height: 100px;       /* 高さ 100px */
  padding: 20px;       /* 内側の余白(緑色の部分) */
  border: 10px solid #777; /* 枠線(黒色の部分) */
  margin: 20px;        /* 外側の余白 */
  background-color: #2589d0; /* Padding部分の色 */
}

/* 中身のテキストエリア(Content部分) */
.inner {
  background-color: #fff;
  height: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
  text-align: center;
  font-size: 14px;
  font-weight: bold;
}

/* 【重要】ここが違いの決め手! */
.content-box {
  box-sizing: content-box; /* デフォルトの設定 */
}

.border-box {
  box-sizing: border-box; /* 枠線も含めて200pxにする設定 */
}

左の箱をA、右の箱をBとした際に、以下の計算式を確認すると分かりやすいです。

content-boxの場合(左の箱)

widthで指定した数値200pxは、「中身(Content)」のみの幅になります。

外側にpaddingborderが追加されるため、全体は大きくなります。

実際の幅 = 200px(width)+ 40px(左右のpadding)+ 20px(左右のborder)= 260px

border-boxの場合(右の箱)

widthで指定した数値200pxの中に、paddingborderを含めて計算してくれます。

中身の面積を自動で狭めて調整してくれるので、全体の幅は変わりません。

実際の幅 = 200px(widthの中にすべて含まれる)

上記では、box-sizingプロパティを利用していますが、基本的にbox-sizingで指定がなければデフォルト設定としてcontent-box(左の箱)と同じになります。

すべてを含めてwidthを○○pxに収めたいといった要望を叶えるのがborder-box(右の箱)になります。

また、min-width(最小幅)とmax-width(最大幅)を詳細に知りたい人は「【html&css】min-widthとmax-widthの使い方【レスポンシブ対応】」を一読ください。

px, %, autoの違いと使い分け

ここでは、px, %, autoの違いと使い分けを解説します。

以下の比較表を確認すると、px, %, autoの違いが分かります。

単位読み方特徴用途
pxピクセル【絶対値】
指定したサイズのまま絶対に変わらない
ヘッダーロゴ
ボタンのサイズ
アイコンサイズ
%パーセント【相対値】
親要素のサイズを基準に、割合で伸縮する
スマホ対応のレイアウト
画面いっぱいに広げる
2段組みレイアウト
autoオート【自動計算】
ブラウザに合わせて計算し、widthheightで挙動が異なる
widthは親の幅に合わせ広がり、はみ出さないよう計算される。
heightはテキストや画像の量に合わせ箱が伸びる。

上記の内容を分かりやすいように表現したコードを以下に記載しています。

まずは直感的に理解できるよう実際にHTMLとCSSで表示させています。

右下のドラッグできる箇所をクリックしたまま、左へ動かしてみましょう。

▼ 右下をドラッグして箱の幅を伸び縮みさせてみよう!

width: 300px;
親の幅が変わっても、ずっと300pxのままです。
width: 50%;
常に、親の幅の「ちょうど半分」のサイズになります。
width: auto;
親の幅に合わせて、余白(marginなど)を計算してピッタリ収まります。
HTMLコード表示
<div class="resize-container">
  <p class="note">▼ 右下をドラッグして箱の幅を伸び縮みさせてみよう!</p>

  <div class="box box-px">
    <strong>width: 300px;</strong><br>
    親の幅が変わっても、ずっと300pxのままです。
  </div>

  <div class="box box-percent">
    <strong>width: 50%;</strong><br>
    常に、親の幅の「ちょうど半分」のサイズになります。
  </div>

  <div class="box box-auto">
    <strong>width: auto;</strong><br>
    親の幅に合わせて、余白(marginなど)を計算してピッタリ収まります。
  </div>
</div>
CSSコード表示
.resize-container {
  width: 100%;
  max-width: 800px;
  border: 3px dashed #888;
  padding: 20px;
  background-color: #f9f9f9;
  resize: horizontal;
  overflow: hidden; 
}

.note {
  font-size: 14px;
  color: #d32f2f;
  font-weight: bold;
  margin-top: 0;
}

/* 3つの箱の共通設定 */
.box {
  margin-bottom: 20px;
  padding: 15px;
  color: #fff;
  border-radius: 5px;
}

/* ① pxの箱(固定) */
.box-px {
  width: 300px;
  background-color: #2196F3;
  box-sizing: border-box;
}

/* ② %の箱(相対) */
.box-percent {
  width: 50%;
  background-color: #4CAF50;
  box-sizing: border-box;
}

/* ③ autoの箱(自動) */
.box-auto {
  width: auto;
  margin-right: 60px;
  background-color: #FF9800;
  box-sizing: border-box;
}

ただし、上記のように使い分けしている中で注意すべき点があることを押さえておきましょう。

pxの落とし穴

Webサイトをスマホで確認した際、画面が横にグラグラと揺れてしまったり、右側に謎の余白ができていた経験はありませんか?

原因の多くは、横幅を「大きすぎるpx(ピクセル)」で固定していることにあります。

実際にどうなってしまうのか、以下のサンプルコードで確認してみましょう。

親の箱(スマホ画面:横幅320px)

【失敗】width: 400px;
画面サイズを無視して400pxの幅を確保しようとするため、右に突き抜けてしまいます!
HTMLコード表示
<div class="smartphone-screen">
  <p class="title">親の箱(スマホ画面:横幅320px)</p>

  <div class="box-px">
    <strong>【失敗】width: 400px;</strong><br>
    画面サイズを無視して400pxの幅を確保しようとするため、右に突き抜けてしまいます!
  </div>
</div>
CSSコード表示
/* スマホ画面に見立てた親要素(横幅320px) */
.smartphone-screen {
  width: 320px;
  background-color: #e0e0e0;
  border: 4px solid #777;
  padding-bottom: 20px;
  margin: 0 auto;
}

.title {
  text-align: center;
  font-weight: bold;
}

/* 失敗する箱(横幅400px) */
.box-px {
  width: 400px; /* 親の320pxより大きい! */
  background-color: #E53935;
  color: white;
  padding: 10px;
}

pxは「絶対にそのサイズを維持する」といった特徴を持つ単位です。

親の箱(スマホ画面)が320pxしかないのに、中の箱にwidth: 400px;と指定すると、中の箱は「画面が狭くても、絶対に400pxの幅を確保する!」と主張します。

その結果、親の箱を突き破って右側に飛び出します。

これがスマホで横スクロール(画面のグラつき)が発生する一番の原因です。

レイアウトで大きな枠(親要素)を作る際、横幅をpxで固定するのは避けましょう。

「width: 100%」と「width: auto」の違い

「じゃあ、親の箱にピッタリ合わせるためにwidth: 100%;にしよう!」といった考えに至ります。

実は、初心者が一番やるミスが「不要なwidth: 100%;を書いてしまうこと」です。

特に、余白marginと組み合わせた際に悲劇が起きます。

親の箱(スマホ画面:横幅320px)

【失敗】width: 100%; + margin
100%(320px)を確保した上で、さらに余白が足されるのではみ出します。
【大正解】width: auto; + margin
余白を引いた残りのスペースに、ピタッと自動で収まってくれます。
HTMLコード表示
<div class="smartphone-screen">
  <p class="title">親の箱(スマホ画面:横幅320px)</p>

  <div class="box-100">
    <strong>【失敗】width: 100%; + margin</strong><br>
    100%(320px)を確保した上で、さらに余白が足されるのではみ出します。
  </div>

  <div class="box-auto">
    <strong>【大正解】width: auto; + margin</strong><br>
    余白を引いた残りのスペースに、ピタッと自動で収まってくれます。
  </div>
</div>
CSSコード表示
/* スマホ画面に見立てた親要素(横幅320px) */
.smartphone-screen {
  width: 320px;
  background-color: #e0e0e0;
  border: 4px solid #777;
  padding-bottom: 20px;
  margin: 0 auto;
}

/* 失敗:100%の箱 */
.box-100 {
  width: 100%;       /* 親と同じ320pxになる */
  margin-left: 20px; /* さらに左に20pxの余白を追加 */
  background-color: #E53935;
  color: white;
  padding: 10px;
  margin-bottom: 20px;
  box-sizing: border-box;
}

/* 成功:autoの箱 */
.box-auto {
  width: auto;       /* 自動計算モード */
  margin-left: 20px; /* 左に20pxの余白を追加 */
  background-color: #4CAF50;
  color: white;
  padding: 10px;
  box-sizing: border-box;
}

<div><p>などのブロック要素は、初期値がwidth: auto;になっています。

100%autoの計算方法の違いがポイントです。

  • width: 100%;の場合(上の赤い箱)
    自分の幅を親と全く同じ「320px」に固定します。
    そこにmargin-left: 20px;を指定すると、「左の隙間20px + 自分の幅320px = 合計340px」になり、親要素を20px分突き抜けます。
  • width: auto;の場合(下の緑の箱)
    ブラウザが「親要素は320px、左に20pxの隙間が必要。だから自分の幅は残りの300pxに縮めておこう。」と自動で引き算をします。
    そのため、絶対に親要素の箱から飛び出しません。

ブロック要素は、何もしなくても勝手に横幅いっぱい(auto)に広がります

余白(margin)を持たせたい時ほどwidth: 100%は書かずにそのままにしておきましょう。

height(高さ)の基本

シンプルな「高さ」の指定方法です。

書き方はwidthの時と全く同じです。

高さ150pxの箱です。
HTMLコード表示
<div class="basic-height">
  高さ150pxの箱です。
</div>
CSSコード表示
.basic-height {
  height: 150px; /* 高さを150pxに指定 */
  background-color: #2589d0;
  color: white;
  padding: 20px;
}

heightプロパティにpxなどの数値を指定すると、要素の高さを固定できます。

ボタンの高さを揃えたい時や装飾用の四角形を作りたい時などに使います。

高さを「固定」すると中身がはみ出す

実はWeb制作において、「文章が入る箱の高さ(height)を、pxで固定するのはNG」とされています。

その理由を以下のサンプルコードで見てみましょう。

【失敗例】height: 100px;
文章が少ない時は問題ありませんが、このように文章量が増えてしまうと、箱の高さ(100px)を無視して文字だけが下に突き抜けてしまいます!これがオーバーフローと呼ばれるレイアウト崩れの原因です。
HTMLコード表示
<div class="fixed-height-trap">
  <strong>【失敗例】height: 100px;</strong><br>
  文章が少ない時は問題ありませんが、このように文章量が増えてしまうと、箱の高さ(100px)を無視して文字だけが下に突き抜けてしまいます!これがオーバーフローと呼ばれるレイアウト崩れの原因です。
</div>
CSSコード表示
.fixed-height-trap {
  height: 100px; /* 高さを「絶対に100px」に固定! */
  background-color: #E53935;
  color: white;
  padding: 10px;
  width: 300px;
}

表示されている内容では分かりづらいですが、HTMLコードを確認すると文章は続いていることが分かります。

height: 100px;のように高さを固定した場合、箱のサイズは絶対に変わりません。

しかし、中にあるテキスト量が多いと、箱に収まりきらずに下へ飛び出します。

これを「オーバーフロー」と呼びます。

スマホの普及により、画面幅によって文章の改行位置が変わる現代では、高さを固定するのは危険な書き方です。

高さは「auto」か「min-height」

どうすれば文字のはみ出しを防げるのでしょうか?

「高さは中身(テキスト量)に合わせて自動で伸びるようにする」とよいです。

【正解1】height: auto;(初期値)
文章量に合わせて、箱の高さが勝手に伸びてくれます!
はみ出す心配はゼロです。
【正解2】min-height: 150px;
普段は150pxの高さを保ちますが、文章がそれ以上に増えた場合は、中身に合わせて柔軟に箱が伸びてくれます!これで安心です!
HTMLコード表示
<div class="height-container">
  <div class="box-auto">
    <strong>【正解1】height: auto;(初期値)</strong><br>
    文章量に合わせて、箱の高さが勝手に伸びてくれます!<br>
    はみ出す心配はゼロです。
  </div>

  <div class="box-min-height">
    <strong>【正解2】min-height: 150px;</strong><br>
    普段は150pxの高さを保ちますが、文章がそれ以上に増えた場合は、中身に合わせて柔軟に箱が伸びてくれます!これで安心です!
  </div>
</div>
CSSコード表示
/* パターンA:auto(指定しないのと同じ) */
.box-auto {
  height: auto; /* ブラウザが自動計算(デフォルト) */
  background-color: #4CAF50;
  color: white;
  padding: 10px;
  margin-bottom: 20px;
}

/* パターンB:min-height(最小の高さ) */
.box-min-height {
  min-height: 150px; /* 最低でも150pxは確保する。それ以上は伸びる。 */
  background-color: #FF9800;
  color: white;
  padding: 10px;
}
  • height: auto;(初期値)
    何も指定しなければ、箱は中身の量に合わせて必要な分だけ高くなります。
  • min-height(最小の高さ)
    「文字が少ない時でも、ある程度の高さはキープしたい。でも文字が増えたらはみ出さず伸びてほしい」といった柔軟なプロパティです。

Web制作では「高さは中身(テキスト量など)に任せる」のが一般的です。

まとめ

分かりやすいようにまとめを記載します。

本記事のまとめ
  • widthとheightを理解するためにHTML要素・親要素と子要素を把握する
  • width = 「要素の横幅」
  • height = 「要素の高さ」
  • ボックスモデルの4つの層:Content(コンテンツ)
  • ボックスモデルの4つの層:Padding(パディング)
  • ボックスモデルの4つの層:Border(ボーダー)
  • ボックスモデルの4つの層:Margin(マージン)
  • px = 「絶対値」
  • % = 「相対値」
  • auto = 「自動計算」
  • ブロック要素は何もしなくても勝手に横幅いっぱい(auto)に広がる
  • 高さは「auto」か「min-height」

この記事を書いた人

sugiのアバター sugi Site operator

【経歴】玉川大学工学部卒業→新卒SIer企業入社→2年半後に独立→プログラミングスクール運営/受託案件→フリーランスエンジニア&SEOコンサル→Python特化のコンテンツサイトJob Code&UIコピペサイトCode Stock運営中

目次