マルチレイアウト – 基本設定
https://www.rural-web.com/coding/2574はじめに
本記事について
本記事は、【レイアウト】に関する設定をまとめたものです。float
flexbox
を用いてマルチレイアウトを実装するときに活用できます。レスポンシブ対応。
利用できる方は、お好きに活用してください。
当サイトで公開している「ruralweb.css(準備中)」をご自身のサイトに読み込ませておけば、各サンプルに指定されているクラスを挿入するだけで再現できることを目標にしています。もし個々に利用する場合は、各サンプルのソースをコピペしてご利用ください。
検証ブラウザ・OS
サンプル内容につきましては、最新ブラウザ・OS(IE/Chrome/Safari/FireFox/iOS/Android)で検証しております。基本的にIE9以下などのブラウザでは検証しておりませんが、たまに適用していたり説明してあるところは仕事でやむなく対応した時のものです。
注意事項
自身の仕事効率化を目的としていますので、表示・不具合等による損失につきまして一切の補償をいたしませんのでご理解ください。但し、公開しているサンプル内容の修正・改善はできる限りしていきますので、お気づきの点がございましたらTwitterよりご連絡ください。
コードサンプル
サンプルの要素について
サンプルでは、各要素を認識しやすいように色分けしているだけなので、実際は背景色・ボーダーはコードに含まれません。
基本設定
.rw-container
- クラス名
- rw-container
- 説明
-
- 上記サンプルの背景色が
.rw-container
の範囲 - コンテンツ外枠用(サイトのコンテンツ最大幅に配置するイメージ)
- サンプルでは
max-width:900px
に設定。サイト構造に合わせて最大幅を設定する ::before
::after
は.rw-container
の下層にある(.rw-col-*
)がfloat
で並ぶ時の対処
- 上記サンプルの背景色が
- コードを表示
-
<div class="rw-container">サンプルコンテンツ</div>
.rw-container { width:100%; max-width:900px;/* サイトのメインコンテンツ幅に変更 */ margin:0 auto; } .rw-container::before, .rw-container::after { display:table; content:" "; clear:both; } .rw-container::after { clear:both; }
.rw-row
- クラス名
- rw-row
- 説明
-
- 上記サンプルのボーダーが
.rw-row
の範囲 - カラムの外枠用。子要素
rw-col-*
の外包の役目 .rw-container
の子要素に配置::before
::after
は.rw-row
の子要素にあたる(.rw-col-*
)がfloat
で並ぶ時の対処
- 上記サンプルのボーダーが
- コードを表示
-
<div class="rw-container"> <div class="rw-row">サンプルコンテンツ</div> </div>
.rw-container .rw-row { position:relative; } .rw-container .rw-row::before, .rw-container .rw-row::after { display:table; content:" "; clear:both; }
カラム設定
.rw-col-*
- クラス名
- rw-col-*
- 説明
-
- 色分け:
.rw-col-12
.rw-col-8
.rw-col-6
.rw-col-4
.rw-col-3
- カラム幅100%
.rw-row
内のカラム数は.rw-col-[数字]
[数字]の合計が12になるようにする。(上記サンプル参考)- ブラウザ幅
~767px以下
になると全てwidth:100%
display:block
になり1カラムに。
- 色分け:
- 注意事項
- 各カラムが
float
仕様のため、高さが違うカラムが並ぶと表示崩れを起こしやすいので複数行には向いていない。その場合は「flexboxタイプ」を利用する
- コードを表示
-
<div class="rw-container"> <div class="rw-row bd-none"> <div class="rw-col-12">rw-col-12</div> </div> <div class="rw-row bd-none"> <div class="rw-col-8">rw-col-8</div> <div class="rw-col-4">rw-col-4</div> </div> <div class="rw-row bd-none"> <div class="rw-col-6">rw-col-6</div> <div class="rw-col-6">rw-col-6</div> </div> <div class="rw-row bd-none"> <div class="rw-col-4">rw-col-4</div> <div class="rw-col-4">rw-col-4</div> <div class="rw-col-4">rw-col-4</div> </div> <div class="rw-row bd-none"> <div class="rw-col-3">rw-col-3</div> <div class="rw-col-3">rw-col-3</div> <div class="rw-col-3">rw-col-3</div> <div class="rw-col-3">rw-col-3</div> </div> </div>
.rw-row .rw-col-12, .rw-row .rw-col-8, .rw-row .rw-col-6, .rw-row .rw-col-4, .rw-row .rw-col-3 { float:left; position:relative; min-height:1px; } .rw-row .rw-col-12 {width:100%;} .rw-row .rw-col-8 {width:66.66666667%;} .rw-row .rw-col-6 {width:50%;} .rw-row .rw-col-4 {width:33.33333333%;} .rw-row .rw-col-3 {width:25%;} /* media query */ @media screen and (max-width: 767px){ .rw-row .rw-col-12, .rw-row .rw-col-8, .rw-row .rw-col-6, .rw-row .rw-col-4, .rw-row .rw-col-3 { float:none; width:100%; } }/* query end */
オプション
.rw-in
- クラス名
- rw-in
- 説明
-
.rw-container
にclass="rw-container rw-in"
と付与することで、padding
を発生させる。- 初期値は左右
15px
ずつ .rw-container
以外にも.rw-row
.rw-col-*
に活用可能
- コードを表示
-
<div class="rw-container rw-in"> <div class="rw-row"> <div class="rw-col-6">rw-col-6</div> <div class="rw-col-6">rw-col-6</div> </div> </div>
.rw-in { padding:0 15px; }
.rw-in-pc
- クラス名
- rw-in-pc
- 説明
-
- ブラウザ幅
768px~
の場合のみ。 .rw-container
にclass="rw-container rw-in-pc"
と付与することで、PC表示768px~
ならpadding
を発生させる。- 初期値は左右
15px
ずつ .rw-container
以外にも.rw-row
.rw-col-*
に活用可能
- ブラウザ幅
- コードを表示
-
<div class="rw-container rw-in-pc"> <div class="rw-row"> <div class="rw-col-6">rw-col-6</div> <div class="rw-col-6">rw-col-6</div> </div> </div>
.rw-in-pc { padding:0 15px; } /* media query */ @media screen and (max-width: 767px){ .rw-in-pc { padding:0; } }/* query end */
.rw-in-sp
- クラス名
- rw-in-sp
- 説明
-
- ブラウザ幅
~767px
の場合のみ。 .rw-container
にclass="rw-container rw-in-sp"
と付与することで、SP表示~767px
ならpadding
を発生させる。- 初期値は左右
15px
ずつ .rw-container
以外にも.rw-row
.rw-col-*
に活用可能
- ブラウザ幅
- コードを表示
-
<div class="rw-container rw-in-sp"> <div class="rw-row"> <div class="rw-col-6">rw-col-6</div> <div class="rw-col-6">rw-col-6</div> </div> </div>
/* media query */ @media screen and (max-width: 767px){ .rw-in-sp { padding:0 15px; } }/* query end */
.rw-wide
- クラス名
- rw-wide
- 説明
-
.rw-in
の効果をなくす。.rw-in
を利用しているとき、子要素に対して.rw-wide
を付与することでpadding
された分を相殺させる。- 上記サンプルでは2段目の
.rw-row
に.rw-wide
付与 - 初期値は左右
-15px
ずつ - 親要素に
.rw-in
がないと作動しない
- コードを表示
-
<div class="rw-container rw-in"> <div class="rw-row"> <div class="rw-col-6">rw-col-6</div> <div class="rw-col-6">rw-col-6</div> </div> <div class="rw-row rw-wide"> <div class="rw-col-6">rw-wideで内包されたrw-col-6</div> <div class="rw-col-6">rw-wideで内包されたrw-col-6</div> </div> </div>
.rw-in .rw-wide { margin:0 -15px; }
.rw-wide-pc
- クラス名
- rw-wide-pc
- 説明
-
- ブラウザ幅
768px~
のみ作動 .rw-in
の効果をなくす。.rw-in
を利用しているとき、子要素に対して.rw-wide-pc
を付与することでPC表示768px~
のみpadding
された分を相殺させる。- 初期値は左右
-15px
ずつ - 親要素に
.rw-in
がないと作動しない
- ブラウザ幅
- コードを表示
-
<div class="rw-container rw-in"> <div class="rw-row"> <div class="rw-col-6">rw-col-6</div> <div class="rw-col-6">rw-col-6</div> </div> <div class="rw-row rw-wide-pc"> <div class="rw-col-6">rw-wide-pcで内包されたrw-col-6</div> <div class="rw-col-6">rw-wide-pcで内包されたrw-col-6</div> </div> </div>
.rw-in .rw-wide-pc { margin:0 -15px; } /* media query */ @media screen and (max-width: 767px){ .rw-in .rw-wide-pc { margin:0; } }/* query end */
.rw-wide-sp
- クラス名
- rw-wide-sp
- 説明
-
- ブラウザ幅
~767px
のみ作動 .rw-in
の効果をなくす。.rw-in
を利用しているとき、子要素に対して.rw-wide-sp
を付与することでSP表示~767px
のみpadding
された分を相殺させる。- 初期値は左右
-15px
ずつ - 親要素に
.rw-in
がないと作動しない
- ブラウザ幅
- コードを表示
-
<div class="rw-container rw-in"> <div class="rw-row"> <div class="rw-col-6">rw-col-6</div> <div class="rw-col-6">rw-col-6</div> </div> <div class="rw-row rw-wide-sp"> <div class="rw-col-6">rw-wide-spで内包されたrw-col-6</div> <div class="rw-col-6">rw-wide-spで内包されたrw-col-6</div> </div> </div>
/* media query */ @media screen and (max-width: 767px){ .rw-in .rw-wide-sp { margin:0 -15px; } }/* query end */
flexboxタイプ
.rw-row-flex
- クラス名
- rw-row-flex
- 説明
-
- flexboxタイプのカラムレイアウト実装
rw-row
をrw-row-flex
に変更するだけでflexboxタイプに変更されるrw-container
の子要素に配置- 左右の高さを合わせてくれるため、複数行に強いのでリスト型に向いている。
float
タイプと違い、一度rw-row-flex
で囲ってしまえばrw-col-*
をいくつでも挿入可能。ただし1行に対して数字合計12は守ること。 - ブラウザ幅
~767px
で1カラム
- コードを表示
-
<div class="rw-container"> <div class="rw-row-flex"> <div class="rw-col-6">rw-col-6</div> <div class="rw-col-6">rw-col-6</div> <div class="rw-col-6">rw-col-6</div> <div class="rw-col-6">rw-col-6</div> <div class="rw-col-4">rw-col-4</div> <div class="rw-col-4">rw-col-4</div> <div class="rw-col-4">rw-col-4</div> </div> </div>
.rw-row-flex{ display: flex; justify-content: flex-start; flex-wrap: wrap; } .rw-row-flex .rw-col-12 {width:100%;} .rw-row-flex .rw-col-8 {width:66.66666667%;} .rw-row-flex .rw-col-6 {width:50%;} .rw-row-flex .rw-col-4 {width:33.33333333%;} .rw-row-flex .rw-col-3 {width:25%;} /* media query */ @media screen and (max-width: 767px){ .rw-row-flex { display:block; } .rw-row-flex .rw-col-12, .rw-row-flex .rw-col-8, .rw-row-flex .rw-col-6, .rw-row-flex .rw-col-4, .rw-row-flex .rw-col-3 { width:100%; } }/* query end */
.rw-height-center
- クラス名
- rw-height-center
- 説明
-
- 左右の高さに合わせて上下中央配置
rw-row-flex
にrw-height-center
を付与
- コードを表示
-
<div class="rw-container"> <div class="rw-row-flex rw-height-center"> <div class="rw-col-6">サンプルテキストサンプルテキストサンプルテキスト(省略)</div> <div class="rw-col-6">サンプルテキスト</div> <div class="rw-col-6">サンプルテキスト</div> <div class="rw-col-6">サンプルテキストサンプルテキストサンプルテキスト(省略)</div> </div> </div>
.rw-row-flex.rw-height-center > div{ display: flex; flex-wrap: wrap; align-items: center; }
.rw-between
- クラス名
- rw-between
- 説明
-
- rw-containerの両端から均等に要素を配置する
rw-row-flex
にrw-between
を付与
- コードを表示
-
<div class="rw-container"> <div class="rw-row-flex rw-between"> <div class="rw-col-6">【1】rw-col-6:サンプルテキストサンプルテキストサンプルテキストサンプルテキストサンプルテキストサンプルテキストサンプルテキスト</div> <div class="rw-col-4">【2】rw-col-4</div> <div class="rw-col-3">【3】rw-col-3</div> <div class="rw-col-8">【4】rw-col-8:サンプルテキストサンプルテキストサンプルテキストサンプルテキストサンプルテキストサンプルテキストサンプルテキスト</div> <div class="rw-col-4">【5】rw-col-4</div> <div class="rw-col-3">【6】rw-col-3:サンプルテキストサンプルテキストサンプルテキストサンプルテキストサンプルテキストサンプルテキストサンプルテキスト</div> <div class="rw-col-3">【7】rw-col-3</div> </div> </div>
.rw-row-flex.rw-between { justify-content:space-between; }
flexboxタイプ:固定+可変
.rw-l-box-layout
- クラス名
- rw-l-box-layout
- 説明
-
- 左固定、右可変
- 上記サンプルは、左固定
300px
右可変auto
rw-row-flex
にrw-l-box-layout
を付与- ブラウザ幅
~767px
で1カラム
- コードを表示
-
<div class="rw-container"> <div class="rw-row-flex rw-l-box-layout"> <div>固定幅</div> <div>可変幅</div> </div> </div>
.rw-row-flex.rw-l-box-layout > *:first-child { flex-basis:300px; } .rw-row-flex.rw-l-box-layout > *:last-child { flex-basis:auto; flex:1; }
.rw-r-box-layout
- クラス名
- rw-r-box-layout
- 説明
-
- 左可変、右固定
- 上記サンプルは、左可変
auto
右固定300px
rw-row-flex
にrw-r-box-layout
を付与- ブラウザ幅
~767px
で1カラム
- コードを表示
-
<div class="rw-container"> <div class="rw-row-flex rw-r-box-layout"> <div>可変幅</div> <div>固定幅</div> </div> </div>
.rw-row-flex.rw-r-box-layout > *:first-child { flex-basis:auto; flex:1; } .rw-row-flex.rw-r-box-layout > *:last-child { flex-basis:300px; }
.rw-reverse
- クラス名
- rw-reverse
- 説明
-
- 順番を逆転させる
rw-row-flex
にrw-reverse
を付与
- コードを表示
-
<div class="rw-container"> <div class="rw-row-flex rw-r-box-layout rw-reverse"> <div>1つ目のDIV</div> <div>2つ目のDIV</div> </div> </div>
.rw-row-flex.rw-reverse { flex-direction:row-reverse; }
すべて
- バージョン
- 1.0.1
- 説明
-
- 最終更新時点でのレイアウト用CSSをまとめたもの
- コードを表示
-
.rw-container { width:100%; max-width:900px; margin:0 auto; } .rw-container .rw-row { position:relative; } .rw-row-flex{ display: flex; justify-content: flex-start; flex-wrap: wrap; } .rw-row .rw-col-12, .rw-row .rw-col-8, .rw-row .rw-col-6, .rw-row .rw-col-4, .rw-row .rw-col-3 { float:left; position:relative; min-height:1px; } .rw-row .rw-col-12,.rw-row-flex .rw-col-12 {width:100%;} .rw-row .rw-col-8,.rw-row-flex .rw-col-8 {width:66.66666667%;} .rw-row .rw-col-6,.rw-row-flex .rw-col-6 {width:50%;} .rw-row .rw-col-4,.rw-row-flex .rw-col-4 {width:33.33333333%;} .rw-row .rw-col-3,.rw-row-flex .rw-col-3 {width:25%;} .rw-in {padding:0 15px;} .rw-in-pc {padding:0 15px;} .rw-in .rw-wide {margin:0 -15px;} .rw-in .rw-wide-pc {margin:0 -15px;} .rw-row-flex.rw-height-center > div{ display: flex; flex-wrap: wrap; align-items: center; } .rw-row-flex.rw-l-box-layout > *:first-child, .rw-row-flex.rw-r-box-layout > *:last-child { flex-basis:300px; } .rw-row-flex.rw-l-box-layout > *:last-child, .rw-row-flex.rw-r-box-layout > *:first-child { flex-basis:auto; flex:1; } .rw-row-flex.rw-reverse { flex-direction:row-reverse; } .rw-row-flex.rw-between { justify-content:space-between; } /* after:before */ .rw-container::before, .rw-container .rw-row::before, .rw-container::after, .rw-container .rw-row::after { display:table; content:" "; clear:both; } .rw-container::after { clear:both; } /* media query */ @media screen and (max-width: 767px){ .rw-row .rw-col-12, .rw-row .rw-col-8, .rw-row .rw-col-6, .rw-row .rw-col-4, .rw-row .rw-col-3 { float:none; width:100%; } .rw-row-flex .rw-col-12, .rw-row-flex .rw-col-8, .rw-row-flex .rw-col-6, .rw-row-flex .rw-col-4, .rw-row-flex .rw-col-3 { width:100%; } .rw-row-flex { display:block; } .rw-in-pc {padding:0;} .rw-in-sp {padding:0 15px;} .rw-in .rw-wide-pc {margin:0;} .rw-in .rw-wide-sp {margin:0 -15px;} }/* query end */
補足説明
flexboxとは
CSS3から導入されたモジュール「Flexible Box Layout Module」です。フレキシブル・・・つまり「柔軟性」のあるレイアウトを実現できます。
flexboxの利点
今まではfloat
やinline-block
を利用して左右レイアウトを構築するのが主流でしたが、近年flexbox
は有名どころの最新ブラウザがサポートしたため、安心して利用できるようになりました。主な利点として、簡単なCSS設定で柔軟にカラムを扱えることです。今までは、カラム同士の左右の高さなどでバランスがおかしいとすぐに表示崩れを起こしていたり、横並びされたブロックのテキスト位置を上下中央にするのにも一苦労した方も多かったかと思います。flexboxではそういったムズムズしたところが解消されたので、今まで以上に使いやすくわかりやすいレイアウトデザインを考案できます。
「rw-row」と「rw-row-flex」の違い
今後レイアウト組みのスタンダードになりそうですが・・・個人で扱うレベルでしたらflexbox
をメインにしても良いと思います。ですが、クライアントによっては昔のブラウザに対応せざるを得ないなんてこともあります。そういった観点から、現時点ではどちらにも柔軟に対応できるよう設定しています。
実際に、float
で横並びさせるrw-row
と、flex
を利用したrw-row-flex
との大きな違いを見ていきます。
rw-rowの場合
rw-row-flexの場合
※ブラウザ幅~767px
では1カラムになります。
ご覧のように、見た目が同じになっています。
ソースはクラス名rw-row
もしくはrw-row-flex
が違うだけで、すべて共通です。
<div class="rw-container">
<div class="【rw-row】または【rw-row-flex】">
<div class="rw-col-6">【左】rw-col-6</div>
<div class="rw-col-6">【右】rw-col-6</div>
</div>
</div>
それでは各パターンの左側rw-col-6
に対して、高さを出したいと思います。
rw-rowの場合
rw-row-flexの場合
※ブラウザ幅~767px
では1カラムになります。
rw-row
の右カラムだけが出現しました。は一番外枠になるrw-container
です。つまり、右カラムは左カラムの高さを保持せず単独のブロックになるため、右カラムの高さは要素内の高さを優先します。それに対しrw-row-flex
は左右の高さに追従するため、右カラムが左カラムの高さ分まで延長します。
この現象が何を意味するのか?
今度はrw-col-6
を複数行にしてみます。
rw-rowの場合
rw-row-flexの場合
※ブラウザ幅~767px
では1カラムになります。
上記ソースもrw-col-6
を増やしただけです。
<div class="rw-container">
<div class="【rw-row】または【rw-row-flex】">
<div class="rw-col-6">【左】rw-col-6:サンプルテキストサンプルテキスト・・・(省略)</div>
<div class="rw-col-6">【右】rw-col-6</div>
<div class="rw-col-6">【左】rw-col-6</div>
<div class="rw-col-6">【右】rw-col-6:サンプルテキストサンプルテキスト・・・(省略)</div>
</div>
</div>
rw-row
が左右1カラムずつにならなくなりました。float
の仕組みからすれば当然の動きなのですが、表示崩れ扱いされて一番悩まされる例の代表格がこの現象ですね。
それに比べるとrw-row-flex
は安心です。並んだカラムの一番高さを持つ要素に高さを合わせるので、何も考えず量産できるようになります。隣に隙間があれば入りますし、入らなければ次の行に回り込む形になりますので、仮に各要素が幅も高さもバラバラであってもrw-row
よりかだいぶマシに整列してくれます。
※ブラウザ幅~767px
では1カラムになります。
さらにrw-between
を付与してあげれば、外枠rw-container
に合わせて均等配置しますので、レイアウトバランスも簡単に調整可能です。
※ブラウザ幅~767px
では1カラムになります。
<div class="rw-container">
<div class="rw-row-flex rw-between">
<div class="rw-col-6">【1】rw-col-6:サンプルテキストサンプルテキスト・・・(省略)</div>
<div class="rw-col-4">【2】rw-col-4</div>
<div class="rw-col-3">【3】rw-col-3</div>
<div class="rw-col-8">【4】rw-col-8:サンプルテキストサンプルテキスト・・・(省略)</div>
<div class="rw-col-4">【5】rw-col-4</div>
<div class="rw-col-3">【6】rw-col-3:サンプルテキストサンプルテキスト・・・(省略)</div>
<div class="rw-col-3">【7】rw-col-3</div>
</div>
</div>
float:leftの捉え方
float:left(左回り込み)
について細かく説明するのが面倒なので・・・ざっくりイメージするならば、
- (右)隣に入る余裕があるなら、(右)隣に配置されます。
- もし入らないなら、直前のブロックの高さで行ける範囲の左に回り込みます。
ですので、先ほどの例にもう一つrw-col-6
を増やしてみましょう。
※ブラウザ幅~767px
では1カラムになります。
新しく挿入した5個目のrw-col-6
が直前の要素【4】の高さから見て一番左を目指す動きをしました。
以上のことから、float
によるレイアウトは左右の高さが1px異なるだけでキレイに配置されないデメリットを持ち合わせています。高さがしっかり揃う条件下であれば心配いりませんが。
少し面倒ではありますが「1行で1セットだぞ!」としてあげればレイアウトできます。
※ブラウザ幅~767px
では1カラムになります。
<div class="rw-container">
<div class="rw-row">
<div class="rw-col-6">【1】rw-col-6:サンプルテキストサンプルテキスト・・・(省略)</div>
<div class="rw-col-6">【2】rw-col-6</div>
</div>
<div class="rw-row">
<div class="rw-col-6">【3】rw-col-6:サンプルテキストサンプルテキスト・・・(省略)</div>
<div class="rw-col-6">【4】rw-col-6</div>
</div>
</div>
更新履歴
更新日時 | 更新内容 |
---|---|
2019.10.17 | コードサンプル:全部入りCSSを挿入 |
2019.10.16 | 記事を作成 |