フレックスボックスの基本的な使い方 横並びと縦並び 柔軟なレイアウトの設定方法

CSS フレックスボックスを理解しよう CSS
スポンサーリンク

今回は、「フレックスボックス」についてご紹介させて頂きます。

CSSを学習する上でも大きなポイントの一つですので、ゆっくりとしっかり身につけるようにしてください。

実際にご自身で記述するのはもちろん、「フレックスボックス」について書かれた記事が沢山ネットにありますので、分からない部分は必ず調べてしっかりと理解するようにしてください。

「フレックスボックス」に関連する使い方を身につけると、実際のコーディングが非常に楽になると思います。

スポンサーリンク

フレックスボックス

フレックスボックスとは

フレックスボックスとは、とても簡単に言うと「レイアウトを自由に変更出来る」機能のことを言います。

代表的な使い方としては、ブロックボックスを簡単にインラインボックスとして横並びにすることが出来ます。

具体的にはグローバルメニューを作成する際に使われます。

今までグローバルメニューの作成には「float」を使うことが多かったのですが、「float」の概念を理解し、使い方に慣れるまで少々時間がかかることが難点でした。

しかし、フレックスボックスが登場したことにより、初めてCSSを学習される方でも簡単にグローバルメニューの作成が容易になっています。

基本となる形

フレックスボックスを使用する上で覚えておいて欲しいのは、必ず「親要素」と「子要素」のセットで利用すると言うことです。

そして、利用するプロパティは、親要素に指定するプロパティと、子要素に指定するプロパティの2つに別れていることです。

またフレックスボックスには基準となる「主軸」があることを理解しながら読み進めてください。

基本的な使い方(親要素への指定)

display: flex;

HTML
  <header>
    <h1>フレックスボックスを理解しよう</h1>
  </header>
  <body>
    <section>
      <article>
        <h2>フレックスボックスとは</h2>
        <p>
          フレックスボックスとは、とても簡単に言うと「レイアウトを自由に変更出来る」機能のことを言います。
        </p>
      </article>
      <article>
        <h2>フレックスボックスとは</h2>
        <p>
          フレックスボックスとは、とても簡単に言うと「レイアウトを自由に変更出来る」機能のことを言います。
        </p>
      </article>
      <article>
        <h2>フレックスボックスとは</h2>
        <p>
          フレックスボックスとは、とても簡単に言うと「レイアウトを自由に変更出来る」機能のことを言います。
        </p>
      </article>
      <article>
        <h2>フレックスボックスとは</h2>
        <p>
          フレックスボックスとは、とても簡単に言うと「レイアウトを自由に変更出来る」機能のことを言います。
        </p>
      </article>
    </section>
  </body>
CSS
header {
  background-color: rgb(1, 153, 77);
  height: 100px;
}
h1 {
  color: white;
  font-size: 32px;
  font-weight: bold;
  text-align: center;
  line-height: 100px;
  margin: 0;
}
body {
  margin: 0;
}
article {
  background-color: rgba(1, 153, 77, 0.178);
  padding: 3px;
  margin: 3px;
}
display: flex;を指定する前の表示画面

4つのarticle要素が縦に並んでいます。

これに「display: flex;」を追加します。

CSS
section {
  display: flex;
}
display:flexが適用された画面を表示

横向きのレイアウトに変更されました。

なお「display: flex;」は影響を与えたい要素の親要素に記述します。

ここでは、article要素に影響を与えたいので、section要素に記述しています。

ここでは親要素がブロックだったため「display: flex;」を使用しています。

親要素がインラインの場合は、「display: inline-flex;」を使用します。

flex-direction: ;

「flex-direction」は子要素(ここではarticle)をどのように配置するか指定するプロパティになります。

意味
row左から右に配置
row-reverse右から左に配置
column上から下へ配置
column-reverse下から上へ配置
CSS
section {
  display: flex;
  flex-direction: column;
}
display: flex;を指定する前の表示画面

「column」は上から下へ配置しますので、もとの配置に戻っています。

「display:flex;」は「flex-direction」を内包しています。

そして、「flex-direction」のデフォルト値は「row」になっているので、「display:flex;」と記述しただけで、横並びになるのです。

flex-directionの値を表示した画面

それぞれブラウザではこのように表示されます。

フレックスボックスで向きを変える時に覚えておいて欲しいのは、ただ向きが変わっただけではないと言うことです。

デフォルトの状態である「row」の時の流れは右方向「→」になっています。

この矢印の流れを「主軸」とイメージしてください。

値を「column」にした時の流れは下方向「↓」になっています。

このとき「主軸」も当然、下向きになっています。

実はこの「主軸」がどこにあるのか、どちらを向いているのかという考え方はとても重要で、今後紹介するフレックスボックスに関するプロパティは、すべてこの「主軸」に対してどういう動作をするのかという指定をするのものになります。

ある要素に対して、プロパティを指定したけど何も起こらなかった場合や、意図しない動作をしたときは、この「主軸」がどこにあるのかを思い出してみてください。

flex-wrap: ;

「flex-box」のデフォルトでは、子要素を1行で表示するように幅が自動で調整されています。

子要素が少ない場合は良いのですが、子要素が多かったり、本文が長かったりすると見ずらいレイアウトになってしまいます。

そこでより見やすいレイアウトにするために、「flex-wrap」を使用します。

