記事内にはプロモーションが含まれています

【CSS】子要素を親要素の幅に合わせる方法まとめ!Flexboxやfixedの注意点も解説

【CSS】子要素を親要素の幅に合わせる方法まとめ!Flexboxやfixedの注意点も解説 CSS

Webサイトのコーディングをしていると、「子要素の幅を親要素にピッタリ合わせたい」という場面は頻繁に訪れます。

基本的には width: 100%; を指定すれば解決しそうですが、パディング(内側の余白)を設定したらはみ出してしまったり、Flexbox(フレックスボックス)を使ったら思った挙動にならなかったりと、意外な落とし穴にはまることも少なくありません。

この記事では、CSSで「親要素の幅に合わせる」ための基本的なテクニックから、Flexboxや position: fixed を使った応用パターンまで、実務で推奨される正確な方法を徹底解説します。

【本記事の信頼性】
プロフィール
執筆者:マヒロ
  • 執筆者は元エンジニア
  • SES⇒大手の社内SE⇒独立
  • 現在はこじんまりとしたプログラミングスクールを運営
  • モットーは「利他の精神」

基本中の基本!width: 100% と auto の違い

子要素の幅を親要素に合わせる際、最初に理解しておくべきなのが width: 100%; と width: auto; の挙動の違いです。

実は、多くのケースで width: 100%; を指定しない方がうまくいくことがあります。

ブロック要素ならデフォルト(auto)で親幅に合う

div や p などの「ブロックレベル要素」は、横幅を指定しなければ(width: auto; の状態)、自動的に親要素の幅いっぱいに広がるという性質を持っています。

<!-- 親要素 -->
<div class="parent">
    <!-- 子要素(width指定なし) -->
    <div class="child-auto">幅指定なし(auto)</div>
</div>

<style>
.parent {
    width: 300px;
    background-color: #eee;
    padding: 20px; /* 親にパディング */
}
.child-auto {
    background-color: skyblue;
    /* widthは指定しない(auto) */
    margin: 10px; /* マージンを入れてもはみ出さない */
}
</style>
  • width: auto;(デフォルト): 親要素のコンテンツ幅から、子要素自身の margin や borderpadding を差し引いたサイズに自動調整されます。
  • 結果として、マージンを設定しても親要素からはみ出すことなく、綺麗に収まります。

width: 100% を指定すると「はみ出す」原因になる

一方、width: 100%; を指定すると、「親要素のコンテンツ幅と同じサイズ」に強制的に固定されます。

この状態で子要素に padding や border を追加すると、その分だけサイズが膨らみ、親要素からはみ出してしまいます。

<style>
.child-100 {
    width: 100%;
    padding: 20px; /* これが原因ではみ出す */
    background-color: pink;
}
</style>

必須知識!box-sizing: border-box で解決

それでも width: 100%; を使いたい(または使う必要がある)場合は、必ずCSSで box-sizing: border-box; を指定しましょう。

これを指定すると、「paddingとborderを含めたサイズ」で幅を計算してくれるため、100%を指定してもはみ出さなくなります。

<style>
.child-safe {
    width: 100%;
    padding: 20px;
    box-sizing: border-box; /* これが重要! */
}
</style>
💡 実務でのテクニック:全要素に適用する
近年のWeb制作では、いちいち指定する手間を省くため、CSSの冒頭で以下のように全要素へ適用するのが一般的です。
*, *::before, *::after { box-sizing: border-box; }

Flexboxで子要素を親要素の幅一杯に広げる方法

最近のレイアウト手法の主流である Flexbox(フレックスボックス) を使っている場合、子要素の幅の決まり方が通常とは異なります。

「横並びにしたけど、片方の要素を残りの幅いっぱいに広げたい」といったケースでの対処法を見てみましょう。

flex: 1 で残りのスペースを埋める

Flexコンテナ(親要素)の中にある子要素(Flexアイテム)を、空いているスペースいっぱいに広げるには、flex: 1; を指定します。

<div class="flex-parent">
    <div class="sidebar">サイドバー</div>
    <div class="main-content">メインコンテンツ</div>
</div>

<style>
.flex-parent {
    display: flex; /* Flexboxを有効化 */
}
.sidebar {
    width: 200px; /* 固定幅 */
    background-color: #ccc;
}
.main-content {
    flex: 1; /* 残りの幅をすべて占有する */
    background-color: #fce4ec;
}
</style>
  • flex: 1;:これは flex-grow: 1; flex-shrink: 1; flex-basis: 0%; のショートハンド(省略形)です。
  • 特に flex-basis: 0%; が重要で、これを含めることで要素の中身の量に関わらず、純粋に残りのスペースを均等(または指定比率)に分配して埋めることができます。

