CSSの基本!「Flexボックス」横並びなどフレキシブルに対応する

公開日 2021/11/15 13:46
更新日 2024/02/23 21:18

※2021年11月15日最新情報更新

「CSSの勉強を始めてみたけど、Flexboxが理解できない」
「Flexboxが便利なのは知っているけど使いこなせい」

CSSの勉強を始めたばかりの方にとって最初の難関となるのが「Flexbox」ではないでしょうか?

Flexboxは、CSSによるレイアウト作成でよく使われ、今やホームページを作成するために必須ともいえるレイアウト手法のひとつです。

※2021年現在、Flexboxは各主要ブラウザ(Chrome、Ege、Firefox、Safari)に対応。
(IE10未満には非対応。IE10以降でもバグが発生する可能性があるため、IEは確認が必要。)

扱いやすいプロパティの1つなので、一度使い方を覚えれば便利です。使いこなせるようになっていただけるよう、初心者の方に向けてFlexboxの使い方についてご紹介していきます。

Flexboxとは?

Flexboxは、CSS3の導入から使用できるようになったプロパティで、正式名称は「Flexible Box Layout Module」。主に、要素を横や縦に並べるときに使われます。

Flexboxが誕生するまでは、要素を並べる際、floatやdisplayプロパティが使用されていました。

Flexboxの誕生により、2021年現在では、Flexboxを使ってレイアウトを作成することが主流となっています。

また、レスポンシブに簡単に対応できるのも、Flexプロパティの大きなメリットです。

【CSS】positionの基礎を徹底攻略!

【CSS】positionの基礎を徹底攻略!

CSSを学び始めた初心者の方にむけて、positionプロパティの基礎を紹介しています。身に着けるとに非常に便利なプロパティですので、ぜひこの記事を参考に習得してみてください。

『Flexbox』の基本

Flexboxを使用するためには、まず要素に下記のCSSを記述する必要があります。


.クラス名 {
display: frex;
}
    

またFlexboxは、flexコンテナとflexアイテムと呼ばれる2つの要素で構成されているため、flexコンテナとflexアイテムの組み合わせでレイアウトを作成します。

  • Flexコンテナ:Flexを設定した親要素
  • Flexアイテム:Flexコンテナの子要素

Flexコンテナ (Flex container)

『Flexコンテナ』とはflexが設定される枠となる要素のことです。子要素をフレキシブルに配置可能になります。

『display: flex』、または『display: inline-flex』を指定された要素がFlexコンテナになります。

次の画像のオレンジ色の範囲がFlexコンテナにあたります。

Flexコンテナの範囲

Flexコンテナの範囲例

Flexアイテム (Flex item)

『Flexアイテム』とは、Flexコンテナ内でフレキシブルに配置可能な要素で、Flexコンテナの子要素のことを指します。

子要素のみ対象になるので、孫要素以降には影響しません。

次の画像のオレンジ色の範囲がFlexアイテムにあたります。

Flexアイテムの範囲

Flexアイテムの範囲

Flexレイアウトの要!Flexコンテナで使用するプロパティについて

Flexコンテナは、『軸』と『方向』の概念を持っています。縦と横、どちらを主軸にするかを決めて、どの方向に向けて並べるかを設定することで要素を配置します。

それぞれ、CSSプロパティで設定することが可能です。

Flexコンテナで使用する主なプロパティは次の5つです。

  • flex-direction:Flexアイテムの方向を決める
  • flex-wrap:Flexアイテムの折り返し
  • justify-content:Flexアイテムを水平方向に配置
  • align-items:Flexアイテム を垂直方向に配置
  • align-content:Flexアイテムの行を垂直方向の位置に指定

以下で、実際の変更例を掲載いたします。上記のHTMLソースコードはそのまま使い、CSSだけを変更してレイアウトを組んでいます。

Flexアイテム (Flex item)

Flexコンテナの主軸、Flexアイテムを並べる方向を決めるプロパティ。

縦か横か。横なら左から右に向かわせるのか、それとも逆方向か、などなど。

flex-direction: row;

