9
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【CSS】要素を横並び・縦並びにする。display:flexの使い方を実例で解説

Last updated at Posted at 2021-02-02

要素を横並びにする方法はいくつか存在する。
一番おすすめは**display: flex;**(flexbox)。

昔はfloat(とclearfixの組み合わせ)が使われていたが、flexboxが出てからは、そちらの方が主流。

横並びでもカルーセルを作成する場合は、display: table;も使われたりするらしい。

##目次

  1. 横並び display: flex;
  2. display: flex;の注意点
    3. 高さは一番大きな要素に合う(画像も!)
    4. 高さを元に戻す方法
    5. align-itemsの設定(親)
    6. align-selfの設定(子)
    7. 各要素の横幅は各要素の中身の大きさになる(指定がない場合)
    8. 親要素に収まるように横幅が自動調整される
    9. 要素は左寄せになる
  3. 水平方向の位置とスペース調整 justify-content
  4. 折り返す flex-wrap: wrap;
  5. 個別に並べ替えする order: 数値
  6. 縦並びに戻す flex-direction: column;
  7. 参考リンク一覧

##横並び `display: flex;` 通常要素は縦に積まれていく。この親要素に対して`display: flex;`を指定すると横並びになる。

image.png

 ↓ display: flex;

image.png

html
<div class="flexbox">
  <div>要素1</div> 
  <div>要素2</div>
  <div>要素3</div>
  <div>要素4</div>
  <div>要素5</div>
</div>
.css
.flexbox div{
  background: skyblue;
  margin: 10px;
  width: 200px;
  height: 100px;
}

.flexbox{
  display:flex;
}

##`display: flex;`の注意点 ###高さは一番大きな要素に合う(画像も!) flexの中の要素の高さに指定がない場合、一番高い要素の高さ自動で変更される。

###実例
要素2が最も高さがある。

image.png

 ↓ display: flex;

image.png

高さが最も高い要素2に併せて伸びた。divタグだけでなく画像も縦にいっぱいに伸びてしまう。

これはflexboxの中の要素のcssを指定するalign-itemsというプロパティがデフォルトでstretch(引き伸ばす)になっているため。(normalでも同様になる)


##高さを元に戻す方法 高さを元の要素の高さに戻す方法は2つある。
  1. align-itemsの設定(親)
  2. align-selfの設定(子)

moz align-items
moz align-self

