• LIGの広告成功事例
WEB

CSS3のFlexboxを基本から理解して、使い倒そう!

CSS3のFlexboxを基本から理解して、使い倒そう!

こんにちは、王です。デザイナーやってます。

今回は「Flexboxを基本から理解して、使い倒そう!」ということで、初耳の方でもざっとFlexboxで何ができるか分かるように短い動画を用意しました。

動画の中で使ってたデモをアップしたので、確認してみたい方は以下のリンクをどうぞ!
デモ

昨今では、デジタルデバイスサイズの多様化でレスポンシブデザインとやらが流行っています。
同じサイトを様々なスクリーンサイズに応じたデザインをしなければならない上に、コーディングにも手間がかかります。制作側からしたら何かと厄介ですよね。

「なるべく手間をかけずに作りたい!」という世界中のデザイナーの声に応えて、「Twitter Bootstrap」を始めとした数多くのフレームワークが徐々に脚光を浴び始めて久しくなります。

ただ、これらはあくまで古い技術の組み合わせで、革新的な技術でもなんでもないということを忘れないでください。
グリッドシステムも便利ではありますが、やはりFlexboxに脱皮するまでの過渡期においての一時的な措置にすぎないと思います。

Flexbox自体は言うほど新しい技術ではないですが、仕様がころころ変わって長い間安定せず、使い所も難しかったです。
しかし、最近になってやっと仕様が固まってきたようです!
IE10も含めてモダンブラウザでは普通に使えてるので、時は熟したと見て、最新仕様でガッツリご紹介したいと思います
レスポンシブとの親和性も高いということもあって、早めに使いこなせるようになっておくといいでしょう!

※この記事では、W3Cの2012年9月付の草案を元に書いてますが、仕様が代わり次第更新するつもりです。また、執筆時点では最新の仕様に準拠したブラウザはChromeのみとなっているので、ご確認のときはChromeでしてください。

目次

Flexboxの概要

Flexboxモデルはもともと複雑化したWebアプリのレイアウトを組みやすくすることを目的に開発したものだと思いますが、時代の流れ的にはレスポンシブデザインなどにも応用できたかと。

IE10の開発者向けガイドの記述がとてもよくまとまってるので、引用します。

複雑な Web ページをレイアウトすることを目的とし、画面やブラウザー ウィンドウのサイズがさまざまに変化する場合にも要素の相対的な位置とサイズを一定に保つ場合に、特に役立ちます。位置とサイズを正しく設定するのが難しいフロートへの依存を軽減できます。

つまり、今までJSやCSSのライブラリでしかできなかったことを、ネイティブかつエレガントかつ機能的にやってのけるのだぞ!このやろう!ということです。

Flexboxの基本中の基本

まずは基本から見ていきましょう!

