【html&css】min-widthとmax-widthの使い方【レスポンシブ対応】

css-min-max-width

レスポンシブデザイン(様々なデバイスの画面サイズに柔軟な対応を実施するWebデザインのこと)を実現するには、min-widthとmax-widthが重要になります。

本記事では、min-width(最小幅)とmax-width(最大幅)の使い方を解説します。

目次

min-width(最小幅)とは

min-widthは、HTML要素の「最小幅(絶対に縮まらない限界サイズ)」を指定するCSSプロパティです。

min-widthを設定しておくと、「画面が狭くしてもこのサイズより小さくならない」といったストッパーの役割を果たします。

min-widthについて
  • min-widthの基本的な書き方
  • min-widthの使い方
  • min-widthの注意点
  • @media screen and (min-width: ○○px) { ~ }

min-widthの基本的な書き方

セレクタ { min-width: 値&単位; }

min-widthプロパティは値と単位を指定します。

以下は、min-widthプロパティでよく利用される単位になります。

単位説明
px(ピクセル)min-width: 300px;300px以下に縮まない。
最もよく使われる。
%(パーセント)min-width: 50%;親要素の幅の50%以下に縮まない。
vw(ビューポート幅)min-width: 50vw;画面幅の50%以下に縮まない。

min-widthの使い方

CSSの挙動は、理解するために体感するのが一番なので以下の表示から直感的に体験してみましょう。

▼ この点線枠の【右下】をドラッグして、幅を狭くしてみてください ▼

この箱は通常「点線枠の100%」の幅ですが、
「min-width: 300px;」があるため、
300pxのラインで縮むのをピタッとやめます!
HTMLコード表示
<div class="resizable-wrapper">
  <p class="instruction">▼ この点線枠の【右下】をドラッグして、幅を狭くしてみてください ▼</p>
    
  <div class="box">
    この箱は通常「点線枠の100%」の幅ですが、<br>
    <strong>「min-width: 300px;」</strong>があるため、<br>
    300pxのラインで縮むのをピタッとやめます!
  </div>
</div>
CSSコード表示
.resizable-wrapper {
  resize: horizontal; /* 横方向にだけリサイズ可能にする */
  overflow: auto;     /* resizeを有効にするために必須 */

  /* 見た目の設定 */
  width: 100%;
  border: 2px dashed #999;
  padding: 20px;
  background-color: #f9f9f9;
  box-sizing: border-box;
}

.instruction {
  font-size: 14px;
  color: #333;
  font-weight: bold;
  text-align: center;
  margin-bottom: 15px;
}

.box {
  /* 基本の幅:親(点線枠)の100%に合わせて伸び縮みする */
  width: 100%;
  
  /* ★最大のポイント:どれだけ親が狭くなっても300pxは死守する */
  min-width: 300px;
  
  /* 見た目の設定 */
  background-color: #e0f2f1;
  padding: 20px;
  border: 2px solid #009688;
  box-sizing: border-box;
  text-align: center;
}

途中から緑の箱が画面から切れてしまうのが分かるかと思います。

実際のWeb制作の現場は、以下の場面で利用します。

  • スマホ対応(レイアウト崩れの防止)
    PC用カラム(横並び)のレイアウトが画面を狭めた時に潰れるのを防ぎます。
  • ボタンの最小サイズ確保
    「OK」や「送信」などのボタン幅は文字数によって変化します。
    クリックしやすいように「最小幅120pxは確保する」といった指定によく使います。
  • 画像の縮みすぎ防止
    ロゴ画像など、スマホ画面で小さくなり潰れるのを防ぎます。

いわゆるレスポンシブ対応を施す際の重要なCSSプロパティの一つがmin-widthになります。

min-widthの注意点

min-widthプロパティは便利ですが、使う際に気をつけたい点があります。

  • 横スクロールバーが発生する原因になる
    スマホの画面幅よりも大きなmin-width(例:min-width: 500px;)を指定すると、画面に収まらずスマホで見た時に横スクロールバーが発生します。
    Webデザインにおいて意図しない横スクロールはNGのため、スマホの画面幅より大きな値を設定しないよう注意が必要です。
  • widthmax-widthとの強弱関係
    同じ要素にwidth: 200px;min-width: 300px;を指定した場合、min-widthが優先されて実際の幅は300pxになります。
    また、最大幅を決めるmax-widthと競合した場合も、CSSのルール上はmin-widthが最優先で扱われることを覚えておくとバグを防げます。