主軸を横に設定し、Flexアイテムを横に並べます。

flex-direction: rowを設定した際のイメージ

.flex{
  padding: 2.5% 0;
  display: flex;
  flex-direction: row;
}
.flex > *{
  min-width: 8%;
  background: #fff;
  font-size: 64px;
  text-align: center;
}
.flex,
.flex > *{
  border: 3px solid #aaa;
}
    

flex-direction: row-reverse;

主軸を横に設定し、Flexアイテムを横に並べます。さらに右から左に向かって並ぶよう設定します。

flex-direction: row-reverseを設定した際のイメージ

.flex{
  padding: 2.5% 0;
  display: flex;
  flex-direction: row-reverse;
}
.flex > *{
  min-width: 8%;
  background: #fff;
  font-size: 64px;
  text-align: center;
}
.flex,
.flex > *{
  border: 3px solid #aaa;
}
    

flex-direction: column;

主軸を縦に設定し、Flexアイテムを縦に並べます。

flex-direction: columnを設定した際のイメージ

.flex{
  padding: 2.5% 0;
  display: flex;
  flex-direction: column;
}
.flex > *{
  min-width: 8%;
  background: #fff;
  font-size: 64px;
  text-align: center;
}
.flex,
.flex > *{
  border: 3px solid #aaa;
}
    

flex-direction: column-reverse;

主軸を縦に設定し、Flexアイテムを縦に並べます。さらに下から上に向かって並ぶよう設定します。

flex-direction: column-reverseを設定した際のイメージ

.flex{
  padding: 2.5% 0;
  display: flex;
  flex-direction: column-reverse;
}
.flex > *{
  min-width: 8%;
  background: #fff;
  font-size: 64px;
  text-align: center;
}
.flex,
.flex > *{
  border: 3px solid #aaa;
}
    

flex-wrap

Flexアイテムがコンテナの端についたとき、折り返すかを決めるプロパティです。折り返す方向は、flex-directionの値によって変化します。

以下の例では、flex-direction: rowが設定されている場合を想定しています。

flex-wrap: wrap;

Flexアイテムがコンテナの端に達したとき、折り返します。例は、flex-direction: rowが設定されているので、下に折り返されます。

flex-wrap: wrapを設定した際のイメージ

.flex{
  padding: 2.5% 0;
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
}
.flex > *{
  min-width: 8%;
  flex-basis: 25%;
  background: #fff;
  font-size: 64px;
  text-align: center;
}
.flex,
.flex > *{
  border: 3px solid #aaa;
}
    

flex-wrap: nowrap;

基本折り返しません。Flexアイテムはコンテナの幅に収まるように縮小されます。

flex-wrap: nowrapを設定した際のイメージ

.flex{
  padding: 2.5% 0;
  display: flex;
  flex-direction: row;
  flex-wrap: nowrap;
}
.flex > *{
  min-width: 8%;
  flex-basis: 25%;
  background: #fff;
  font-size: 64px;
  text-align: center;
}
.flex,
.flex > *{
  border: 3px solid #aaa;
}
    

flex-wrap: wrap-reverse;

Flexアイテムがコンテナの端に達したとき、通常とは逆方向に折り返します。

例は、flex-wrap: rowが設定されているので、通常は下に折り返されますが、wrap-reverseの場合は上に折り返されます。

flex-wrap: wrap-reverseを設定した際のイメージ

.flex{
  padding: 2.5% 0;
  display: flex;
  flex-direction: row;
  flex-wrap: wrap-reverse;
}
.flex > *{
  min-width: 8%;
  flex-basis: 25%;
  background: #fff;
  font-size: 64px;
  text-align: center;
}
.flex,
.flex > *{
  border: 3px solid #aaa;
}
    

justify-content

主軸の始点側に詰めるか、終点側に詰めるか、それとも中央に寄せるかなど、整列方法を設定するプロパティです。

flex-wrap: nowrapが設定されていると、整列させるためのスペースが残らないことがあるため、一緒に使えない場合も少なくありません。

主軸の始点の位置は、flex-directionの値によって変化します。

