これからのCSSレイアウトはFlexboxで決まり!

thumb_flex

FlexboxとはFlexible Box Layout Moduleのことで、その名の通りフレキシブルで簡単にレイアウトが組めちゃう素敵ボックスです。前々からあった技術ですが、ブラウザーによって書き方が違ったり、仕様がころころ変わったりと、イマイチ一歩踏み出せない感があったFlexbox。しかしようやくモダンブラウザーでの利用に難がなくなり、実務にも充分使えるようになりました。今回はそんなFlexboxの魅力と使いドコロを、デモ付きで紹介していこうと思います!

対応ブラウザー

browser-support
Can I use…で紹介されているように、現行のモダンブラウザーでは問題なく利用できます。ただし、Safari用に -webkit- のベンダープレフィックスが必要です。IEについては11から正式に対応。IE10にも対応していますが、書き方が少し変わってくるようで、今回は省略します。

追記:JavaScriptを使って古いIEにも対応させる方法もあります。→ IE8・9にもFlexboxを対応させる、flexibility.jsがとっても便利!

日本のブラウザーシェアのグラフ
ちなみに2015年1月の、日本のブラウザーシェアでは1位がIE11で29.64%を占めています。Flexboxに対応していないIE9は3.91%。これからも増えることはないと思うので、サイトによっては切り捨ててもいいかもしれません。

Flexboxの素敵なところ

今までは様々なプロパティーを組み合わせたり、JavaScriptに頼っていたような配置方法も、Flexboxなら簡単に実装できます。例えば…

  • CSSを一行プラスするだけで横並びにできる!
  • 横並びになった要素の高さが最初から揃ってる!
  • 要素を上下左右、好きな順序に並び替えられる!
  • スペースの操作も自由自在!
  • 高さの異なる横並びの要素を、簡単に上下中央揃え!

実際にどうなるのか見てみよう

利点をあげても、実際に見てみないとすごさはわからないと思うので、さっそく作っていきましょう。まずは元となるナビゲーションメニューを作成します。

HTML

<nav>
  <ul class="main-nav">
    <li><a href="#" class="logo">Logo</a></li>
    <li><a href="#">Menu 1</a></li>
    <li><a href="#">Menu 2</a></li>
    <li><a href="#">Menu 3</a></li>
    <li><a href="#">Menu 4</a></li>
  </ul>
</nav>

CSS

.main-nav a {
  margin: 10px;
  border-radius: 5px;
  background: #60B99A;
  color: #fff;
  display: block;
  padding: 15px;
  text-decoration: none;
}
.main-nav .logo {
  background: #4584b1;
}

デフォルトメニュー
こんな感じのメニュー。色やマージン等の設定のみで、まだ特に変わったことはしてません。

そんな素朴なナビゲーションメニューですが、メニューアイテムを包む .main-nav 要素に display: flex; を加えると…

.main-nav {
  display: flex;
}

See the Pen Flexbox basic navigation by Mana (@manabox) on CodePen.


横並びになりました!簡単すぎる!

要素のスペースを自在に操ろう

justify-content プロパティーで、要素と要素の間や、表示位置をカスタマイズできます。値を space-between とすると、最初の要素が左端に、最後の要素が右端に移動し、その間の要素は等間隔に並べられます。

.main-nav {
  display: flex;
  justify-content: space-between;
}

See the Pen Flexbox basic navigation – equal space by Mana (@manabox) on CodePen.

右寄せ

値を flex-end にすると、要素が右端に並びます。

.main-nav {
  display: flex;
  justify-content: flex-end;
}

See the Pen Flexbox basic navigation – flex-end by Mana (@manabox) on CodePen.

中央揃え

center で中央揃え。floatposition を駆使して中央揃えしていた時代が嘘みたいです。

.main-nav {
  display: flex;
  justify-content: center;
}

See the Pen Flexbox basic navigation – center by Mana (@manabox) on CodePen.

ロゴだけ左端に、メニューアイテムは右側に

上記例だとロゴもナビゲーションメニューも同等の扱いとなっていますが、ロゴは左に、メニューは右に置くという、標準的な配置をしてみましょう。ロゴを囲んでいるのはリストの最初の要素。ということで、:first-child セレクターで最初の要素を指定し、margin-right: auto; を加えます。

.main-nav {
  display: flex;
}
.main-nav li:first-child {
  margin-right: auto;
}

See the Pen Flexbox basic navigation – logo and menu items by Mana (@manabox) on CodePen.


1〜2行のCSSを加えるだけで、ここまで簡単に配置方法を変更できるようになりました!少しずつFlexboxの手軽さをつかめてきたと思います。

コンテンツ部分にも使ってみよう

先ほどデモで作成したナビゲーションメニューに、コンテンツとして3つの section を加えました。

HTML

<div class="main">
  <section class="col-1">
    <h1>Column 1</h1>
    <p>Lorem ipsum dolor sit amet...</p>
  </section>
  <section class="col-2">
    <h1>Column 2</h1>
    <p>Morbi non semper sapien...</p>
    <p>Integer vel pellentesque elit...</p>
  </section>
  <section class="col-3">
    <h1>Column 3</h1>
    <p>Integer commodo...</p>
  </section>
