PR

【CSS】display:flex; と display:inline; の違いとは

【CSS】displayflex; と displayinline; の違いとは HTML/CSS

cssで要素を横並びにしたいときに使う記述として「display:flex;」と「display:inline;」の2つが挙げられますが、「じゃ、それら2つにどんな違いがあるの?」と聞かれると、「えーっと、、、」ってなることがあると思います。

(先日、職場でそういう機会に遭いました。)

今回は、「display:flex;」と「display:inline;」がそれぞれどんな役割を持った記述なのかというところを復習しながら見ていきたいと思います。

グリッドレイアウトで横並びさせることもできますが、今回グリッドについては言及しないです。

そもそも「横並びにする」ことは本質部分じゃない

冒頭で、「display:flex;」と「display:inline;」のことを「cssで要素を横並びにしたいときに使う記述」という簡易的な説明をしましたが、「display:flex;」と「display:inline;」の本質部分は「横並びにする」ことではないです。

まず前者である「display:flex;」の本質は、「指定した要素をflexboxにする」ことです。

たしかに「display:flex;」を記述することで、指定した要素の子要素を横並びにすることができます。

しかしそれは、flexboxがデフォルトで

flex-direction: row;

という設定になっているから起こることです。

つまり、「display:flex;」という記述それ自体には「横並びにする」という役割はないのです。

「display:flex;」の本質は、指定した要素をflexboxにすること

また後者である「display:inline;」の本質は、「指定した要素をインライン要素にする」ことです。

たしかに「display:inline;」を記述することで、指定した要素を横並びにすることができます。

しかしそれは、前後に改行が入るという性質を持ったブロックレベル要素がインライン要素に変わったから起こることです。

つまり、「display:inline;」という記述それ自体には「横並びにする」という役割はないのです。

「display:inline;」の本質は、指定した要素をインライン要素にすること

それぞれを分けて認識することが重要

ここまで見てきた通り、「display:flex;」と「display:inline;」の本質部分は完全に別のところにあります。

そのため、「display:flex;」と「display:inline;」の違いについて理解するためには、それぞれを別物として捉えることが重要だということが言えます。

フレックスボックスにするための display:flex;

「display:flex;の本質は、指定した要素をflexboxにすること」ということで、ここで「フレックスボックス」について整理していきたいと思います。

フレックスボックスを使うと、指定した要素の子要素に対して以下のような設定ができます。

  1. 列か行か
  2. 折り返し
  3. 柔軟なサイズ変更
  4. 水平方向と垂直方向の配置

1.列か行か

「列か行か」は、flex-directionというプロパティで設定できます。

displayプロパティがflexになっている要素に対して、

flex-direction: row;

という記述をすると、子要素を左から右へと並べられます。

また、

flex-direction: column;

という記述をすると、子要素を上から下へと並べられます。

display:flex;でも縦並びにできるんだなぁ

2.折り返し

「折り返し」については、flex-wrap というプロパティで設定できます。

flex-direction: row によって子要素が横並びになっている要素に対して、

flex-wrap: wrap;

という記述をすると、子要素が右端まで到達した後に折り返しが行われます。

3.柔軟なサイズ変更

「柔軟なサイズ変更」については、flexというプロパティに対して無単位の割合値を指定することで設定できます。

たとえば、

.box {
  flex: 1;
}

という記述をすると、boxクラスの要素に 1 の値を与えられます。

また、先程の記述に加えて、

.box:nth-of-type(3) {
  flex: 2;
}

という記述をすると、boxクラスの3番目の要素に 2 の値を与えられます。

そうすることで、boxクラス内の3番目の要素がboxクラス内の3番目以外の要素の2倍サイズになります。

4.水平方向と垂直方向の配置

「水平方向と垂直方向の配置」については、align-itemsプロパティとjustify-contentプロパティで設定できます。

たとえば、水色の長方形のalign-itemsプロパティが既定値(stretch)のままだと、子要素(黒い背景と赤い文字)が交差軸方向へ伸びていきます。

そんなとき、

align-items: center;

を記述することによって、align-itemsプロパティの値は stretch から center へと変更されて

水色の長方形の寸法を維持しつつ、子要素を要素の上下中央に配置することができます。

また、水色長方形のjustify-contentプロパティが既定値(flex-start)のままだと、子要素(黒い背景と赤い文字)が主軸の始点に配置されたままですが、

justify-content: center;

を記述することによって、justify-contentプロパティの値は flex-start から center へと変更されて

子要素を主軸の左右中央に配置することができます。

フレックスボックスには、他にも便利な記述の仕方があるようなので、気になる方は以下を参考にされると良いと思われます。

フレックスボックス - ウェブ開発を学ぶ | MDN
フレックスボックス (Flexbox) は、アイテムを行または列に並べるための 1 次元のレイアウト方法です。アイテムがたわんで(伸びて)追加の空間を埋めたり、縮んで小さい空間に収まったりします。この記事では、すべての基本事項について説明し...

インライン要素にするための display:inline;

「display:inline;の本質は、指定した要素をインライン要素にすること」ということで、ここで「インライン要素」について整理していきたいと思います。

そもそも「インライン要素」というのは、「ブロックレベル要素」との対比で使われる単語です。

htmlファイルのbodyタグの中で使用される要素の多くは、「ブロックレベル要素」「インライン要素」に分類されます。 

ブロックレベル要素とインライン要素-HTMLの基本
HTMLの基本解説・チュートリアル

bodyタグ内の要素を大雑把に分けると、以下のようになります。

  • 見出し・段落・表などは「大きなかたまり」
  • 文中の強調したい部分などは「小さなかたまり」

そして、それぞれに対して

  • 大きなかたまりはブロックレベル要素
  • 小さなかたまりはインライン要素

といった分類名が付けられています。

また、

  • 大きなかたまりは前後で改行される
  • 小さなかたまりは前後で改行されない

といった性質の違いがあります。

さらに、

  • 大きなかたまりは改行によって、上から下へ配置される
  • 小さなかたまりは改行がないため、左から右へ配置される

といった方向の違いがあります。

とはいえ、「大きな」「小さな」の線引きを自由に変えたいというときがあります。

そんなときに使うのが

display: block;
display: inline;

なのです。

たとえば以下の場合、

赤字部分(spanタグ)はインライン要素であるため、デフォルトで

display: inline;

という設定になっています。

赤字部分の前後で改行を入れたい場合、赤字部分(spanタグ)に対して、

display: block;

という記述を追加すると、赤字部分(spanタグ)がインライン要素からブロックレベル要素に変わるため、以下のようになります。

このように、ある要素を「大きなかたまり」として扱いときはブロックレベル要素にし、「小さなかたまり」として扱いたいときはインライン要素にすることで、前後に改行を入れるかどうかを操作することができます。

「インライン要素」というのは、あくまで「ブロックレベル要素」との対応概念であり、display:inline;の本質は「横並びにする」ことではないのです。


ここまで、「display:flex;」と「display:inline;」がそれぞれどんな役割を持った記述なのかというところから、フレックスボックスやインライン要素について自分なりに復習しながらまとめてみました。

先述した通り、「display:flex;」と「display:inline;」の本質部分は完全に別のところにあり、それぞれを分けて認識することが重要だと考えられます。

基本を固めることで初めて応用ができるようになると思うので、新しいことばかりに取り組むのではなく、原点に戻って見直すということも今後やっていきたいなぁと思います。

▼職業訓練校で使っていた教科書(の最新版)

タイトルとURLをコピーしました