krzm.jp
黒住浩司 Webサイト

フレキシブルボックスレイアウトの構成

内容

フレキシブルボックス化

さて、こうしたボックス構造とフロート指定ができてしまえば、フレキシブルボックスレイアウト化は至って簡単です。なぜかというに、あとはフロートコンテナにdisplayプロパティでflex値を指定し、フレックスコンテナにするだけだからです。


display:flex

IE 10は-ms-flexbox、Chromeは-webkit-flexという値になります。

フレックスコンテナの中で、子ボックス(フレックスアイテム)は、その文書の言語の、文字が流れる方向(主軸方向)に従って、配置されます。横書きの英語もしくは日本語の場合は、左から右へ、アイテムが横並びになります。

故に、contents内の配置はそのままで構いませんが、main内は向きを逆転させる必要があります。これをコンテナ側で指定するプロパティとして、flex-directionがあります。左右の流れを反転するだけなら、指定は至って簡単で、


flex-direction:row-reverse

と値を記述します。

IE 10は-ms- flex-direction:row-reverse、Chromeは-webkit- flex-direction:row-reverseと記述します。

フレキシブルボックスレイアウトの指定とは、これだけ当然ですが、フレキシブルボックスおよびフロートのいずれの場合も、今回のようなレイアウトでは、コンテナとアイテムに幅(width)の指定が必要になります。その際、アイテムの幅の総計が、コンテナの幅に一致する(もしくは収まる)ようにレイアウトを設計しなければなりません。また、div要素にはoverflow:hiddenの指定も必要です。なのです。

フレキシブルボックス指定の概略図
フレキシブルボックス指定の概略図

互換性対策

display:flexとfloatプロパティを併用した場合、最新ブラウザーではfloatは影響を与えず、IE 9以下ではdisplayプロパティのflex値やflex-directionプロパティは解釈できずに無視され、概ね双方で問題なくレイアウトが再現されるようです。しかし、「絶対大丈夫!」などという原発安全神話のような無責任なことは言えませんので、IE9以下用にCSSファイルを別途作成し、その中でコンテナ側にdisplay:blockを、アイテム側にfloatプロパティを指定して、IEコメント分岐でIE9以下用に読み込ませ、スタイルを上書きした方がよいでしょう。


<!--[if lte IE 9]>
	<link rel="stylesheet" href="CSSファイルのアドレス" type="text/css" />
<![endif]-->

上記コメント内を、IE9以下はコメントではなくHTMLコードとして認識するため、そこにlink要素を記述してIE9以下専用CSSファイルを読み込ませます。

もちろん、最新ブラウザー向けのCSSからは、floatプロパティは削除します。なお余談ですが、IEコメント分岐は、IE10の標準モードではサポートされなくなりました。

topnavへの適用

さて、主要ページのtopnav部分は、どのようにフレックス&フロート構成にすればよいのでしょうか?

topnavボタン構成図
topnavのナビゲーションボタン

このナビゲーションボタンはWordPressの「カスタムメニュー」によって生成されていますが、その実体はdiv要素、ul要素、li要素、a要素の入れ子構造です。

カスタムメニューのソースコード図

メニュー本体がul要素で、それをdiv要素topnav内の、さらにnav要素内に配置しています。この場合、コンテナになるのは、divやnav要素ではなく、ul要素であり、アイテムがli要素です。

ですから、フレックスボックス化は、ul要素にdisplay:flexを指定するだけです。フロートについては、ul要素にoverflow:hidden、li要素にfloat:leftを指定します。

なお、当サイトは、画面サイズに応じて、メディアクエリーで3つのサイズに分けていますが、各ボタン(li要素)の幅は、%単位で指定し、サイズ変更に対応させています。

ただ、ボタン数が現状では6個なので、100÷6=16.66…と割り切れません。結果として、コンテナとの間に僅かな隙間が空いてしまいます。アイテムは、デフォルトでは左寄せで配置されるので、右端に隙間が空くことになります。

これを少しでも緩和するため、アイテムの主軸方向の揃えを「中央揃え」にすることで、隙間を左右に振り分けています。アイテムの揃えは、コンテナ側に以下のプロパティで指定します。


justify-content:center;

IE 10は-ms- flex-pack:center、Chromeは-webkit- justify-content:centerと記述します。

1 2 3