意味
no-wrap折返しなし、1行配置
wrap折返しあり、複数行、上から下へ配置
wrap-reverse折返しあり、複数行、下から上へ配置
HTML
    <section>
      <div class="direction">
        <div class="number">折り返してみよう 1</div>
        <div class="number">折り返してみよう 2</div>
        <div class="number">折り返してみよう 3</div>
        <div class="number">折り返してみよう 4</div>
        <div class="number">折り返してみよう 5</div>
        <div class="number">折り返してみよう 6</div>
        <div class="number">折り返してみよう 7</div>
        <div class="number">折り返してみよう 8</div>
        <div class="number">折り返してみよう 9</div>
        <div class="number">折り返してみよう 10</div>
      </div>
    </section>
CSS
.direction {
  display: flex;
}
.number {
  background-color: aqua;
  margin: 5px;
}
flex-wrapを適用させる前の画面
CSS
.direction {
  display: flex;
  flex-wrap: wrap;
}
.number {
  background-color: aqua;
  margin: 5px;
}
flex-wrapを適用させて画面

「flex-wrap: wrap;」を指定することで、折り返されました

「flex-flow」を使うと、「flex-wrap」と「flex-direction」をまとめて記述することが出来ます。

flex-direction: row;
flex-wrap: wrap; 
flex-flow: row wrap;

flex: 1; (子要素への指定)

flex: 1; とは

「display: flex;」と一緒に書かれていることが多い、「flex: 1;」について見ていきます。

「flex: 1;」は3つのプロパティ、「flex-grow」、「flex-shrink」、「flex-basis」のショートハンド(短縮形)になります。

とても簡単に言うと、子要素であるフレックスが、どれだけのスペースを占めるかを指定するものなのですが、こう書いてもイメージが付きにくいと思いますので、細かく解説していきます。

flex-grow

HTML
      <div class="direction">
        <div class="number number1">折り返してみよう 1</div>
        <div class="number number1">折り返してみよう 2</div>
        <div class="number number2">折り返してみよう 3</div>
      </div>
CSS
.direction {
  display: flex;
}
.number {
  background-color: aqua;
  margin: 5px;
}
flex-growを適用する前の画面

「display: flex;」を使用して横並びにすると、右側にスペースが空いているのがわかります。

このスペースを「flex-grow」を使って分配します。

CSS
.number1 {
  flex-grow: 1;
}
.number2 {
  flex-grow: 1;
}
flex-growを適用させた画面

空いていたスペースが均等に分配されました。

参考までに、「.number2」の値を「2」にしてみましょう。

CSS
.number1 {
  flex-grow: 1;
}
.number2 {
  flex-grow: 2;
}
flex-growがどのように適用されるのかを解説した画面

スペースが4等分され、「.number1」に1つずつ、「.number2」に2つ配分されます。

flex-shrink

フレックスアイテムのサイズがコンテナよりも大きい場合、縮小させるプロパティになります。

CSS
.number {
  background-color: aqua;
  margin: 5px;
  width: 300px;
}
.number1 {
  flex-shrink: 0;
}
.number2 {
  flex-shrink: 0;
}
flex-shrinkを指定しる前の画面

フレックスアイテムに、width指定をしているので、「flex-shrink」を「0」に指定すると、画面に入り切りません。

CSS
.number1 {
  flex-shrink: 1;
}
.number2 {
  flex-shrink: 0;
}
flex-shrinkが適用された画面

「.number1」に「1」を指定するとサイズが縮小されているのが分かると思います。

「.number2」は「0」のままなので、サイズが変更されていません。

flex-basis

「flex-basis」はフレックスアイテムの幅を指定するプロパティになります。

横並びの場合は、「width」と同じ働きをします。

CSS
.number1 {
  flex-basis: 200px;
}
.number2 {
  flex-basis: 400px;
}
flex-basisが適用された画面

「width」と「flex-basis」の両方が記述されている場合は、「flex-basis」が優先されます。

flex

「flex」を使うと、上記3つのプロパティをまとめて記述することが出来ます。

ショートハンド通常の記述方法
flex: 1;flex-grow: 1;
flex: 100px;flex-basis: 100px
flex: 2 2;flex-grow: 2;
flex-shrink: 2;
flex: 1 100pxflex-grow: 1;
flex-basis: 100px;
flex: 2 2 100pxflex-grow: 2;
flex-shrink: 2;
flex-basis: 100px

上記の表からもわかるとおり、「flex: 1;」は「flex-grow: 1;」と同じ意味になります。

そして、実はここでは省略されていますが、「flex-shrink」、「flex-basis」もデフォルト値が「flex: 1;」の中に含まれています。

「flex-shrink」のデフォルト値は「1」、「flex-basis」のデフォルト値は「auto」になります。

つまり、「flex: 1;」には実際、「flex: 1 1 auto」が記載されているのです。

flex-basisのデフォルト値は「auto」なのですが、ショートハンドになると「0」がデフォルト値に変更されます。

そのため正確には、

flex: 1; = flex: 1 1 0

が正しい理解となりますので、ご注意ください。

ここでは「flex」の説明を理解しやすいように、「grow、shrink、basis」の3つのプロパティの説明をしていますが、実際のコーディングでは、「flex」を使って書くようにしてください。

スポンサーリンク

あとがき

フレックスボックスの説明も少し長くなってきたので、今回はここまでにさせて頂きます。

次回は、「align-items」と「justify-content」の使い方を中心にご紹介させて頂きます。

ここまで一気に学習されてきた方は、そろそろ疲れて来る頃だと思います。

無理をせずにご自身のペースで学習を続けてください。

今回も最後までお読み頂きありがとうございました。

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