[CSS]Flexboxのこれが知りたかった!今まで出来なかったことがシンプルで簡単に実装できるスタイルシートのまとめ
Post on:2016年2月17日
sponsorsr
今まで出来なかったこと、かなり複雑なコードでスクリプトを併用しないと実装できなかったことをシンプルなHTMLとCSSで実装するFlexboxのテクニックを紹介します。

Solved by Flexbox
Solved by Flexbox -GitHub
各コードの対応ブラウザは、Flexboxを使用しているため下記の通りです。
- Chrome 21+
- Opera 12.1+
- Firefox 22+
- Safari 6.1+
- IE 10+
コードのライセンスはMITライセンスです。
- 「clearfix」「overflow: hidden」から卒業
- 高さが分からないフッタを常に最下部に表示
- 高さが分からない要素を天地左右の中央に配置
- レスポンシブ対応の3カラムをシンプルなコードで実装
- Flexboxを使った柔軟なグリッド
- 入力フィールドとボタンの高さを揃えて、くっつけて配置
「clearfix」「overflow: hidden」から卒業
Flexboxは複数のアイテムをコンテナ内に水平・垂直に一列に配置することができ、順番を変更するのも簡単です。テキストが画像に回り込むレイアウトなども、Flexboxでは簡単でシンプルなコードで実装できます。

HTML
画像とテキスト、あとはコンテナだけのシンプルなコードです。
| 1 2 3 4 | <div class="Media">   <img class="Media-figure" src="" alt="">   <p class="Media-body">…</p> </div> | 
CSS
「display: flex;」を指定し、「align-items: flex-start;」でコンテナの始点に配置させます。
| 1 2 3 4 5 6 7 8 9 10 11 12 | .Media {   display: flex;   align-items: flex-start; } .Media-figure {   margin-right: 1em; } .Media-body {   flex: 1; } | 
Flexboxの各プロパティの使い方は、下記を参考に。
高さが分からないフッタを常に最下部に表示
フッタの表示をコンテンツの量が少なくても、常に最下部に表示します。
Flexboxを使わないテクニックではフッタに高さを指定しないと機能しませんでしたが、Flexboxを使うと高さが不明でも機能します。
参考: フッタの表示をコンテンツ量が少ない時は最下部に固定、多い時は成り行きにするシンプルなテクニック

Sticky Footer
※コンテンツの量を少なくする時は、「Toggle Contetns」をクリックしてください。
source -GitHub
HTML
ヘッダ・コンテンツ・フッタのシンプルな構造です。
| 1 2 3 4 5 | <body class="Site">   <header>…</header>   <main class="Site-content">…</main>   <footer>…</footer> </body> | 
CSS
全体をViewport Heightで指定し、Flexboxでフッタを配置します。
参考: ビューポート(vw, vh)とパーセント(%)、レスポンシブに適した単位の賢い使い分け方法
| 1 2 3 4 5 6 7 8 9 | .Site {   display: flex;   min-height: 100vh;   flex-direction: column; } .Site-content {   flex: 1; } | 
高さが分からない要素を天地左右の中央に配置
高さが分からない要素を外側の容器の高さが不明でも天地左右の中央に配置します。

Vertical Centering
source -GitHub
HTML
.Alignerは天地左右の中央、.Aligner-item--topは上付き、.
Aligner-item--bottomは下付きです。
| 1 2 3 4 5 | <div class="Aligner">   <div class="Aligner-item Aligner-item--top">…</div>   <div class="Aligner-item">…</div>   <div class="Aligner-item Aligner-item--bottom">…</div> </div> | 
CSS
IE10+であれば、これが一番確実でシンプルです。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | .Aligner { /* 天地左右の中央 */   display: flex;   align-items: center;   justify-content: center; } .Aligner-item {   max-width: 50%; } .Aligner-item--top { /* 上付き */   align-self: flex-start; } .Aligner-item--bottom { /* 下付き */   align-self: flex-end; } | 
要素をビューポートの天地左右の中央に配置したい場合は、下記を参考に。
レスポンシブ対応の3カラムをシンプルなコードで実装
3カラム、左からメニュー、コンテンツ、広告スペースなどのレイアウトは、Flexbox以前は完璧な解決方法はありませんでした。

