Hira's.net

WEB
2020.02.28

【CSS】Flexboxの使い方(基礎編)

【CSS】Flexboxの使い方(基礎編)

Flexboxとは、Flexible Box Layout Moduleのの事でcssでレイアウトする方法って「inline-block」だったり「float」だったり色々なパターンがありますが最近では自動で調整してくれたり、jsを使わないと出来なかった事がcssだけで出来て文字通りフレキシブルなレイアウトが出来るこのFlexboxがスタンダードになってきました。

少し前まではブラウザの対応状況がまちまちで使いにくかった印象がありますが、ほぼ現行のブラウザで対応されて来ているので使用には問題無さそうです。

このFlexboxですが、実にいろいろな事が出来るのですが一度に羅列すると分かりにくいので今回は基礎編として従来 inline-blockやfloatで行ってきたように使う基礎部分について解説して行きたいと思います。

サンプル

HTML

<div class="flex">
	<div><img src="ship.png" alt="帆船の画像"></div>
	<div><img src="ship.png" alt="帆船の画像"></div>
	<div><img src="ship.png" alt="帆船の画像"></div>
</div>

このソースコードの場合、floatで横並びにしようと思うと中のdivに対してかけるのですがflexの場合は、下記のようにそれを囲む親要素にかけます。

親要素をコンテナ、個要素をアイテムと言います。

CSS

.flex{
	display: flex;
}

デモ

すると上記のような左詰めの形に並びます。
display: flex;だけでこのようになるのは後で解説しますが並び方、横方向、縦方向の指定を入れていなくてもデフォルトで決まっているからです。

display: flex; が指定された時、対象になるのはその要素の子要素になります。
例えば下記のような場合だと<p>はflexの対象になりますが<div>で囲まれた<a>は対象にはなりません。(親の<div>が対象になります。)

<div class="flex">
	<div><img src="ship.png" alt="帆船の画像"></div>
	▲flexの対象
	<p><img src="ship.png" alt="帆船の画像"></p>
	▲flexの対象
	<div>
		<a href="#"><img src="ship.png" alt="帆船の画像"></a>
		▲ここは対象にはならない
	</div>
	▲flexの対象
</div>

<a>も対象にしたい場合は子要素にします。

<div class="flex">
	<div><img src="ship.png" alt="帆船の画像"></div>
	▲flexの対象
	<p><img src="ship.png" alt="帆船の画像"></p>
	▲flexの対象
	<a href="#"><img src="ship.png" alt="帆船の画像"></a>
	▲flexの対象
</div>

次に設定できるオプションです。

並び順 – flex-direction

  • row (デフォルト)
    左から右へ水平に 並べる
  • row-reverse
    右から左へ水平に 並べる
  • column
    上から下へ縦方向に並べる
  • column -reverse
    下から上へ縦方向に並べる

flex-direction:row;

1
2
3
4

左から右へ配置されます。

flex-direction:row-reverse;

1
2
3
4

右から左へ配置されます。

flex-direction:column;

1
2
3
4

縦方向に上から下に並びます。

flex-direction:column-reverse;

1
2
3
4

縦方向に下から上に並びます。

折り返し – flex-wrap

次に折り返しです。
横に並んで行って幅いっぱいまで来た時に折り返して下の段へ行くか折り返し無しで1行で納めるか設定します。

  • nowrap(手フォルト)
    折り返し無しで1列に表示する
  • wrap
    幅がいっぱいになったら上から下に折り返す
  • wrap-reverse
    幅がいっぱいになったら下から上に折り返す

flex-directionとflex-wrapは次に出てくるflex-flowを使えば一括で指定出来るので特に理由等なければこちらを使いましょう。

並びと折り返しを一括指定する – flex-flow

.flex{
	flex-flow: 【flex-directionの値】 【flex-wrapの値】;	
}
.flex{
	flex-flow: row nowrap;	
}

水平方向の位置 – justify-content

  • flex-start(デフォルト)
    左揃えで並べる
  • flex-end
    右揃えで並べる
  • center
    中央揃えで並べる
  • space-between
    両端にスペースは空けず並べて均等に余白を開けて並べる
  • space-around
    両端にもスペースを空けて並べて均等に余白を開けて並べる

justify-content: flex-start;

1
2
3
4