用語

  • Flexboxコンテナー
  • Flexboxモデルを使うためには必ずこの「Flexboxコンテナー」が必要です。CSSで「display:flex」と指定すれば、要素を「Flexboxコンテナー」として定義することができます。

  • Flexboxアイテム
  • 「Flexboxコンテナー」の子要素のこと、「Flexboxコンテナー」の子要素であれば勝手に「Flexboxアイテム」となるので、特にCSSで指定する必要はないです。また、Flexboxアイテムに該当する要素は、様々なFlexboxアイテム用のプロパティが使えるようになります。

    第一歩、「display:flex」

    お馴染みのBoxモデルであれば「block」を指定するところを「flex」で指定してあげることで、その要素を「Flexbox」コンテナーとして定義することができます。
    Flexboxを使うには必ず「Flexboxコンテナー」を作成しておく必要があるので、Flexboxモデルを使う第一歩として、まずは以下のようにします。

    #wrapper{
    	display: -webkit-flexbox;
    	display: -moz-flexbox;
    	display: -ms-flexbox;
    	display: -o-flexbox;
    	display: flexbox;
    }
    

    ※冒頭でも述べましたが、執筆時点では最新の仕様に準拠したブラウザはChromeのみですので、古いプロパティ名と若干異なります。例えば「display: box」や「box-{*}」は全部古い仕様ですので注意してください。

    「Flexboxコンテナー」で指定できるプロパティ

    ではさっそく「Flexboxコンテナー」で指定できるプロパティを見ていきましょう。

    「flex-direction」:子要素の配置方向

    まずは子要素の配置方向から。

    row

    初期値です。子要素はHTMLの書き順で、左から右に配置されます。

    row

    column

    子要素はHTMLの書き順で、上から下に配置されます。

    column

    row-reverse

    「row」と同じで横に配置されるが、並ぶ順序は「右から左」になります。

    row-reverse

    column-reverse

    「column」と同じで縦に配置されるが、並ぶ順序は「下から上」になります。

    column-reverse

    「flex-wrap」:子要素の折り返し設定

    flexboxは「単一行」か「複数行」にすることができます。
    単一行:子要素を全て一行に詰めようとする。親要素からはみ出ても「改行」は決してしない。
    複数行:floatと似ていて、子要素が親の長さを超えてしまった場合、折り返して「複数行」に分割される。

    nowrap

    初期値、折り返しなし、つまり「単一行」。

    nowrap

    wrap

    折り返しを許可、「複数行」。

    wrap

    wrap-reverse

    「wrap」と同じで、ただ、折り返し地点が逆になります。

    nowrap-reverse

    「flex-flow」でまとめて記述

    「flex-direction」と「flex-direction」をまとめて記述できる。例えば子要素を縦に配置し、かつ折り返しありの場合だと

    div {
    	flex-flow: column wrap;
    }
    

    justify-content:水平方向の揃え方

    「flex-direction」で指定した子要素の配置方向をベースに、様々な揃え方を指定できます。

    ※「利用可能な領域」が存在するときにのみ効果を確認できます。具体的に、「flex」プロパティが設定されてないときか、設定したが最大サイズに達したときです。「利用可能な領域」がないと、そもそも「揃える」意味がないんです。

    flex-start

    横配置の場合、「左揃え」、縦配置の場合、「上揃え」になります。

    flex-start

    flex-end

    横配置の場合「右揃え」、縦配置の場合「下揃え」になります。

    flex-end

    center

    「中央揃え」です。

    center

    space-between

    均等に間隔を空ける

    space-between

    space-around

    「space-between」と同じく均等に間隔を空ける。違うのは、左右の端のFlexアイテムにも半分ずつ間隔を空けてるところ。

    space-around

    align-items:垂直方向の揃え方

    「justify-content」と似ていますが、揃える軸は「justify-content」の垂直方向の軸となります。デフォルトでは、垂直方向に揃えることになっているはずです。
    「justify-content」との組み合わせで、従来では難しかった「水平垂直中央揃え」などが簡単に実現できます!
    この辺りから結構混乱してくると思いますが、実際にコードを書いてみながら読んで頂けると理解しやすいのかなと。

    flex-start

    横配置の場合「上揃え」、縦配置の場合「左揃え」になります。

    flex-start

    flex-end

    横配置の場合「下揃え」、縦配置の場合「右揃え」になります。

    flex-end

    center

    「中央揃え」です。

    center

    baseline

    ベースラインを揃えます。

    baseline

    stretch

    Flexアイテムの高さが設定されている場合、上下一杯まで広げます。設定されていない場合、コンテンツの一番多いFlexアイテムの高さに合わせて自動的に広げます。

    strech

    align-content:行の揃え方

    「flex-wrap」で「nowrap」以外に設定した場合のみ有効です。複数行になったときの揃え方です。「justify-content」と似ています。

    flex-start

    横配置の場合「上揃え」、縦配置の場合「左揃え」になります。

    flex-start

    flex-end

    横配置の場合「下揃え」、縦配置の場合「右揃え」になります。

    flex-end

    center

    「中央揃え」です。

    center

    space-between

    均等に間隔を空ける。

    space-between

    space-around

    「space-between」と同じく均等に間隔を空ける。違うのは、上下の端の行にも半分ずつ間隔を空けるところ。

    space-around

    「Flexboxアイテム」で指定できるプロパティ

    flex:伸縮性設定全般

    恐らくFlexboxアイテムで最も重要かつ最も難解なプロパティでしょう!
    Flexboxモデルを扱う上で必ずと言っていいほど使うプロパティです。分かりやすく説明しますので、しっかり理解しましょう!
    まず言っておきたいのは、この「flex」というプロパティは実は

    ‘flex-grow’、’flex-shrink’、’flex-basis’

    上の3つのプロパティのショートハンドです(記述する順番で書いてます)。
    別々で書くのではなくflexでまとめて書く場合が多いと思うので、これらのプロパティをこのセクションでまとめて説明します。

    flex-grow

    Flexアイテムの「伸びる」倍率。Flexコンテナーが全てのFlexアイテムを格納切ってなお余りのスペースがある場合、各自の「flex-grow」プロパティに従い、自動的に利用可能な領域いっぱいまで伸びる。

    flex-shrink

    Flexアイテムの「縮む」倍率。Flexコンテナーが全てのFlexアイテムを格納し切れない場合、各自の「flex-shrink」プロパティに従い、ちょうど格納できるように、自動的に縮む。

    flex-basis

    このプロパティは「width」とほぼ同じ働きをします。要するにベースとなる長さ、或いは「最小の長さ」を設定できるというわけです。省略した場合、値は「0」と指定されます。
    この他、「auto」と指定することもできる。「auto」と指定した場合、Flexアイテムの「コンテンツサイズ」に設定される。各Flexアイテムのコンテンツサイズが違うと長さもまちまちになるので、絶対的な長さを指定したい場合は「auto」ではなく数字で指定するといいです。

    上記の説明を読んでもピンと来ない方も多いのではないかと思いますので、具体的なアルゴリズムを下記の図解で説明します。
    図解では「flex-grow」を例に説明していますが、「flex-shrink」も同じ要領で長さを算出します。
    取り立てて説明する必要もないと思うので、ご自分で確認してみてください。

    図解

    ※「none」と指定した場合、 ‘0 0 auto’と見なされる。

    align-self:個別のFlexアイテムの垂直方向の揃え方

    「align-items」と全く同じように機能するが、こちらは「個別のFlexアイテム」に対して指定するものです。
    各プロパティに関しては「align-items」を参照してください。

    order:順番指定

    FlexboxアイテムにはデフォルトでHTMLの記述順に順番を振ってあります。「order」を使えば、その順番を変えることができます。
    以下はorderによって、「2」と「4」の順番を交換している図解です。

    order

    ※「order」プロパティによって変えられたのはあくまでビジュアル的な順番です。実際にHTMLの構造自体を変えたことではないので、スピーチ機能やJSなどの論理的なタスクを行う上で支障が出る場合があります。

    ブラウザサポートについて

    この記事で示されている情報は全て最新の仕様を参考にしているので、Chrome以外のブラウザでは動かない場合もあるかもしれません。
    そこを考慮して、これまでの仕様変更の経緯を表にまとめたものを載せておきますので、クロスブラウザが気になる方はどうぞご参考下さい。

    最新仕様 2009仕様 2011仕様
    display: flex display: box display: flexbox
    flex-direction: row box-orient: horizontal box-orient: horizontal
    justify-content: flex-start box-pack: start box-pack: start
    align-items: flex-start box-align: start box-align: start
    flex: 1 box-flex: 1 flex: 1

    ※2014/7/14 13:00追記 タグの一部を修正させていただきました。

    まとめ

    一通り読んでいただけましたでしょうか。
    「FlexBoxはすごくない」と思う方は、恐らくいないかと思います。それだけインパクトと将来性を持っているのです!

    まだこの先、仕様変更や追加の危惧もありますが、それ以上に私たちが今まで使ってきたBoxモデルを根底から覆すような底力を秘めていることは言うまでもありません。新生デザイナー達に「あの頃は・・・。」といった話ができてしまうような未来がありありと浮かんできます!
    その日に備えて、皆さんもぜひ積極的に取り入れていこう!

この記事を書いた人

王
バックエンドエンジニア 2012年入社
LIGの王です。ウェブの全てを学ぶ為、中国は四川省より日本にやってきました。王という名に恥じぬよう、ウェブ業界のKINGとなるべく日々頑張っております。よろしくお願いいたします。

こちらもおすすめ

HTML5&CSS3標準デザイン講座

HTML5&CSS3標準デザイン講座

  • 著者草野 あけみ
  • 価格¥ 2,678(2015/11/27 23:15時点)
  • 出版日2015/11/06
  • 商品ランキング10,884位
  • 単行本(ソフトカバー)384ページ
  • ISBN-104798142204
  • ISBN-139784798142203
  • 出版社翔泳社