Holy Grail Layout
source -GitHub
3カラムの条件
- サイドバーは固定で、コンテンツは可変。
- コンテンツのコードが、HTMLソースで最初に記述。
- 3つのカラムの高さは、最も高いものに揃える。
- マークアップは最小で。
- コンテンツが少ない時、フッタはページの最下部に表示。
HTML
HTMLは非常にシンプルで、3カラムの中でコンテンツが最初に記述されます。
| 1 2 3 4 5 6 7 8 9 | <body class="HolyGrail">   <header>…</header>   <div class="HolyGrail-body">     <main class="HolyGrail-content">…</main>     <nav class="HolyGrail-nav">…</nav>     <aside class="HolyGrail-ads">…</aside>   </div>   <footer>…</footer> </body> | 
CSS
まずは、フッタの表示をコンテンツが少ない時でも最下部に表示されるように指定。
| 1 2 3 4 5 6 7 8 9 10 | .HolyGrail {   display: flex;   min-height: 100vh;   flex-direction: column; } .HolyGrail-body {   display: flex;   flex: 1; } | 
3カラムはコンテンツを可変に、3つのカラムの高さを揃えます。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | .HolyGrail-content {   flex: 1; } .HolyGrail-nav, .HolyGrail-ads {   /* 12em is the width of the columns */   flex: 0 0 12em; } .HolyGrail-nav {   /* put the nav on the left */   order: -1; } | 
ついでに、レスポンシブ対応にしましょう。
モバイルファーストでスマホ用からレイアウトします。スマホ時には3カラムの表示を上から順にメニュー、コンテンツ、広告スペースにします。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | .HolyGrail, .HolyGrail-body {   display: flex;   flex-direction: column; } .HolyGrail-nav {   order: -1; } @media (min-width: 768px) {   .HolyGrail-body {     flex-direction: row;     flex: 1;   }   .HolyGrail-content {     flex: 1;   }   .HolyGrail-nav, .HolyGrail-ads {     /* 12em is the width of the columns */     flex: 0 0 12em;   } } | 
Flexboxを使った柔軟なグリッド
Flexboxを使って、柔軟なグリッドを実装します。

Simpler Grid System
source -GitHub
HTML
Flexboxを使ったグリッドの基本構成は、アイテムとそれらを内包するコンテナです。
| 1 2 3 4 5 | <div class="Grid">   <div class="Grid-cell">…</div>   <div class="Grid-cell">…</div>   <div class="Grid-cell">…</div> </div> | 
CSS
ベースとなるグリッドシステムです。
| 1 2 3 4 5 6 7 | .Grid {   display: flex; } .Grid-cell {   flex: 1; } | 
Flexboxではさまざまなプロパティが用意されており、溝や順番や配置を簡単に指定できます。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | /* With gutters */ .Grid--gutters {   margin: -1em 0 0 -1em; } .Grid--gutters > .Grid-cell {   padding: 1em 0 0 1em; } /* Alignment per row */ .Grid--top {   align-items: flex-start; } .Grid--bottom {   align-items: flex-end; } .Grid--center {   align-items: center; } /* Alignment per cell */ .Grid-cell--top {   align-self: flex-start; } .Grid-cell--bottom {   align-self: flex-end; } .Grid-cell--center {   align-self: center; } | 
レスポンシブ対応も非常に簡単です。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | /* Base classes for all media */ .Grid--fit > .Grid-cell {   flex: 1; } .Grid--full > .Grid-cell {   flex: 0 0 100%; } .Grid--1of2 > .Grid-cell {   flex: 0 0 50% } .Grid--1of3 > .Grid-cell {   flex: 0 0 33.3333% } .Grid--1of4 > .Grid-cell {   flex: 0 0 25% } /* Small to medium screens */ @media (min-width: 24em) {   .small-Grid--fit > .Grid-cell {     flex: 1;   }   .small-Grid--full > .Grid-cell {     flex: 0 0 100%;   }   .small-Grid--1of2 > .Grid-cell {     flex: 0 0 50%   }   .small-Grid--1of3 > .Grid-cell {     flex: 0 0 33.3333%   }   .small-Grid--1of4 > .Grid-cell {     flex: 0 0 25%   } } /* Large screens */ @media (min-width: 48em) {   .large-Grid--fit > .Grid-cell {     flex: 1;   }   .large-Grid--full > .Grid-cell {     flex: 0 0 100%;   }   .large-Grid--1of2 > .Grid-cell {     flex: 0 0 50%   }   .large-Grid--1of3 > .Grid-cell {     flex: 0 0 33.3333%   }   .large-Grid--1of4 > .Grid-cell {     flex: 0 0 25%   } } | 
Flexboxの各プロパティの使い方は、下記を参考に。
入力フィールドとボタンの高さを揃えて、くっつけて配置
フルサイズの可変で、しかも高さが揃った入力フィールドとボタンのセットを実装することは、今まで不可能でした。しかし、Flexboxを使うと、驚くほどシンプルなコードでこれを実装できます。

HTML
入力フィールドとボタンはどちらが前で後ろでも前後でも、同じ高さで実装できます。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <!-- appending --> <div class="InputAddOn">   <input class="InputAddOn-field">   <button class="InputAddOn-item">…</button> </div> <!-- prepending --> <div class="InputAddOn">   <span class="InputAddOn-item">…</span>   <input class="InputAddOn-field"> </div> <!-- both --> <div class="InputAddOn">   <span class="InputAddOn-item">…</span>   <input class="InputAddOn-field">   <button class="InputAddOn-item">…</button> </div> | 
CSS
スタイルシートは非常にシンプルです。あとは入力フィールドとボタンのスタイルを指定してください。
| 1 2 3 4 5 6 7 8 9 10 11 12 | .InputAddOn {   display: flex; } .InputAddOn-field {   flex: 1;   /* 入力フィールドのスタイル */ } .InputAddOn-item {   /* ボタンのスタイル */ } | 
sponsors