justify-content: flex-end;

1
2
3
4

flex-direction : row-reverse; と似ていますがこちらは右寄せですがアイテム自体は左から並びます。

justify-content: center;

1
2
3
4

幅に余裕がある時に中央によって配置されます。
floatではやりにくかった横並びの中央寄せがこれだけで出来ます。

justify-content: space-between;

1
2
3
4

marginを設定しなくても自動で余白を計算してくれるので便利ですが個数が変わると余白が変わったり配置が想定通りにいかなかったりするので注意が必要です。

justify-content: space-between;

1
2
3
4

こちらも両端にも余白がある以外はpace-betweenと同じ特性です。

垂直方向の位置 – align-items

  • stretch(デフォルト)
    上下に余白を揃えて配置
  • flex-start
    上揃えで配置
  • flex-end
    下揃えで配置
  • center
    上下中央揃えで配置
  • baseline
    ベースラインに合わせて配置

分かりやすいように上下のpaddingで高さをアイテム毎に変えています。

align-items: stretch;

1
2
3
4

今までjsでする事が多かった高さ揃えがこの指定で出来ます。

align-items: flex-start ;

1
2
3
4

float等で並べた時と似たような挙動。
上揃えです。

align-items: flex-end ;

1
2
3
4

これは下揃えに配置されます。

align-items: center ;

1
2
3
4

アイテムの縦中央を基準に縦中央寄せになります。
vertical-align: middle;のような挙動。

align-items: baseline ;

1
2
3
4

align-items: center ; に似ていますが基準がベースラインになっています。

これらを組み合わせて設定します。

.flexsample{
	display: flex;
	flex-flow: row nowrap;
	justify-content: flex-start;
	align-items: stretch;
}
.flexsample .item{
	width: 23.5%;
	margin: 0 2% 0 0;
}
.flexsample .item:last-child{
	margin: 0;
}

オプションの組み合わせたりアイテム要素をwidthやmarginで調整して表示します。
flex-flow: row nowrap;
justify-content: flex-start;
align-items: stretch;
この3つはデフォルトなので入力しなくても反映されます。
最初のサンプルでdisplay: flex;だけで横並びになっていたのは、他のオプションが上記3つになっていたからですね。

1
2
3
4

応用例

応用としてflexを子要素にも設定すればテキストが改行しても同じ高さにしつつ、縦方向は中央揃えにする、といった事も可能です。

<div class="flex01">
	<div class="item">
		<div>1行テキスト</div>
	</div>
	<div class="item">
		<div>2行テキスト<br>2行テキスト</div>
	</div>
	<div class="item">
		<div>3行テキスト<br>3行テキスト<br>3行テキスト</div>
	</div>
</div>

<style>	 
	.flex01{
		display: flex;
		flex-flow: row nowrap;
		justify-content: center;
		align-items: stretch;
	}
	.flex01 .item{
		margin: 0 2% 0 0;
		display: flex;
		justify-content: center;
		align-items: center;

		padding: 15px;
		text-align: center;
		font-size: 26px;
		font-weight: bold;
		line-height: 120%;
		background: #008C23;
		border: 2px #004D13 solid;
		color: #fff;
	}
	.flex01 .item:last-child{
		margin: 0;
	}
</style>

デモ

1行テキスト
2行テキスト
2行テキスト
3行テキスト
3行テキスト
3行テキスト

基礎編はここまで

他にも素敵なオプションが色々ありますが今回はここまで。

これだけでもかなり柔軟にレイアウトする事が出来ますので色々と試してみて下さい。

主要ブラウザがほぼ対応してきて、今後はflexboxのレイアウトがスタンダードになってくるかと思うので全て網羅していなくてもここであげた内容ぐらい頭に入っていれば結構対応出来てくると思います。

更に色々なオプションは基本を理解した後で良いと思います。

floatやinline-blockによる方法も古い環境に対応出来るという強みがあるので引き出しの1つとして抑えておくとなお良いでしょう。

関連記事

この記事を書いた人

ひらず

WEBディレクター、デザイナー、フロントエンドエンジニア、投資家、会社オーナー 2007年に同志と起業、2009年に法人化、2018年にHira's.netを設立。
WEBデザイン、コーディング、ディレクター等WEB制作全般に幅広く携わっています。