###1. align-itemsの設定(親)
flexを設定した親要素がデフォルトで``align-items: stretch;`となっているのでこれを変更すればいい。

center, flex-start, flex-endの3つだけ覚えておけば大丈夫そう。

内容
stretch デフォルト。一番高い要素に合わせて伸びる
normal stretchと同じ。
center 中央寄せ。
flex-start 上に寄せる
flex-end 下に寄せる
start flex-startと同じ。
end 効かない。(flex-startと同じ)
baseline ベースラインが一直線になるように配置

####1-1. center
align-items: normal;
align-items: stretch;
image.png

####1-2. center
align-items: center;
image.png

####1-3. flex-start
align-items: flex-start;

image.png

####1-4. flex-end
align-items: flex-end;
image.png

####1-5. start
flex-startと同じ。。
align-items: center;
image.png

####1-6. end
Chromeでは効かない、、startと同じになった。

align-items: end;
image.png

####1-7. baseline
align-items: baseline;
image.png


####2. `align-self`の設定(子) flexboxの中身を一律で設定するのではなく、要素一つ一つを指定する方法。

使える値は、align-itemsとほぼ同じ。center, flex-start, flex-endを覚えておけばOK。

####imgタグにのみalign-self: center;を適用した場合

image.png


####それぞれ異なる値にした場合

image.png


##各要素の横幅は各要素の中身の大きさになる(指定がない場合) 横幅の指定がない要素は、その要素の中ある要素の大きさになる。

image.png

 ↓ display: flex;

image.png

横幅を指定すれば、指定した長さになる。

▼コード

html
<div class="flexbox">
  <div>要素1</div> 
  <p>要素2 ここはpタグ。</p>
  <img src="img/small-cat.jpg" alt="">
  <div>要素4</div>
</div>
.css
.flexbox div{
  background: skyblue;
  margin: 0 10px;
}

.flexbox p{
  background: yellow;
  margin: 0 10px;
}

.flexbox{
  border:solid lightgray 1px;
  width: 70%;
  display:flex;
}

##親要素に収まるように横幅が自動調整される 中の要素にwidthを指定している場合でも、親要素の幅が縮まると合わせて小さくなる。折り返しはされない。

image.png

 ↓ 親要素の幅を縮める(グレーの枠線)

image.png


####min-width以下にはならない `min-width`を設定している場合は、その値が守られる。 親要素の幅を超える場合は**はみ出る**。

image.png

##要素は左寄せになる
display: flex;を適用した場合、中の要素は水平方向で左寄せになる。

image.png

グレーの親の枠線に対して左に寄っているのがわかる。


###水平方向の位置とスペース調整 `justify-content` justify-contentプロパティを使うと、要素を水平方向で調整できる。
内容
flex-start デフォルト。左寄せ
start デフォルトと同じ。
center 中央寄せ
flex-end 中央寄せ
end 機能しない。(デフォルトと同じ)
space-evenly  均等に配置
space-between 均等に配置。ただし、最初のアイテムは先頭寄せ。最後のアイテムは末尾寄せ。
space-around 均等に配置。ただし、各アイテムの両側に半分の大きさの間隔を置く

moz justify-content


####1. flex-start `justify-content: flex-start;` ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/55b74af1-8809-b3ce-c47b-d755abbbe21c.png)

####2. center
justify-content: center;
image.png

####3. flex-end
justify-content: flex-end;
image.png

####4. space-evenly
justify-content: space-evenly;
image.png

####5. space-between
justify-content: space-between;
image.png

####6. space-around
justify-content: space-around;
image.png


**▼point1** デフォルトでは中の要素が縦方向にstretchしてしまうため、`align-items`や`align-self`と合わせて使うのが一般的。

image.png

.css
.flexbox{
  display: flex;
  justify-content: space-evenly;
  align-items: center;
}

**▼point2** `space-*`を使った状態でmarginを適用することもできるがわかりにくいため、任意でスペースを開けたい場合は、**`space-*`を使わず、個別にmarginを設定していく方が調整しやすい**。
##折り返す方法 `flex-wrap: wrap;` 親要素に`flex-wrap: wrap;`を指定すると、親要素の横幅に合わせて折り返すことができる。デフォルトは`no-wrap`になっている。
1 2
wrap 折り返し
wrap-reverse 逆順で折り返し
no-wrap 折り返しなし

moz flex-wrap

###実例

image.png

 ↓ flex-wrap: wrap;

image.png

###wrap-reverseの場合
flex-wrap: wrap-reverse;

image.png
要素4が上に移動している。


##個別に並べ替えする `order: 数値` orderプロパティを使うと指定した順番で並べ替えることができる。

自分の**現在位置をorder: 0**として、移動した個数を-2や2のように指定する。

image.png

 ↓ imgタグに-2を設定

image.png

.css
.flexbox img{
  order: -2;
}

**▼注意点** どれか一つの要素が動いた場合、動いた後の現在位置が`order: 0`になる。
##縦並びに戻す `flex-direction: column;` `display: flex;`を適用すればデフォルトで横並びになるが、メディアクエリなどで再度縦並びに戻したい場合は、以下を追記する。

flex-direction: column;

ちなみにデフォルトの横並びはflex-direction: row;が省略されている。

###実例

image.png

 ↓ flex-direction: column;

image.png

display: flex;のみの時と同じく親の横幅に合わせてstretchする。

元のサイズに戻したい場合は、親にaligh-itemsか子にalign-selfを使う。

html
<div class="flexbox">
  <div>要素1</div> 
  <p>要素2 ここはpタグ。</p>
  <img src="img/small-cat.jpg" alt="">
  <div>要素4</div>
</div>
.css
.flexbox div{
  background: skyblue;
  margin: 0 10px;
  min-width: 200px;
  height: 100px;
}

.flexbox p{
  background: yellow;
  margin: 0 10px;
  min-width: 150px;
  height: 100px;
}

.flexbox{
  border:solid lightgray 4px;
  width: 70%;
  display:flex;
  flex-direction: column;
  align-items: center;
}

###・`aligh-items: center`

image.png


###・`aligh-items: flex-start` ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/f87c6a65-8946-8fcc-fe36-60996f95ac5a.png)
###・`aligh-items: flex-end` ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/045869bd-3e29-3079-02cb-ae347ce5c1d6.png)
##補足 `display:flex`を適用したことで上下の要素に余計なマージンが生じることはない。

他のCSSプロパティが効いている可能性が高い。


##参考リンク一覧
9
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?