【HTML・CSS】ブロック要素を横並びにする方法(その2−1)

遅くなりました。。
前回記事 の続きです。

Flexboxを利用して要素を横並びにする方法について調べて見ました。
なお、長くなってしまったので、2回に分けてお送りします。

利用方法

もっとも簡単なのが、親要素のCSSに対してdisplay: flex;と書くだけで、配下の子要素が横並びになります。
前回の要素を再利用してみます。

f:id:nagative001:20180617200026p:plain
前回の要素

html
    <div class="wrapper"><p>wrapper</p>
      <div class="block1">ブロック1</div>
      <div class="block2">ブロック2</div>
      <div class="block3">ブロック3</div>
      <div class="block4">ブロック4</div>
    </div>
css
.wrapper {
  background-color: gray;
}

.block1 {
  width: 100px;
  height: 100px;
  background-color: blue;
}

.block2 {
  width: 150px;
  height: 150px;
  background-color: red;
}

.block3 {
  width: 200px;
  height: 200px;
  background-color: green;
}

.block4 {
  width: 300px;
  height: 150px;
  background-color: yellow;
}

親要素に対して

.wrapper {
  background-color: gray;
  display: flex;
}

display: flex;をつけるだけで f:id:nagative001:20180707150827p:plain

上図のように子要素が横並びになります。


適応させた要素のことを「フレックスコンテナ」、配下の要素を「フレックスアイテム」と呼びます。


補足

今回、wrapperの文字の横にブロックが並んでいます。
これは<p>wrapper</p>も子要素に含まれているからです。 もしブロックをwrapperの下に横並びにしたい場合、以下のように</p>を末尾に持っていきp要素をブロックの親要素して、<p>要素に対してdisplay: flex;を当てればOKです。

    <div class="wrapper"><p>wrapper
      <div class="block1">ブロック1</div>
      <div class="block2">ブロック2</div>
      <div class="block3">ブロック3</div>
      <div class="block4">ブロック4</div>
    </p> 
    </div>
.wrapper {
  background-color: gray;
}

.p  {
  display: flex;
}

f:id:nagative001:20180707153257p:plain 他にもやり方はあるかと思いますが、調査不足ですみません。。。


横並びにする方法としては以上となります。 が、調べて見ると横並び以外にもできることがたくさんありました。
まずは親要素となる「フレックスコンテナ」について見ていきたいと思います。

1-1. flex-direction (要素の縦横並びを指定できる)

子要素について横並びか縦並びを指定することができます。 以下のように親要素に対して記載します。 

.wrapper {
  background-color: gray;
  display: flex;
  flex-direction: ○○;
}

〇〇にはrow, column, row-reverse, column-reverseの4つが指定できます。

flex-direction: row;

ブロックが左から順で横並びになります。
rowは初期値となりますので、flex-directionを指定(記載)しない場合はrowが適応されます。 f:id:nagative001:20180707150827p:plain

flex-direction: column;

ブロックが上から順に縦並びになります。 f:id:nagative001:20180707162732p:plain

flex-direction: row-reverse;

ブロックが右から順で横並びになります。 f:id:nagative001:20180707162937p:plain

flex-direction: column-reverse;

ブロックが下から順に縦並びになります。 f:id:nagative001:20180707163150p:plain

1-2. flex-wrap(要素の折り返しの有無と方向を指定できる)

今までの例では、親要素の縦横幅を指定していませんでしたので、横幅はブラウザ画面一杯に広がり、縦幅は子要素の合計となっていました。
そのため、子要素の縦横幅はCSSで指定した幅のまま表示されていました。 しかし親要素の横幅や縦幅を子要素の合計よりも小さくした場合、何もしないと子要素の幅は自動で縮小されてしまいます。
親要素の横幅を小さく(500px)した場合
f:id:nagative001:20180707165048p:plain 親要素の縦幅を小さく(400px)した場合 f:id:nagative001:20180711214055p:plain flex-wrapCSSで指定することで、子要素の合計の幅が親要素の幅を超える場合、自動で折り返して表示させることができます。 以下のように親要素に対して記載します。 

.wrapper {
  background-color: gray;
  display: flex;
  flex-direction: row;
  flex-wrap: ○○;
}

〇〇にはnowrap, wrap, wrap-reverseの3つが指定できます。

flex-wrap: nowrap;

子要素を折り返さないようにします。 nowrapは初期値となりますので、flex-wrapを指定(記載)しない場合はnowrapが適応されます。

flex-wrap: wrap;

子要素を折り返すようにします。flex-directionの設定によって表示が変わります。
flex-direction: row; の場合 f:id:nagative001:20180707173703p:plain flex-direction: column;の場合 f:id:nagative001:20180707173926p:plain flex-direction: row-reverse;の場合 f:id:nagative001:20180707174117p:plain flex-direction: column-reverse;の場合 f:id:nagative001:20180707174321p:plain

flex-wrap: wrap-reverse;

子要素をwrapとは逆に折り返すようにします。こちらもflex-directionの設定によって表示が変わります。
flex-direction: row; の場合 f:id:nagative001:20180707181740p:plain flex-direction: column;の場合 f:id:nagative001:20180707181836p:plain flex-direction: row-reverse;の場合 f:id:nagative001:20180707181919p:plain flex-direction: column-reverse;の場合 f:id:nagative001:20180707182003p:plain

