BLOG

インナー幅をはみ出すレイアウトのコーディング

更新日:2022/03/31


コーディングをしていると、コンテンツは特定の幅(インナー幅)に収まることが多いです。
ですが最近インナー幅からはみ出ているレイアウトのデザインが多くなったと感じます。

毎回どうやってコーディングするか悩んでしまっているので、頻出レイアウトのコーディングについてまとめてみました。
デモも用意しましたので、興味がある方は覗いてみてください。

デモ

また前提となるインナー幅についても解説しているので、コーディング初心者の方はぜひ読んでみてください。

インナー幅について

デザインカンプには大抵水色の線(ガイド線)が引かれています。

これがコンテンツの最大幅で、それより大きい画面幅のときに画面の左右中央に配置されるようにコーディングしていきます。
この幅をインナー幅と呼んでいます。

インナー幅を意識せずコーディングすると、コンテンツ幅もそのまま広がってしまいます。

そうならないために、インナー幅でコンテンツを囲みましょう。

代表的なレイアウトに、リキッドレイアウトソリッドレイアウトがあります。
簡単に違いを言いますと、画面幅を縮めたときに横スクロールバーが出るのがソリッドレイアウトで、出ないのがリキッドレイアウトです。

もっと詳しく知りたいという方は、以下の記事をご覧ください。

リキッドレイアウトは誰でもできる!!コーディングのコツまとめました

以前はソリッドレイアウトが主でしたが、リキッドレイアウトでのコーディングも増えてきた印象です。

ソリッドレイアウトかリキッドレイアウトかによってインナー幅の指定が若干異なりますので、それぞれ紹介します。
HTMLは共通で、以下のコードになります。

今回はインナー幅が1000pxになるように、それぞれスタイルを記述します。

ソリッドレイアウトのインナー幅

リキッドレイアウトのインナー幅

ポイントは以下の3点です。

  • インナー幅を指定する

  • 左右のpaddingを指定する

  • margin: 0 auto;で中央寄せ

レイアウトによる大きな違いはインナー幅の指定方法です。

ソリッドレイアウト:widthで指定する
リキッドレイアウト:max-widthで指定する

指定する値は、インナー幅の左右のpaddingを足した値を指定します。(全ての要素にbox-sizing: border-box;が指定されている想定です)

そもそもなぜ左右のpaddingを指定するのかというと、インナー幅以下の画面幅になるとコンテンツが画面幅ピッタリにくっついて見えづらくなるのを避けるためです。

左右の余白がなく、見えづらい

そして幅を指定して、margin: 0 auto;で中央寄せできるのは鉄板ですね。
知らなかったという方はこちらの記事を参照してみてください。

CSSで要素を上下や左右から中央寄せする7つの方法

これでインナー幅の指定方法については以上になります。
もっと詳しく知りたいという方は、こちらの記事を参照ください。

CSS 最近のWebページやアプリのレイアウトに適した、ラッパーの実装テクニックを徹底解説

レイアウト

インナー幅を押さえたところで、そこから飛び出たレイアウトのコーディングを紹介していきます。
今回はリセットCSSとして、ress.cssを読み込みました。
その他、共通のHTML構造とスタイルは以下になります。

コーディング(共通)

子要素がインナー幅からはみ出したレイアウト

コーディング

子要素が画面幅いっぱいに広がって、かつコンテンツはインナー幅に収まるというレイアウトです。

重要なのは2つの指定ですね。

paddingもmarginも同じ幅(50vw – 50%)を求めているのですが、marginはネガティブマージンでインナー幅からはみ出させます。
なので以下のように書き直します。

(50vw – 50%) × -1 = 50% – 50vw

このように左右のmarginとpaddingを指定すると、インナー幅からはみ出したレイアウトを実現できます。

片側がはみ出したレイアウト

コーディング(擬似要素)

このように今まで擬似要素でコーディングしていたのですが、先ほど紹介した子要素がインナー幅からはみ出したレイアウトでの手法を用いると、次のように実装できます。

コーディング(①の流用)

2つ紹介しましたが、後者の実装がよさそうです。

画像とテキストが交互にあり、画像がはみ出すレイアウト

こちら最近よく見るなと思っています。
デザインカンプの幅以外ではどういう見え方が正解なのだろうと、個人的に悩むデザインです。

デザインカンプの幅を超えたとき、どういう見え方を想定しているのか?

すでにコーディングされているものがある場合は、それに合わせます。
ない場合はデザイナーの方にどんなイメージなのか聞いたほうがいいかもしれません。

absoluteで配置

flexで配置

absoluteが先ほどの画像の上の見え方で、flexが下の見え方になります。

個人的にはabsoluteでの実装だと、画像が浮いて高さを確保できないので好きではないです。
テキストの量と画像の高さに応じてmarginの調整し、さらにテキストが動的だとJavaScriptで制御する必要があります。

ソリッドレイアウトなら調整が少ないので、absoluteで指定するのもありかなと思いました。

まとめ

インナー幅に収まらない、少しずらしたレイアウトが近年増えてきている印象です。
効果的に使えばユーザーの目を引き、コンテンツに注目を集めることができます。

margin: 0 calc(50% – 50vw);
padding: 0 calc(50vw – 50%);

とりあえず、インナー幅から画面幅いっぱいに広げたいときはmarginの指定、コンテンツはインナー幅に押さえたいときはさらにpaddingも指定するとうまくいきそうです。

今回挙げた実装方法が正解というわけではないですが、参考になる部分があれば幸いです。
またもっといい方法を知っているという方は、教えていただけると助かります!

FOLLOW US