以下の例では、flex-direction: rowが設定されている場合を想定しています。

justify-content: flex-start;

主軸の始点側に詰めて揃えます。

例はflex-direction: rowが設定されているので、左詰めになります。

justify-content: flex-startを設定した際のイメージ

.flex{
  padding: 2.5% 0;
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
  justify-content: flex-start;
}
.flex > *{
  min-width: 8%;
  background: #fff;
  font-size: 64px;
  text-align: center;
}
.flex,
.flex > *{
  border: 3px solid #aaa;
}
    

justify-content: flex-end;

主軸の終点側に詰めて揃えます。

例はflex-direction: rowが設定されているので、右詰めになります。

justify-content: flex-endを設定した際のイメージ

.flex{
  padding: 2.5% 0;
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
  justify-content: flex-end;
}
.flex > *{
  min-width: 8%;
  background: #fff;
  font-size: 64px;
  text-align: center;
}
.flex,
.flex > *{
  border: 3px solid #aaa;
}
    

justify-content: center;

主軸の中央に寄せるように揃えます。

例はflex-direction: rowが設定されているので、左右中央寄せになります。

justify-content: centerを設定した際のイメージ

.flex{
  padding: 2.5% 0;
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
  justify-content: center;
}
.flex > *{
  min-width: 8%;
  background: #fff;
  font-size: 64px;
  text-align: center;
}
.flex,
.flex > *{
  border: 3px solid #aaa;
}
    

justify-content: space-between;

主軸の向きに沿って、最初のFlexアイテムが主軸の始点、最後のFlexアイテムが終点に接するように配置され、他のFlexアイテムを等間隔で並べます

justify-content: space-betweenを設定した際のイメージ

.flex{
  padding: 2.5% 0;
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
  justify-content: space-between;
}
.flex > *{
  min-width: 8%;
  background: #fff;
  font-size: 64px;
  text-align: center;
}
.flex,
.flex > *{
  border: 3px solid #aaa;
}
    

justify-content: space-around;

主軸の向きに沿ってFlexアイテムに同じ大きさのスペースを入れて並べます。

例はflex-direction: rowが設定されているので、Flexアイテムの左右にスペースが設定されます。

justify-content: space-aroundを設定した際のイメージ

.flex{
  padding: 2.5% 0;
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
  justify-content: space-around;
}
.flex > *{
  min-width: 8%;
  background: #fff;
  font-size: 64px;
  text-align: center;
}
.flex,
.flex > *{
  border: 3px solid #aaa;
}
    

align-items

Flexアイテムを交差軸の始点側に詰めてに揃えるか、終点側に揃えるか、中央に寄せるかなど、交差軸をもとに主軸と垂直の方向の整列方法を設定するプロパティです。

交差軸の始点の位置は、flex-directionの値によって変化します。

以下の例では、flex-direction: rowが設定されている場合を想定していますので、縦方向の配置を設定します。

また、わかりやすくするため、Flexコンテナの高さを固定値にしておきます。

align-items: stretch;

全てのFlexアイテムは、Flexコンテナの交差軸いっぱいに広がります。ただし、flex-wrap: wrapを指定していて、複数段にまたがる場合は、その段にある交差軸が最も長いFlexアイテムに揃えられます。

例はflex-direction: rowが設定されているため、縦いっぱいまで広がります。

align-items: stretchを設定した際のイメージ

.flex{
  height: 250px;
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
  align-items: stretch;
}
.flex > *{
  min-width: 8%;
  background: #fff;
  font-size: 64px;
  text-align: center;
}
.flex,
.flex > *{
  border: 3px solid #aaa;
}
    

※補足

今回、Flexアイテムの表示の変化をわかりやすくするために、Flexコンテナの高さを固定値にして表示していますが、固定値でなくてもalign-itemsにstretchが設定されている場合は、最もサイズの大きなFlexアイテムに合わせて変化します。

例のように、一つだけサイズが大きいFlexアイテムがあり、Flexコンテナにalign-items: flex-start;が設定されている場合、Flexアイテムの下部にスペースができてしまいます。

