[css]flexboxを用いて固定+可変にする方法
メインコンテンツ + サイドバーのような構造
サイトでよく見かけるレイアウトとしてメインコンテンツ+サイドバーの2カラムのものがあると思います。
そして要素を横並びにする方法としてflexboxが挙げられるのですが、横幅の短いサイドバーの方はデザイン崩れ防止や見えやすさのためにもサイズを変えずに固定したい時があります。
そうしたflexboxを用いた状況で固定+可変のレイアウトを実現する方法をご紹介します。
コンテンツを横に並べた場合
HTML
1 2 3 4 |
<div class="flex"> <div class="main">可変</div> <aside class="side">100px固定</aside> </div> |
CSS
1 2 3 4 5 6 7 8 9 10 11 |
.flex { display: flex; } .main { flex: 1; } .side { width: 100px; } |
必要最低限のコードとなります。固定させたい方にwidth
で横幅を指定します。
しかしこのままでは固定部分を除いた残りのスペースいっぱいに可変部分が表示されません。そこで可変にしたい方にflex:1;
を指定します。
flex:数値;
と設定した場合、flex-grow:数値;
と解釈されます。flex-grow
とは、親要素(サンプルでいうと.flex
を指定した要素)に空きスペースがあった場合にflex-grow
を指定した要素(サンプルでいうと.main
を指定した要素)が他の子要素に対してどれくらい伸びるかを指定するプロパティです。
初期値はflex:0;
なので横幅いっぱいには表示されなかったというわけです。
他の方法も!
CSS
1 2 3 4 5 6 7 |
.main { width: calc(100% - 100px); } .side { width: 100px; } |
ベタではありますが、可変にしたい要素のwidth
の値を「親要素の横幅(100%) – 固定したい要素の横幅」で直接指定することでも再現可能です。ここで出てくるcalc関数
ですが、ざっと言うとCSSで演算ができる関数です。単位が異なっても利用でき、今回のような可変のコンテンツがある場合に重宝します。
擬似要素を横に並べた場合
See the Pen flexbox-flex by nanase webdesigner (@nanase-777) on CodePen.
HTML
1 |
<div class="flex-normal flex-shrink">Lorem ipsum dolor sit amet, consectetur adipisicing elit </div> |
CSS:抜粋したもの
1 2 3 4 5 6 7 8 9 |
.flex-normal { display: flex; margin-bottom: 20px; } .flex-shrink::before, .flex-shrink::after { flex-shrink: 0; } |
before/after
要素のwidth
を固定したいところですが、サンプルのようにただ並べただけでは無視され縮んでしまいます。
テキスト本体は何の要素にも囲まれていないのでCSSでの対応が不可です。となるとbefore/after
要素に対応が必要となりますがコンテンツを横に並べたパターンのようにflex:1;
では解決されません。
そんなときはflex-shrink:0;
を指定します。
flex-shrink
とは、親要素(サンプルでいうと.flex-normal
を指定した要素)にスペースが「ない」場合にflex-shrink
を指定した要素(サンプルでいうとbefore/after
要素)が他の子要素に対してどれくらい「縮む」かを指定するプロパティです。
初期値はflex-shrink:1;
なので縮んでしまったというわけです。0
に変更し縮まないようにします。
以上で、flexboxを用いて固定+可変にする方法の紹介を終わります。他にも見つけ次第、追加していこうと思います。