@media screen and (min-width: ○○px) { ~ }

@media screen and (min-width: ○○px) { ~ }
or
@media (min-width: ○○px) { ~ }

主流は、省略して@media (min-width: ○○px) { ~ }と書くことも多いです。

スマホやPCに対応させる「レスポンシブデザイン」の心臓部とも言える技術になります。

これは「もし画面(ブラウザ)の幅が○○px以上だったら、この中のCSSを発動させる」という条件分岐です。(メディアクエリと呼ばれます。)

@mediaブラウザのウィンドウ画面の幅を監視する仕組み
screen画面(モニターやスマホ)で見てる人に実施する条件
(min-width: 600px)画面幅が最低でも600px(=600px以上)時に適用する

主に「スマホ用デザインをPC用デザインに切り替える時」に使われます。(モバイルファーストと呼びます。)

以下は、min-widthがどんな場面で利用されるかを記載しています。

  • 1カラムから2カラムへ
    スマホは縦1列に並ぶ記事とサイドバーをPC(例:768px以上)になったら横並びにする。
  • メニューの切り替え
    スマホは「三(ハンバーガーメニュー)」で隠し、PC画面になったら横並びのグローバルメニュー表示する。
  • 文字サイズの調整
    スマホは文字を小さめに、PC画面は文字を大きくする。

ここでは、レスポンシブ対応で利用するmin-widthを直感的に理解するサンプルコードを以下に記載しています。

▼ この点線枠の【右下】をドラッグして、幅を「広く」してみてください ▼

現在の状態
箱の幅が狭い時は、スマホ用の「縦並び&赤色」のデザインです。
HTMLコード表示
<div class="resizable-wrapper">
  <p class="instruction">▼ この点線枠の【右下】をドラッグして、幅を「広く」してみてください ▼</p>  
  <div class="card">
    <div class="card-icon"></div>
    <div class="card-text">
      <strong>現在の状態</strong><br>
      箱の幅が狭い時は、スマホ用の「縦並び&赤色」のデザインです。
    </div>
  </div>
</div>
CSSコード表示
.resizable-wrapper {
  resize: horizontal;
  overflow: auto;
  container-type: inline-size; 
  
  width: 280px; /* 最初はスマホサイズの狭い幅 */
  border: 2px dashed #999;
  padding: 20px;
  background-color: #f9f9f9;
  box-sizing: border-box;
}

.card {
  background-color: #ffebee;
  border: 2px solid #f44336;
  padding: 15px;
  border-radius: 8px;
  text-align: center;
  /* 最初は縦に並ぶ */
  display: flex;
  flex-direction: column; 
  align-items: center;
  gap: 10px;
}

.card-icon { font-size: 40px; }

.card-icon::before {
  content: "📱";
  font-size: 40px;
}

.card-text { font-size: 14px; }