しかし、align-items: stretch;に変更すると、スペースを埋めるようにFlexアイテムの大きさが変わります。

align-items: flex-startを設定した際のイメージ

align-items: flex-start;

Flexコンテナの交差軸の始点に詰められるように配置されます。

例はflex-direction: rowが設定されているため、Flexコンテナの上部に詰められます。

align-items: flex-startを設定した際のイメージ

.flex{
  height: 250px;
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
  align-items: flex-start;
}
.flex > *{
  min-width: 8%;
  background: #fff;
  font-size: 64px;
  text-align: center;
}
.flex,
.flex > *{
  border: 3px solid #aaa;
}
    

align-items: flex-end;

Flexコンテナの交差軸の終点に詰められるように配置されます。

例はflex-direction: rowが設定されているため、Flexコンテナの下部に詰められます。

align-items: flex-endを設定した際のイメージ

.flex{
  height: 250px;
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
  align-items: flex-end;
}
.flex > *{
  min-width: 8%;
  background: #fff;
  font-size: 64px;
  text-align: center;
}
.flex,
.flex > *{
  border: 3px solid #aaa;
}
    

align-items: center;

Flexコンテナの交差軸の中央に寄せられるように配置されます。

例はflex-direction: rowが設定されているため、Flexコンテナの上下中央に詰められます。

align-items: centerを設定した際のイメージ

.flex{
  height: 250px;
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
  align-items: center;
}
.flex > *{
  min-width: 8%;
  background: #fff;
  font-size: 64px;
  text-align: center;
}
.flex,
.flex > *{
  border: 3px solid #aaa;
}
    

align-items: baseline;

Flexアイテムのベースラインが揃うように配置されます。

例はflex-direction: rowが設定されているため、Flexコンテナの上下中央に詰められます。

また、それぞれのFlexアイテムの高さが違うほうがわかりやすいので、奇数番のFlexアイテムのみ、高さを変えています。

align-items: baselineを設定した際のイメージ

.flex{
  height: 250px;
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
  align-items: baseline;
}
.flex > *:nth-child(2n){
  padding-top: 10px;
  height: 150px;
}
.flex > *{
  min-width: 8%;
  background: #fff;
  font-size: 64px;
  text-align: center;
}
.flex,
.flex > *{
  border: 3px solid #aaa;
}
    

align-content

Flexアイテムが複数段にまたがった際、それぞれの段の軸をどのように配置するか設定するプロパティです。例ではわかりやすいように、高さを固定値にしております。

align-itemsと似ているプロパティですが、align-items主軸にあるFlexアイテムの配置を指定するのに対し、align-contentは軸自体の配置を指定する違いがあります。

align-content: flex-start;

主軸に属するFlexアイテムを交差軸の始点に詰めるように配置します。

align-content: flex-startを設定した際のイメージ

.flex{
  height: 250px;
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
  align-items: baseline;
  align-content: flex-start;
}
.flex > *{
  min-width: 8%;
  flex-basis: 15%;
  background: #fff;
  font-size: 64px;
  text-align: center;
}
.flex > *:nth-child(2n){
  padding-top: 10px;
  height: 100px; 
}
.flex,
.flex > *{
  border: 3px solid #aaa;
}
    

align-content: flex-end;

主軸に属するFlexアイテムを交差軸の終点に詰めるように配置します。

align-content: flex-endを設定した際のイメージ

.flex{
  height: 250px;
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
  align-items: baseline;
  align-content: flex-end;
}
.flex > *{
  min-width: 8%;
  flex-basis: 15%;
  background: #fff;
  font-size: 64px;
  text-align: center;
}
.flex > *:nth-child(2n){
  padding-top: 10px;
  height: 100px; 
}
.flex,
.flex > *{
  border: 3px solid #aaa;
}
    

align-content: center;

主軸に属するFlexアイテムを、交差軸の中央に寄せるように配置します。

align-content: centerを設定した際のイメージ