</div>

CSS

.main section {
  margin: 10px;
  border-radius: 5px;
  background: #F5F0CF;
  padding: 15px;
}
.main h1 {
  color: #E6AC27;
  font-size: 1.5rem;
}
.main p {
  margin-top: 10px;
}

contents-default
こんな感じにCSSで簡単に装飾。

続いて、ナビゲーションと同様、コンテンツ部分の3つのカラムも横並びにしたいので .main クラスにも display: flex; を加えましょう。

.main {
  display: flex;
}

contents-flex
横並びになりました。Flexboxの利点として、高さの異なるボックスが並んでも、このように自動的に一番長いボックスに合わせて高さをあわせてくれる機能があります。これまでは様々なハックを使って揃えてましたよね…。

しかしこのままではカラム1〜3の横幅が揃っていません。なので flex プロパティーを使って横幅をコントロールしましょう。flex プロパティーは flex-growflex-shrinkflex-basis という3つのプロパティーのショートハンド。個別に指定することも、省略することも可能です。ここでは flex-grow の機能として、要素を利用可能な領域いっぱいに等倍で並べる指定をします。

.main section {
  flex: 1;
}

See the Pen Flexbox flex-grow by Mana (@manabox) on CodePen.


横幅が揃いました。
IE11にはショートハンドではなく flex-grow: 1; とすればOK。

横幅の比率を変更する

上記例だと、2番目のカラムだけ文章が多くてなんだか不格好。という事で、2番目のカラムの横幅は他より広くしてバランスをとりましょう。2番目のカラムにのみ flex: 2; を指定し、他のカラムの2倍の横幅になるようにします。

.main .col-2 {
  flex: 2;
}

See the Pen Flexbox flex-grow 2 by Mana (@manabox) on CodePen.


うまくバランスがとれました。

高さの異なる要素を垂直に中央揃え

以前は実装に悩まされたという人も少なくないであろう、垂直に中央揃え。Flexboxを使えば、これも一行で解決です。使用するプロパティーは align-items 。サムネイル画像の配置なんかに使えそう。

.main {
  align-items: center;
}

See the Pen Flexbox vertical center by Mana (@manabox) on CodePen.


他にも flex-end で下揃えにしたり、baseline でベースラインを揃えたりできます。

モバイル対応もこんなに簡単!

レスポンシブ非対応のFlexbox
このままだと、上記画像のように画面の横幅を変更するとコンテンツが長細くなってかなり見にくいですね。モバイル端末での閲覧も考慮し、メディアクエリーを使ってレスポンシブレイアウトに対応させましょう。

flex-direction は、要素の配置方向を指定するプロパティー。デフォルト値は row で、左から右の横並びが指定されていますが、ここでは column を使って「横幅が700px以下になったら横並びから縦並びに変更する」指定をします。

@media screen and (max-width: 700px) {
  .main {
    flex-direction: column;
  }
}

↓デモ画面右上の「Edit on CODEPEN」をクリックで、デモを別タブ表示できます。画面サイズを変更してお試しください。

See the Pen Responsive Flexbox by Mana (@manabox) on CodePen.

レスポンシブ対応のFlexbox
横幅が狭くなると縦並びに変更されました。flex-direction プロパティーは他にも reverse で逆並びにしたり、column-reverse で縦に逆並びなんかもできちゃいます。


FloatやClearfixを駆使してナビゲーションを横並びにしていたのがまるで遠い昔のことのよう。レスポンシブ対応もゴッチャゴチャになりがちでしたが、これからは今回紹介したFlexboxを使った方法が主流となってCSSでレイアウトを組んでいくことになりそうです。使い方を覚えて、慣れるまでには少し時間がかかるかもしれませんが、記事内で紹介しているすべてのデモはCODEPENというコード共有サービスを利用して表示しているので、アカウントをお持ちの方はぜひ上記デモをフォークしてカスタマイズしたりいじくりまわして慣れていってください!私のCODEPENアカウントもお気軽にフォローしてくださいね ;)

シェアする

コメント

  • 西村直美

    とてもシンプルなコードになっていて参考になります!
    flex-direction についてですが、IE11では高さにバグがあるのか適応されませんでした。
    対処法があれば教えていただきたいです><

  • http://webcreatorbox.com Webクリエイターボックス

    flex-direction ではなく、flex: 1 とかの部分のバグかなーと思うのですがいかがでしょう?だとしたら記載の通り、ショートハンドではなく flex-grow: 1; とすればOKです。

  • Ten Gusi

    codepenにあるコードを使って実際やってみましたが、Logoが左端に寄りません。

  • yamyam

    すごい役に立つ情報でした!ありがとうございました。
    しかしIE11だとcolumnで縦にしたときに中身の文章が重なってしまい残念でした。
    回避方法ありましたら教えてください・・・お願いします。

  • http://webcreatorbox.com Webクリエイターボックス

    flex: 1; を使ってるところですか?だとしたら記載の通り、また下記コメントの通り、ショートハンドではなく flex-grow: 1; とすればOKです。IE用に書かなきゃかもですねー。

  • yamyam

    なるほど!わざわざありがとうございました
    試してみます!