flexible ボックスメモ
Firefox 18.0a(Nightly) で CSS Flexible Box Layout Module が実装されつつある。
その辺りは、FirefoxのFlexbox実装、進行中 - fragmentary 辺りを参照ってことで。
まぁともかく、about:config の値 layout.css.flexbox.enabled
を true
にすれば、少し試すことができる。
んで、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-content
とalign-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: flex
なflex 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