/* =======================================
   幅が広がった時の条件分岐(ここがメイン!)
======================================= */
/* 枠の幅が「450px以上」になったら、この中身が発動(上書き)される! */
@container (min-width: 450px) {
  
  .card {
    background-color: #e8f5e9;
    border-color: #4caf50;
    /* 縦並びから「横並び」に変化 */
    flex-direction: row; 
    text-align: left;
  }
  
  .card-icon::before {
    content: "💻"; /* 450pxを超えたら、PC用アイコンに上書き */
    font-size: 60px;
  }
  
  .card-text {
    font-size: 16px; /* 文字を少し大きくする */
  }
  /* スマホ用だったテキストをPC用に書き換える(疑似表現) */
  .card-text strong::after { content: "(PCモード発動!)"; color: #4caf50; }
}

メディアクエリを利用するとウィンドウ幅に依存するため、ここでは体験用としてコンテナクエリを利用しています。

「指定サイズを境目にデザインを切り替える」といった境界線を、Web用語でブレイクポイントと呼びます。

max-width(最大幅)とは

max-widthは、HTML要素の「最大幅(絶対に広がらない限界サイズ)」を指定するCSSプロパティです。

max-widthを設定しておくと、「画面が大きくなってもこのサイズでストップする」といった上限におけるストッパーの役割を果たします。

max-widthについて
  • max-widthの基本的な書き方
  • max-widthの使い方
  • max-widthの注意点
  • @media screen and (max-width: ○○px) { ~ }

max-widthの基本的な書き方

セレクタ { max-width: 値&単位; }

max-widthプロパティは値と単位を指定します。

以下は、max-widthプロパティでよく利用される単位になります。

単位説明
px(ピクセル)min-width: 1000px;1000px以上に広がらない。
%(パーセント)min-width: 100%;親要素の幅を絶対に超えない。
※画像によく使われます

max-widthの使い方

こちらもmin-widthと同じく、挙動を理解するために体感するのが一番なので以下の表示から直感的に体験してみましょう。

▼ この点線枠の【右下】をドラッグして、幅を「広く」してみてください ▼

この箱は通常「点線枠の100%」の幅で広がりますが、
「max-width: 400px;」があるため、
400pxに到達すると、それ以上は広がりません!
HTMLコード表示
<div class="resizable-wrapper">
  <p class="instruction">▼ この点線枠の【右下】をドラッグして、幅を「広く」してみてください ▼</p>  
  <div class="box">
    この箱は通常「点線枠の100%」の幅で広がりますが、<br>
    <strong>「max-width: 400px;」</strong>があるため、<br>
    400pxに到達すると、それ以上は広がりません!
  </div>
</div>
CSSコード表示
.resizable-wrapper {
  resize: horizontal;
  overflow: auto;
  
  /* 最初は狭くしておく */
  width: 250px; 
  max-width: none; 
  
  border: 2px dashed #999;
  padding: 20px;
  background-color: #f9f9f9;
  box-sizing: border-box;
}

.instruction {
  font-size: 14px;
  color: #333;
  font-weight: bold;
  text-align: center;
  margin-bottom: 15px;
}

.box {
  /* 基本の幅:親(点線枠)の100%に合わせて広がる */
  width: 100%;
  /* ★最大のポイント:どれだけ親が広くなっても400pxでストップ! */
  max-width: 400px;
  margin: 0 auto; 
  
  /* 見た目の設定 */
  background-color: #fff3e0;
  padding: 20px;
  border: 2px solid #ff9800;
  box-sizing: border-box;
  text-align: center;
}

途中からオレンジの箱が一定の大きさで留まっていることが分かると思います。

実際のWeb制作の現場は、以下の場面で利用します。

  • Webサイト全体のコンテンツ幅の制限
    多くのWebサイトは、巨大モニターで見てもコンテンツが画面端まで広がらず、中央にまとまっています。
    全体を囲う箱にmax-width: 1000px;margin: 0 auto;を設定して作られています。
  • 画像のはみ出し防止
    スマホサイトを作る際、画像にmax-width: 100%;を指定しておくのが鉄則です。
    画面幅より大きなサイズの画像を読み込んだ時、画面から画像がはみ出し横スクロールが発生します。
  • 読みやすい文章幅のキープ
    人間の目は、横に長すぎる文章を読むと疲れます。
    ブログ記事の本文などを囲う箱にmax-width: 800px;など設定し、長くなるのを防ぎます。

こちらもレスポンシブ対応を施す際の重要なCSSプロパティの一つがmax-widthになります。

max-widthの注意点

max-widthプロパティを多用する際、使う場面で気をつけたい点があります。

  • widthと同時指定した時の優先順位
    同じ要素にwidth: 800px;max-width: 500px;が同時指定された場合、ストッパーであるmax-widthが優先され、実際の幅は500pxになります。
  • min-widthと競合した場合
    もし「最大300pxmax-width: 300px)」と「最小500pxmin-width: 500px)」といった矛盾した指定をした場合、CSSのルールではmin-widthが優先されます。
    この場合は500pxの幅になります。
  • インライン要素には効かない
    <a>タグや<span>タグといったインライン要素は、そのままではmax-widthが効きません。
    効かせるにはdisplay: block;display: inline-block;を追加し、ブロック要素にする必要があります。

@media screen and (max-width: ○○px) { ~ }

@media screen and (max-width: ○○px) { ~ }
or
@media (max-width: ○○px) { ~ }

こちらも主流は、省略して@media (max-width: ○○px) { ~ }と書くことが多いです。

こちらもスマホやPCに対応させる「レスポンシブデザイン」で重要な技術になります。

これは「もし画面幅(ブラウザ)が、○○px以下だったら、この中のCSSを発動させる」といった条件分岐です。