縦並び(column)の時に幅を合わせる

Flexboxで縦並び(flex-direction: column;)にしている場合、通常はデフォルトの設定(align-items: stretch;)により、子要素は親の幅いっぱいに広がります。

しかし、「子要素に個別の width を指定している」場合や、「親要素で align-items: center; などを指定している」場合は、子要素が縮んでしまうことがあります。

これを強制的に広げるには、子要素側で align-self: stretch; を指定するか、不要な width 指定を解除します。

<style>
.flex-column-parent {
    display: flex;
    flex-direction: column;
    align-items: center; /* これがあると子要素は中央に寄り、幅いっぱいにならない */
}

.child-stretch {
    align-self: stretch; /* 親の設定を無視して、この要素だけ幅いっぱいに広げる */
}
</style>

position: absolute / fixed で幅を合わせるテクニック

position: absolute;(絶対配置)や position: fixed;(固定配置)を使って要素を浮かせると、その要素はブロック要素であっても「中身のサイズ」まで縮んでしまいます。

浮かせた状態で親要素(または画面)の幅に合わせるには、2つのアプローチがあります。

方法1:left: 0; と right: 0; を使う(推奨)

左右の配置位置を両方とも 0 に指定することで、width を指定することなく、結果的に幅いっぱいに引き伸ばすテクニックです。

<style>
.fixed-header {
    position: fixed;
    /* top, left, right, bottom を一括指定できる inset プロパティも便利 */
    inset: 0 0 auto 0; /* 上0 右0 下auto 左0 */
    
    /* 従来の方法 */
    /* top: 0; left: 0; right: 0; */
    
    height: 60px;
    background-color: rgba(255, 255, 255, 0.9);
}
</style>
  • left: 0; right: 0;:左端と右端の両方にくっつくように配置されるため、要素の幅は親要素(fixedの場合は画面幅)と同じになります。
  • この方法は width を固定しないため、パディングやボーダーを追加しても柔軟に対応できるメリットがあります(「安全」というより「柔軟」な手法です)。
  • モダンなブラウザでは inset: 0; (上下左右すべて0)のようなショートハンドも利用可能です。

方法2:width: 100%; を使う場合の注意点

width: 100%; を指定しても幅を合わせることは可能ですが、その場合の「100%の基準」は、位置指定の基準となる親要素(Containing Block)になります。

  • position: fixed; の場合:画面(ビューポート)の幅
  • position: absolute; の場合:position: relative; などが指定された直近の親要素の幅

画像やテーブルが親要素からはみ出す時の対処法

親要素の幅が決まっていても、その中にある画像やテーブル(table)が大きすぎてはみ出してしまうことがあります。

これを防ぐための鉄板コードを紹介します。

画像(img)を親幅に収める

画像は元々のサイズを持っているため、親要素より大きいとそのままはみ出します。
これを防ぐには max-width を使います。

img {
    max-width: 100%; /* 親要素より大きくならないようにする */
    height: auto;    /* 比率を保ったまま高さを自動調整 */
}

テーブル(table)を親幅に固定する

テーブルは中身のテキスト量によって勝手に幅が広がってしまいがちです。
これを強制的に親幅に合わせるには table-layout: fixed; を使います。

table {
    width: 100%;          /* 幅を親に合わせる */
    table-layout: fixed;  /* 列幅を均等・固定にする */
}

うまくいかない時のチェックリスト

「コードを書いたのに幅が合わない!」という時は、以下のポイントを確認してみてください。

1. 親要素に幅が指定されているか?

子要素に width: 100%; を指定しても、親要素の幅が定まっていなければ計算できません。

親要素が display: inline-block; や floatposition: absolute; などで「中身に合わせて縮む」設定になっていないか確認しましょう。

場合によっては、さらに上位の html や body タグに高さや幅の指定が必要なケースもあります。

2. display: inline-block になっていないか?

子要素が span や a タグなどのインライン要素、あるいは display: inline-block; が指定されている場合、親幅いっぱいに広がらず、中身のサイズに収まってしまいます。

幅を合わせたい場合は display: block; を指定してブロック要素化しましょう。

HTML/CSSのスキルを活かして年収を上げる方法

以上、CSSで子要素を親要素の幅に合わせる方法について解説してきました。

なお、HTMLやCSSのスキルがある場合には、「副業で稼いで年収を上げる」といったことが可能です。

HTML/CSSのスキルを持つ人は多いものの、その分案件数も多く、副業エージェントやフリーランスエージェントを利用することで予想外の高単価案件が見つかることもあります。

エージェントサービスは、登録も利用もすべて完全無料なので、どんな求人や案件があるのか気になる方は、気軽に利用してみるとよいでしょう。