見た目で選ぶ!CSSのFlexboxを使いこなそう

2019.11

CSS

facebookシェア
twitterシェア

CSSのFlexboxとは、WEBサイト作成でよく用いられるレイアウト手法になります。

使い方に慣れるまでは複雑に感じますが、非常に便利なCSSプロパティですのでしっかりと使いこなせるようになりましょう。

Flexboxとは

Flexible Box Layout Moduleを略してflexboxと呼ばれています。CSS3から導入されたレイアウトモジュールです。

まずはどんなことができるのかをビジュアルで確認してみましょう。

01
02
02

上記のような要素に対して、FlexboxのCSSを反映させて横並びにしてみます。

HTMLと追加するCSSのコードは以下の通りです。

<div class="flex">
  <div class="square one">01</div>
  <div class="square">02</div>
  <div class="square">02</div>
</div>
.flex{
  display:-webkit-box;
  display:-ms-flexbox;
  display:flex;
}
.left{
  -webkit-justify-content :  flex-start;
  -ms-flex-pack :  start;
  justify-content :  flex-start;
}
01
02
03
水平方向
(justfy-content)

垂直方向
(align-item)

コンテナとアイテム

Flexboxにはコンテナとアイテムという概念があります。コンテナは上記の例でいう「クラスflex」の部分、その子要素がアイテムと呼ばれます。当記事でもコンテナとアイテムという名称を使用しています。

Flexboxの特徴

例を見ていたいてなんとなくどういうものかがわかったかと思いますが、Flexboxの大まかな特徴を紹介します。

特徴1. 子要素の高さがそろう

CSSでFlexboxをかけると、アイテムの高さがそろいます。これまでの横並びで使用していた、floatやinline-blockなどはそれぞれの要素の高さに依存していましたが、Flexboxを使用すると、自動でアイテムの高さを調整してくれます。

特徴2. レイアウトを独自のプロパティで変更

上記の例で試していただいたと思いますが、CSSプロパティを使用することでアイテムのレイアウトを変更ができます。どのようなプロパティがあるかは後述いたしますので、その特徴を覚えましょう。

コンテナに使用するプロパティ

flexboxでは、コンテナに使用するプロパティとアイテムに使用するプロパティでわかれています。

まずはコンテナに使用するプロパティを紹介します。

プロパティ名役割
flex-direction横並びか縦並びを指定
flex-wrap改行、複数行を制御
flex-flow上記2つのプロパティのショートハンド
justify-content列のレイアウトを調整
align-items上下の配置を調整
align-content行のレイアウトを調整

flex-directionで縦横の並びを指定

flex-directionの記載方法は以下の通りです。

.flex{
  -webkit-box-orient: horizontal;
  -webkit-box-direction: normal;
  -ms-flex-direction: row;
  flex-direction: row;
}
プロパティ値役割
row横並び、左から右へ配置(デフォルト)
row-reverse横並び逆順、右から左へ配置
column縦並び、上から下へ配置
column-reverse縦並び、下から上へ配置
01
02
02
flex-direction

flex-wrapで改行指定

flex-wrap の記載方法は以下の通りです。

.flex{
  -ms-flex-wrap: wrap;
   flex-wrap: wrap;
}
プロパティ値役割
nowrap改行不可、1行指定(デフォルト)
wrap改行許可、複数行指定
01
02
02
flex-wrap

コンテナサイズがアイテムの合計サイズよりも小さくなると、デフォルトでは改行せず無理くりコンテナ内に納めますが、改行を許可すると2行以上に改行され表示されます。

flex-flowで省略記載

flex-flowプロパティを使用すると上記で紹介した、flex-directionとflex-wapプロパティを同時に記載できます。

.flex{
	-webkit-box-orient:horizontal;
	-webkit-box-direction:normal;
	-ms-flex-flow:row wrap;
	flex-flow:row wrap;
}

CSSの行数を減らして記載することができます。

justify-contentで列のレイアウト指定

justify-contentは一番初めの例でも紹介した、列のレイアウトを指定するプロパティです。

.flex{
  -webkit-box-pack: start;
	-webkit-justify-content: flex-start;
	-ms-flex-pack: start;
	justify-content: flex-start;
}
プロパティ値役割
flex-start左揃え(デフォルト)
center中央揃え
flex-end右揃え
space-between両端揃え均等配置
space-around中央揃え均等配置
01
02
02
水平方向
(justfy-content)

align-itemsで上下の配置を調整

align-itemsも一番初めの例でも紹介した、上下の配置を指定するプロパティです。

.flex{
	-webkit-box-align: stretch;
	-ms-flex-align: stretch;
	align-items: stretch;
}
プロパティ値役割
stretch上下揃え(デフォルト)
flex-start上揃え
centern中央揃え
flex-end下揃え
baselineベースライン
01
02
02
垂直方向
(align-item)

