まず、下記のように子アイテムを用意
TEST
これを内包する親領域のフレックスボックスを作成 (width: 320px;height: 160px;)
TEST
TEST
TEST
子アイテムのマージンを「 auto 」にすると、子アイテムが中央揃えになる。
TEST
TEST
TEST
※親要素の高さを指定しない場合は、上下の位置は上下の「margin」「padding」の設定となるだけなのであまり悩むことはないのですが・・・ 親要素の高さが指定されている場合は、Flexbox ならば、マージンを auto にしておけば、余白が自動調整される=上下左右とも中央に均等に寄るようになるわけです。
Flexbox では、左右方向の位置揃えは、「 text-align 」ではなく、「 justify-content 」を使うとより自由度が高い設定が可能となります。「 space-between 」を指定
TEST
TEST
TEST
.parent {justify-content:space-between;}
.parent .item{margin-top:auto;margin-bottom:auto;}
justify-contentオプション
centerアイテムを中央に寄せる
startアイテムを先頭に寄せる
endアイテムを末尾に寄せる
flex-startフレックスアイテムを先頭に寄せる
flex-endフレックスアイテムを末尾に寄せる
leftアイテムを左端に寄せる
rightアイテムを右端に寄せる
space-between残り余白の均等割り
space-around左右余白 + 均等割り
おや、しかし、ここで問題が。子アイテムの位置は上下左右とも中央に寄りましたが、中のテキストが端に行ってます。これも中央にもってきたい。
(ここでまた、「texst-align 」「vertical-align」が効かない問題が出てくる。)
「margin:auto;」は子アイテムのマージン(余白)を調整するものなので、子アイテムの中の要素は関係ない。
では上でやったのと同様に、中の要素にもマージンを指定すれば・・・と思ったら、中の要素がブロック要素なら可能ですが、テキストはインライン要素なので縦方向のマージンが設定できない...
では中の要素をブロック化、はテキストなのでできないので、中のテキストをさらに囲ってブロック化してしまえば・・・
TEST
TEST
TEST
一応、できました。
(分かりやすく中のブロックにも枠線を指定しています。)
ただ、これだと三重箱状態になる。。。。
※ただ、IE11ではできていない模様・・・何故だ???
⇒結論→諦めるしかない?
「margin:autoで上下左右とも中央寄せされる」が正しい解釈なのですが、IEではここの表示が正しくされないようです。
解決方法はないかと思いきや、ありました。
↓↓↓ ↓↓↓
実は、「 justify-content 」と同様に、上下方向の位置を調整するスタイル指定が Flexbox には用意されていました。
「 justify-content 」は横方向の配置をフレキシブルに調整してくれるもの、対して、縦方向の位置の設定は⇒「 align-items 」で設定します。
これだと、子アイテムの中のテキストの位置も指定できます。(子アイテムの display にも Flex を指定する必要がある。)
つまり、以下の3つの指定を親要素にも子要素にも設定してやれば、子アイテムの中身を再度囲わなくても、全部中央寄りの設定が可能というわけですね
display: flex;
justify-content: space-around;
align-items: center;
center
アイテムを中央に寄せる
start
アイテムを先頭に寄せる
end
アイテムを末尾に寄せる
flex-start
フレックスアイテムを先頭に寄せる
flex-end
フレックスアイテムを末尾に寄せる
left
アイテムを左端に寄せる
right
アイテムを右端に寄せる
space-between
残り余白の均等割り
space-around
左右余白 + 均等割り
TEST
TEST
TEST
TEST
TEST
TEST
IE11で失敗していた上下中央寄せが、これで成功します。
コメント