@mediaブラウザのウィンドウ画面の幅を監視する仕組み
screen画面(モニターやスマホ)で見てる人に実施する条件
(max-width: 800px)画面幅が最大でも800px(=800px以下)時に適用する

主に「PC用デザインをスマホ用デザインに切り替える時」に使われます。(デスクトップファーストと呼びます。)

min-widthが「スマホ基準で作り、PC向けに広げていく(モバイルファースト)」のに対し、max-widthは「PCの画面を基準に作り、スマホ向けに縮めていく(デスクトップファースト)」といった手法で使います。

以下は、max-widthがどんな場面で利用されるかを記載しています。

  • 横並びから縦並びへの解除
    PCでは横に3つ並べた画像をスマホサイズ(例:max-width: 768px以下)になったら縦1列に並べ直す。
  • 余白の削減
    PC用の大きな余白(paddingmargin)をスマホの画面に合わせて狭くする。
  • 要素の非表示
    PCでは表示してたサイドバーや装飾画像をスマホ画面ではdisplay: none;を使って隠す。

ここでは、レスポンシブ対応で利用するmax-widthを直感的に理解するサンプルコードを以下に記載しています。

▼ この点線枠の【右下】をドラッグして、幅を「狭く」してみてください ▼

現在の状態
箱の幅が広い時は、PC用の「横並び&青色」のデザインです。
HTMLコード表示
<div class="resizable-wrapper">
  <p class="instruction">▼ この点線枠の【右下】をドラッグして、幅を「狭く」してみてください ▼</p>
  <div class="card">
    <div class="card-icon"></div>
    <div class="card-text">
      <strong>現在の状態</strong><br>
      箱の幅が広い時は、PC用の「横並び&青色」のデザインです。
    </div>
  </div>
</div>
CSSコード表示
.resizable-wrapper {
  resize: horizontal;
  overflow: auto;
  container-type: inline-size;
  
  /* 今回は最初からPCサイズ(広く)にしておく */
  width: 600px; 
  border: 2px dashed #999;
  padding: 20px;
  background-color: #f9f9f9;
  box-sizing: border-box;
}

.instruction {
  font-size: 14px;
  color: #333;
  font-weight: bold;
  text-align: center;
  margin-bottom: 15px;
}

.card {
  background-color: #e3f2fd;
  border: 2px solid #2196f3;
  padding: 20px;
  border-radius: 8px;
  
  /* PC向けなので、最初は「横並び」にしておく */
  display: flex;
  flex-direction: row; 
  align-items: center;
  gap: 20px;
}

.card-icon::before {
  content: "💻"; /* PCアイコン */
  font-size: 60px;
}

.card-text { font-size: 16px; }

/* =======================================
   幅が狭くなった時の条件分岐(ここがメイン!)
======================================= */
/* 枠の幅が「499px以下」に縮んだら、この中身が発動(上書き)される! */
@container (max-width: 499px) {
  
  .card {
    background-color: #fff3e0;
    border-color: #ff9800;
    
    /* 横並びから「縦並び」に変化 */
    flex-direction: column; 
    text-align: center;
    padding: 15px;
  }
  
  .card-icon::before {
    content: "📱"; /* スマホアイコンに変化 */
    font-size: 40px;
  }
  
  .card-text {
    font-size: 14px; /* スマホ向けに文字を少し小さくする */
  }
  
  /* テキストの書き換え(疑似表現) */
  .card-text strong::after { content: "(スマホモード発動!)"; color: #ff9800; display: block; }
}

メディアクエリを利用するとウィンドウ幅に依存するため、ここでは体験用としてコンテナクエリを利用しています。

デスクトップファーストでWebデザインを考慮する場合は@media (max-width: ○○px) { ~ }を活用しましょう。

まとめ

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

本記事のまとめ
  • min-widthはHTML要素の「最小幅(絶対に縮まらない限界サイズ)」を指定する
  • min-width:セレクタ { min-width: 値&単位; }
  • min-width:「スマホ用デザインをPC用デザインに切り替える時」=モバイルファースト
  • max-widthはHTML要素の「最大幅(絶対に広がらない限界サイズ)」を指定する
  • max-width:セレクタ { max-width: 値&単位; }
  • max-width:「PC用デザインをスマホ用デザインに切り替える時」=デスクトップファースト

この記事を書いた人

sugiのアバター sugi Site operator

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

目次