CSSで片側だけ画面幅いっぱいに広げる方法

HTML/CSS

CSSで片側だけ画面幅いっぱいに広げる方法を紹介します。

片側だけ画面いっぱいに広げることでアクセントを付けるデザインはよく見るので、覚えておくと便利かもしれません。

スポンサーリンク

サンプル


サンプルページ

HTML

<section class="contents-section">
  <div class="contents-inner">
    <h2 class="contents-ttl">タイトル</h2>
    <div class="contents-box">
      <div class="contents-txt">
        <p>テキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト</p>
      </div>
      <div class="contents-img">
        <p><img src="images/img.jpg" alt=""></p>
      </div>
    </div>
  </div>
</section>

CSS

.contents-section {
  padding: 50px 40px;
}
.contents-inner {
  max-width: 1320px;
  margin: 0 auto;
}
.contents-ttl {
  font-size: 30px;
  font-weight: bold;
}
.contents-box {
  display: flex;
  justify-content: space-between;
  margin-top: 40px;
}
.contents-txt {
  width: 50%;
  padding-right: 40px;
}
.contents-img {
  width: 50%;
}
.contents-img > p {
  width: 50vw;
  margin-right: calc((50vw – 100%) * -1);
}
.contents-img > p > img {
  width: 100%;
  border-radius: 60px 0 0 20px;
}

margin の値にマイナスの数値(ネガティブマージン)を指定することで、要素からはみ出して表示させることができます。
それを応用して、画像の親要素に margin-right: calc((50vw – 100%) * -1); を指定することで、画像部分が画面右端いっぱいまで広がるようにしています。

よくある質問(FAQ)

Q. 要素の高さを内容に応じて自動で広げるにはどうすればよいですか?
A. デフォルトのブロック要素は高さが内容に合わせて自動で広がります。高さが固定(height: Xpx)に設定されていないかを確認してください。高さを内容で決めながら最小高さを保証したい場合はmin-height: 100px; height: auto;と設定します。
Q. アコーディオンのアニメーションで高さをスムーズに変化させるにはどうすればよいですか?
A. height: 0からheight: autoへのtransitionはできません。代替方法:①max-heightをtransitionする(max-height: 0→1000px、終端に合わせるのが難しい)②grid-template-rowsをtransitionする(0fr→1frのトリック)③Web Animations APIでアニメーション。Chromeなど最新ブラウザではheight: calc-size(auto)がサポートされ始めています。
Q. 高さが変化する要素の周囲のレイアウトに影響を与えないようにするにはどうすればよいですか?
A. 絶対配置(position: absolute)では通常フローから外れるため周囲に影響しません。ただし親要素への影響が必要な場合は通常フローに置く必要があります。グリッドレイアウトの場合はsubgridや行高さの制御でレイアウト崩れを防ぎます。