flexible ボックスメモ

Firefox 18.0a(Nightly) で CSS Flexible Box Layout Module が実装されつつある。
その辺りは、FirefoxのFlexbox実装、進行中 - fragmentary 辺りを参照ってことで。

まぁともかく、about:config の値 layout.css.flexbox.enabledtrue にすれば、少し試すことができる。

んで、Using CSS flexible boxes - CSS | MDN を読みつつ勉強。そのメモをば。

flex container

display: flex; な要素。その子要素がflex itemとなり、フレキシブルなレイアウトを実現する。

レイアウトには主軸(main axis)となる方向がある。上図では横方向(row)のレイアウトになっている。この方向を決めるのが、flex-directionプロパティ。

  • flex-direction: rowなら上図の様に子要素は横並びに配置
  • flex-direction: columnなら縦並びになる。上図とは違い、main axisは縦、cross axisは横になる。


そして、主軸(main axis)に対して直行する軸がcross axis。この主軸と直行軸に対して子要素(flex item)をどう配置するかを決めるのが、justify-contentalign-items

あっと忘れてた。画像のHTMLの基本は以下の様なものでCSSを少し変更しつつ進めて行く。

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>Flexbox</title>
  <style>
  .flex {
    display: flex;
    /*flex-direction: row;*/
    /*justify-content: space-around;*/
    /*align-items: baseline;*/
    height: 100px; background-color: silver; border: thin dashed black;;
  }
  .flex > div {
    padding-left: 5px; padding-right: 5px;
    background-color: #eebb55; border: thin solid black;
    border-radius: 10px;
  }
  .flex > div > p { text-align: center; } h1, p { margin: 0; }
  </style>
</head>
<body>
<h1>Flexbox - n</h1>
<pre><!-- ... --></pre>
<div class="flex">
  <div id="flexitem1"><p>flex item<br>1</p></div>
  <div id="flexitem2"><p>flex item<br>2</p></div>
  <div id="flexitem3"><p>flex item<br>3</p></div>
  <div id="flexitem4"><p>flex item<br>4</p></div>
</div>
</body>
</html>
flex-direction

指定できるのは以下のとおり

row
主軸は横方向になる
column
主軸は縦方向になる
row-reverse
主軸は横方向になり、flex itemの並び順が逆になる
column-reverse
主軸は縦方向になり、flex itemの並び順が逆になる
justify-content

主軸、つまりflex-directionの軸に対してのレイアウト方法
各画像は、flex-direction: row時のもの

flex-start
デフォルト値。横方向なら左隅から、縦方向なら上隅からレイアウトが開始される(画像は Fig 2を参照)
flex-end
flex-startの逆。横方向なら右隅から、縦方向なら下隅から
center
中央配置
space-between
両端に沿うように配置し、間を等間隔になるように配置(?)
space-around
それぞれのflex itemを等間隔になるように配置
space-betweenと違い、両端も含めて均等配置となる(画像が分かり難いが、両端に少しスペースがあることに注目)


align-items

直行軸、つまりflex-direcitonに直行する軸に対してのレイアウト方法

stretch
デフォルト値。直行軸に対して可能な限り伸縮(?)
flex-start
始端位置((cross start)配置され、伸縮なし
flex-end
終端位置(cross end)に配置され、伸縮なし
center
中央位置に配置され、伸縮なし
baseline
flex itemのbaselineが合うように配置される


flex item

先ほどまでは、display: flexflex container側のスタイルを変えてきた。今度は、その子要素側のスタイルを変えていく。

flex item 側に設定するCSSプロパティはだいたい以下のとおり

  • align-self
  • flex (flex-grow, flex-shrink, flex-basis の集合)
    • flex-grow
    • flex-shrink
    • flex-basis
  • order
align-self

このプロパティは、align-itemsを上書きして、個々に直行軸(cross axis)に対してレイアウトを指定するもの。よって指定する値は、align-itemsと同一である。

一点違うのは、デフォルト値がautoである点で、これは親のalign-itemsを引き継ぐ、または無視低の場合はstretchになる点。

flex

flex-grow, flex-shrink, flex-basis の値を指定する

重要なのは、flex-growの値で、主軸(main axis)の大きさの比率を数値で書く。デフォルト値の0なら大きさの変化は無し。まぁこの値が flexible box の flexible たる所以とも言えるだろう。

画像(Fix 14)では、#flexitem1#flexitem2の幅がだいたい 2 : 1 になる*1

flex-basisはボックスの大きさの初期値を入れるのだが、イマイチ使い方が分からない。また、さらに謎なのはflex-shrinkで何がどう変わるのやら...

order

flex itemの並び順を制御するプロパティ。画像(Fix 15)では "flex item 2" のボックスが2番目にあることに注目。

以上、分かった範囲で書いてみたよ。

最後

今までは、ボックスを横に並べるのにfloatを使っていたが、あくまで回り込みであって本当に横に並ぶか不確かなものだったし制御し難いものがあったと思う。これが、flexible boxによって簡単に制御できるようになれば、Webデザインの手法がガラリと変わるのではないかと思う次第。

justify-content: centerまたはalign-items: centerでボックスの中央配置というレイアウトも簡単にできるし、いろいろ幅が広がるんじゃないかなあ。

:wq

*1:伸縮の大きさは、元々のボックスの大きさから計算されるらしく完全に比率に合致する値にはならない様子。flex-basisの値をきちんと指定すると結構合うのだが...。