.flex{
  height: 250px;
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
  align-items: baseline;
  align-content: center;
}
.flex > *{
  min-width: 8%;
  flex-basis: 15%;
  background: #fff;
  font-size: 64px;
  text-align: center;
}
.flex > *:nth-child(2n){
  padding-top: 10px;
  height: 100px; 
}
.flex,
.flex > *{
  border: 3px solid #aaa;
}
    

align-content: space-between;

最初と最後の主軸に属するFlexアイテムがコンテナに接するようにし、等間隔で配置する。

align-content: space-betweenを設定した際のイメージ

.flex{
  height: 250px;
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
  align-items: baseline;
  align-content: space-between;
}
.flex > *{
  min-width: 8%;
  flex-basis: 15%;
  background: #fff;
  font-size: 64px;
  text-align: center;
}
.flex > *:nth-child(2n){
  padding-top: 10px;
  height: 100px; 
}
.flex,
.flex > *{
  border: 3px solid #aaa;
}
    

align-content: space-around;

交差軸を基準にして、等間隔で配置されます。

align-content: space-aroundを設定した際のイメージ

.flex{
  height: 250px;
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
  align-items: baseline;
  align-content: space-around;
}
.flex > *{
  min-width: 8%;
  flex-basis: 15%;
  background: #fff;
  font-size: 64px;
  text-align: center;
}
.flex > *:nth-child(2n){
  padding-top: 10px;
  height: 100px; 
}
.flex,
.flex > *{
  border: 3px solid #aaa;
}
    

align-content: stretch;

行間にスペースがあれば、それを埋めるようにFlexアイテムを広げます。

align-content: stretchを設定した際のイメージ

.flex{
  height: 250px;
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
  align-content: stretch;
}
.flex > *{
  min-width: 8%;
  flex-basis: 15%;
  background: #fff;
  font-size: 64px;
  text-align: center;
}
.flex > *:nth-child(2n){
  padding-top: 10px;
  height: 100px; 
}
.flex,
.flex > *{
  border: 3px solid #aaa;
}
    

Flexレイアウトをさらに詳細に設定する!Flexアイテムプロパティ

Flexアイテムに使用できるプロパティです。

一つ一つ個別に設定することが可能で、これを使うことで、さらにフレキシブルに配置できるようになります。

使用頻度の高い『flex-basis』『align-self』『order』の3つを紹介します。

flex-basis

主軸に対するFlexアイテムの幅を指定するプロパティです。

flex-directionの値よって設定する幅の方向が変わります。rowやrow-reverseの場合は横幅、columnやcolumn-reverseの場合は縦幅を設定します。

例は1つ目のFlexアイテムにflex-basis: 200px;を設定しています。

flex-basisを設定した際のイメージ

align-self

交差軸に対する配置方法を設定するプロパティです。

align-itemsプロパティは全てのFlexアイテムの配置を設定しますが、こちらは個別に変更する際に使用します。設定内容はalign-itemsと同じなので、詳細は割愛いたします。

例は、1つめのFlexアイテムにflex-start、2つめにcenter、3つめにflex-endを設定します。

align-selfを設定した際のイメージ

order

Flexアイテムの順番を入れ替えるプロパティです。Orderプロパティの初期値は0になるので、値を明記していないFlexアイテムはすべてFlexコンテナの始点側に詰められて配置されます。

例では1つめのアイテムにorder: 5、2つめにorder: 4、3つめにorder: 3、4つめにorder: 2、5つめにorder: 1を設定しています。

orderを設定した際のイメージ

flexの注意点 – 少しわかりづらいポイント

flexは挙動をつかむのが難しく、仕様を把握していないと想定のレイアウトを組めなくなってしまいがちです。私がハマってしまった例を一つを紹介します。

『justify-content: space-between』を使っているのに謎のスペース

space-betweenだけど端にスペースが出来てしまう例

space-betweenなのにスペースがあく

『justify-content: space-between』はFlexアイテムを等間隔で並べるプロパティで、最初と最後のアイテムはコンテナの端に接した状態になるはずですが、最後に謎のスペースが…。

別のプロパティかと思っていろいろ試したものの上手くいかず、数時間解決できずに作業が止まってしまいました。