1-3. flex-flow(flex-directionとflex-wrapを同時に指定できる)

要素の並び順と折り返しをまとめて設定したい場合に利用します。 以下の様に親要素に対して記載します。

.wrapper {
  background-color: gray;
  display: flex;
  flex-flow: ○○ ●●;
}

○○にはflex-directionの値を入力し、半角スペースを空けてから ●●にはflex-wrapの値を入力します。
初期値はflex-flow: row nowrap;となります。

1-4. justify-content(要素の横並び位置を指定できる)

子要素を左右、中央、両端揃えなどに並べることができます。 以下の様に親要素に対して記載します。

.wrapper {
  background-color: gray;
  display: flex;
  justify-content: ○○;
}

〇〇にはflex-start, flex-end, center,space-between,space-aroundの5つが指定できます。 (flex-startは初期値となります。) 以降、flex-directionの値はrowにしています。

⑴ justify-content: flex-start;

子要素を左揃えに並べることができます。 f:id:nagative001:20180707150827p:plain

⑵ justify-content: flex-end;

子要素を右揃えに並べることができます。 f:id:nagative001:20180710160743p:plain flex-direction: row-reverse;に似ていますが、こちらは要素の並び順に変更はありません。位置だけが変わります。

⑶ justify-content: center;

子要素を中央揃えに並べることができます。 f:id:nagative001:20180710161356p:plain

⑷ justify-content: space-between

子要素の最初と最後を両端に寄せて残りを均等に配置します。 f:id:nagative001:20180710161702p:plain

⑸ justify-content: space-around

子要素の全てを均等に配置します。 f:id:nagative001:20180710162047p:plain

1-5. align-items(要素の縦並び位置を指定できる)

子要素を上下、中央揃えなどに並べることができます。 以下の様に親要素に対して記載します。

.wrapper {
  background-color: gray;
  display: flex;
  align-items: ○○;
}

〇〇にはstretch,flex-start, flex-end, center,baselineの5つが指定できます。 (stretchは初期値となります。)
以降、flex-directionの値はrowにしています。

⑴ align-items: stretch;

高さが指定されていない子要素について、親要素の高さまで広げることができます。 (下図はblock3,block4の高さを指定せず、親要素の高さを400pxにした場合の図になります) f:id:nagative001:20180710170309p:plain

⑵ align-items: flex-start;

子要素を上揃えに並べることができます。 f:id:nagative001:20180707150827p:plain

⑶ align-items: flex-end;

子要素を下揃えに並べることができます。 f:id:nagative001:20180710164109p:plain

⑷ align-items: center;

子要素を(親要素の縦幅に対して)中央揃えに並べることができます。 f:id:nagative001:20180710164410p:plain

⑸ align-items: baseline;

子要素の各テキストのbaseline(テキストの下部分)を基準に並べることができます。
(下図はわかりやすい様にブロック4のフォントサイズのみ大きくしています) f:id:nagative001:20180710165420p:plain

1-6. align-content(折り返した要素全体の縦並び位置を指定できる)

折り返しを指定した場合のみ、子要素全体の位置を指定することができます。 以下の様に、親要素に対して記載します。
尚、利用する場合はflex-wrapflex-flowwrapwrap-reverseを指定する必要があります。

.wrapper {
  background-color: gray;
  display: flex;
  flex-flow: row wrap;
  align-content: ○○;
}

○○にはstretch,flex-start, flex-end, center,space-between,space-aroundの6つが指定できます。(stretchは初期値となります。)
以降、flex-directionの値はrow、flex-wrapの値はwrap、要素の折り返しのため親要素の幅を500pxにしています。

⑴ align-content: stretch;

高さが指定されていない子要素について、折り返した子要素の高さを均等に広げることができます。 (下図はblock3,block4の高さを指定せず、親要素の高さを400pxにした場合の図になります) f:id:nagative001:20180711201605p:plain 一行目と二行目に行間がある様に見えますが、p要素であるwrapperの高さ(とmargin)を認識しているためです。 f:id:nagative001:20180711210623p:plain そのためp要素を除外し、block1,block2の高さを指定しない場合、上下の高さは親の高さに応じて均等になります。 f:id:nagative001:20180711211204p:plain

⑵ align-content: flex-start;

子要素を上揃えに並べることができます。 f:id:nagative001:20180711203955p:plain

⑶ align-content: flex-end;

子要素を下揃えに並べることができます。 f:id:nagative001:20180711204234p:plain

⑷ align-content: center;

子要素の(親要素の縦幅に対して)中央揃えに並べることができます。 f:id:nagative001:20180711204416p:plain

⑸ align-content: space-between;

子要素の最初と最後の行を両端に寄せて残りを均等に配置します。 f:id:nagative001:20180711204820p:plain

⑹ align-content: space-around;

子要素の各行間を均等に配置します。 f:id:nagative001:20180711205519p:plain


わかりづらい箇所もあったかと思いますが、以上となります。
今回ご紹介したものは全て親要素に対して設定するものになります。
次回は子要素に対して設定する内容を書きたいと思います。


参考にさせていただいたサイト、書籍について

【CSS】今更ながら、フレックスボックスの使い方をまとめてみた。
- PLUS DESIGN COMPANY ブログ -

これからのCSSレイアウトはFlexboxで決まり!
- Web クリエイターボックス -