align-contentで行のレイアウトを調整

align-contentはjustify-contentの上下バージョンです。

.flex{	
  -ms-flex-line-pack: stretch;
	align-content: stretch;
}
プロパティ値役割
stretch余白を埋めるように配置(デフォルト)
flex-start上揃え
centern中央揃え
flex-end下揃え
space-between上下両端揃え均等配置
space-around中央揃え均等配置

コンテナの高さが決まっているときに有効です。 デモは割愛させていただきます。

アイテムに使用するプロパティ

次にアイテムに使用するプロパティを紹介していきます。

プロパティ名役割
order並び順を指定
flex-growアイテムの伸び率を制御
flex-shrinkアイテムの縮み率を制御
flex-basisアイテムのベース幅を制御
flex上記3つのショートハンド
align-self垂直方向の位置指定

また、アイテムそれぞれにプロパティを使用するので、htmlに以下のようなクラスを追加してデモを作成します。

<div class="flex">
  <div class="square one">01</div>
  <div class="square two">02</div>
  <div class="square three">03</div>
</div>
01
02
03

orderで並び順を変更

アイテムにorderプロパティを使用することで、任意に並び順を変更することが可能です。

.one{
order:2;
}
.two{
order:3;
}
.three{
order:1;
}
01
02
03

align-self で垂直方向の位置指定

アイテム単位でalign-itemsと同じように指定できます。

.flex{
  -ms-flex-item-align: normal;
  align-self: normal;
}
プロパティ値役割
normalノーマル
flex-start右揃え
flex-end左揃え
center中央揃え
baselineベースライン
stretch両端ぞろえ

アイテムの幅指定

アイテムの幅を個別に指定できます。アイテムの幅を指定するためのプロパティは複数あります。

プロパティ名名前
flexまとめて指定
flex-grow伸び率
flex-shrink縮み率
flex-basisベースの幅を指定

まとめて指定するプロパティflexが推奨されています。

.flex{
  -webkit-box-flex:1;
	-ms-flex:1 1 10%;
	flex:1 1 10%;
}

まとめ

flexboxは横並びだけでなく、レイアウトをするうえでも大変便利なプロパティです。

ぜひ使いこなして、レイアウトを楽にしましょう。

.flStart{ -webkit-justify-content : flex-start; -ms-flex-pack : start; justify-content : flex-start; } .flCenter{ -webkit-justify-content : center; -ms-flex-pack : center; justify-content : center; } .flEnd{ -webkit-justify-content : flex-end; -ms-flex-pack : end; justify-content : flex-end; } .flStr{ -webkit-box-align : stretch; -ms-flex-align : stretch; align-items : stretch; } .flBetween { -webkit-box-pack : justify; -ms-flex-pack : justify; justify-content : space-between; } .flAround{ -ms-flex-pack : distribute; justify-content : space-around; } .flAistretch{ -webkit-box-align : stretch; -ms-flex-align : stretch; align-items : stretch; } .flAistart{ -webkit-box-align : start; -ms-flex-align : start; align-items : flex-start; } .flAiend{ -webkit-box-align : end; -ms-flex-align : end; align-items : flex-end; } .flAicenter{ -webkit-box-align : center; -ms-flex-align : center; align-items : center; } .flAibaseline{ -webkit-box-align : baseline; -ms-flex-align : baseline; align-items : baseline; } .flDirow{ -webkit-box-orient : horizontal; -webkit-box-direction : normal; -ms-flex-direction : row; flex-direction : row; } .flDirerow{ -webkit-box-orient : horizontal; -webkit-box-direction : reverse; -ms-flex-direction : row-reverse; flex-direction : row-reverse; } .flDicolumn{ -webkit-box-orient : vertical; -webkit-box-direction : normal; -ms-flex-direction : column; flex-direction : column; } .flDirecolumn{ -webkit-box-orient : vertical; -webkit-box-direction : reverse; -ms-flex-direction : column-reverse; flex-direction : column-reverse; } .flWrwrap{ -ms-flex-wrap : wrap; flex-wrap : wrap; } .flWrnowrap{ -ms-flex-wrap : nowrap; flex-wrap : nowrap; } .flIAiauto{ -ms-flex-item-align : auto; align-self : auto; } .flIAistart{ -ms-flex-item-align : flex-start; align-self : flex-start; } .flIAiend{ -ms-flex-item-align : flex-end; align-self : flex-end; } .flIAicenter{ -ms-flex-item-align : center; align-self : center; } .flIAibaseline{ -ms-flex-item-align : baseline; align-self : baseline; } .flIAistretch{ -ms-flex-item-align : stretch; align-self : stretch; }
  • facebookシェア
  • twitterシェア