幅が0pxのため目視できないのですが、最後のスペースには、after疑似要素が配置されている状態でした。display: flex;はすべての子要素をFlexアイテムとして定義します。疑似要素も例外ではないようです。

justify-content: space-between;を設定しているにもかかわらず、主軸の始点側、終点側、どちらかに謎のスペースが空いてしまう場合、犯人はだいたい疑似要素(: : before、: : after)だと思います。

まとめ

flexで大事なことは次の点です。

  • display: flex、あるいはdisplay: inline-flexを設定した要素は、Flexコンテナとして扱われる。
  • Flexコンテナには軸と方向の概念を持っている
  • Flexコンテナの子要素はFlexアイテムとなり、フレキシブルに配置可能となる。疑似要素も例外ではない。

ショートハンドの記載方法などもありますが、もとのプロパティを把握していないと、flexを扱うのが難しいと考えているため、ここではあえて明記しません。

慣れてきたころにはショートハンドも使いこなせるようになると存じます。

非常に便利なflexですが、今でもブラウザごとの表示の差異がある印象です。

体感ですが、Safariやモバイル端末などでの対応で難航する場面が多々あり、実務で積極的に使えない場合もありますのでご注意ください。とはいえ、今後の主流になるのは間違いありません。

使える場面で積極的に使っておき、いつでも使いこなせるように準備しておきましょう!

【CSSで画像デザイン】ソフト不要&コピペOK!CSSだけで画像を加工する方法

「ホームページやブログに掲載する画像をおしゃれに編集したいけど、加工ソフトは持っていない…」「画像のトリミングをしてサイズを揃えたいけど、毎回編集するのは面倒くさい…」そういった悩みを持っている方も多いと思います。 今回…

この記事を書いた人

SEOタイムズ 編集部

SEO対策実績「20,000社」を超えるGMOソリューションパートナー株式会社がインハウスSEOに取り組む企業様・個人に向けSEO情報を発信。

"Web初心者にもわかりやすく"をコンセプトにSEO対策情報をお届けします。

ランキング

  • デイリー
  • ウィークリー
1
【2024年2月最新】X(旧Twitter)の使い方!アカウントの作成手順から基本・応用まで紹介【初心者向け】
2023/12/22 06:00
SNS
2
Runway Gen-2とは?テキストと画像だけで動画を生成してみた
2023/09/05 12:00
AI
3
【2024年最新】企業キャッチコピー78選!(業界別まとめ)
2023/12/15 09:00
Webマーケティング
4
重ね言葉や二重表現とは?「必ず必要」や「まずは最初に」「行為を行う」など例を交えて解説
2022/11/22 12:00
Webライティング
#ライティング
5
Googleアカウントからログアウトする方法をAndroid・iOS別で解説!
2023/11/11 12:00
Webの基礎知識
1
【2024年2月最新】X(旧Twitter)の使い方!アカウントの作成手順から基本・応用まで紹介【初心者向け】
2023/12/22 06:00
SNS
2
Googleアカウントからログアウトする方法をAndroid・iOS別で解説!
2023/11/11 12:00
Webの基礎知識
3
【cssコピペでOK】見出しデザイン37選!cssで好みの見出しを作ろう!
2023/08/01 09:00
Webデザイン
4
Brave(ブレイブ)ブラウザとは?4つの特徴や注意点・使い方を徹底解説
2023/10/25 09:00
Web
5
【2024年最新】企業キャッチコピー78選!(業界別まとめ)
2023/12/15 09:00
Webマーケティング

SEOタイムズとは?

SEOタイムズとは?

SEOタイムズは、Webマーケティングに取り組むWeb担当者向けのSEO対策特化型の情報メディアです。テーマは”AI時代のSEO対策”。

AIとの共存が求められる時代。検索エンジンまわりにおいては、利便性がさらに高まり進化を続けていますが、人々の行動から“調べる”という行為はなくなるものではありません。

SEOの本質は変わらず、時代に合った良質なコンテンツを発信することで集客効果が得られる環境は継続されます。
SEOタイムズが、あなたのWebマーケティング戦略を成功に導きます。