〜天下一縦横中央寄せCSS決定戦〜
2015.12.15 @yoshiko_pg
よしこ @yoshiko_pg
HTML5/CSS3 モダンコーディング という本を出しました
好評発売中!電子版もあるよ!
それぞれのメリット・デメリットを知ることで
あなた好みのベストプラクティスを心のなかに
<div class="outer">
<div class="inner">
ほげほげほげほげ
<br>
ふがふが
</div>
</div>
outerの中でinnerを縦横中央寄せしたい!
.outer {
position: relative; /* or absolute, fixed */
}
.inner {
width: 200px;
height: 200px;
position: absolute;
left: 50%;
top: 50%;
margin-left: -100px; /* width / 2 */
margin-top: -100px; /* height / 2 */
}
.outer {
position: relative; /* or absolute, fixed */
}
.inner {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
これ認識してませんでした、めっちゃ役立ちました!
.outer {
position: relative; /* or absolute, fixed */
}
.inner {
width: 200px;
height: 200px;
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
margin: auto;
}
W3C Visual formatting model details
10.3.7 Absolutely positioned, non-replaced elements
日本語訳:視覚整形モデル詳細
10.3.7 絶対配置される非置換要素の場合
'left' + 'margin-left' + 'border-left-width' + 'padding-left'
+ 'width' + 'padding-right' + 'border-right-width'
+ 'margin-right' + 'right' = width of containing block
'left'、'width'、'right'の3つすべてが'auto'である場合:(省略)
この3つが'auto'でない場合:'margin-left'および'margin-right'の両方が'auto'である場合、2つのマージンが等しい値を得る追加条件の下で式を解く。
left、width、rightがすべてauto以外で、margin-leftとmargin-rightの両方がautoの場合は両側のmarginが同じ幅になる!→コンテンツが中央に配置される!
縦方向についても同様です。
top, right, bottom, leftに0を指定していた理由:
値を初期値のauto以外の何かにする必要があった!
(なので対になる値が等しければ0以外でもOK)
<div class="outer">
<div class="cell">
<div class="inner">ほげほげほげほげ<br>ふがふが</div>
</div>
</div>
.outer {
display: table;
}
.cell {
display: table-cell;
vertical-align: middle;
text-align: center;
}
.inner {
display: inline-block; /* or width & margin: auto; */
}
.outer {
display: flex;
justify-content: center;
align-items: center;
}
IE10は古い仕様(-ms-flexbox)なので何かしらの変換ツールをかませる必要がある。仕様の遷移
IE11は一応いけることになってるけどcan i useのknown issuesだけでもそこそこある・・・
negative margin | transform | offsets + auto | table-cell | flex | |
---|---|---|---|---|---|
.outerサイズ可変 | ◯ | ◯ | ◯ | ◯ | ◯ |
.innerサイズ可変 | ✕ | ◯ | ✕ | ◯ | ◯ |
.outerが.innerの 大きさを下回る |
◯ | ◯ | ✕ | 不可能 | ◯ |
その他 | .innerのサイズが marginの値に影響 |
対応ブラウザと Offsetの値に注意 |
要素3つ | モダンブラウザのみ |
私はモダンブラウザならflex、それ以外をサポートする必要があるならtransformで書いてます。
www.wantedly.com/projects/16402
1月から新フロア増床!オフィスにあそびにきてね!
heightと同じ高さをline-heightに指定すると楽
.button {
width: 200px;
height: 70px;
line-height: 70px; /* 縦方向 */
text-align: center; /* 横方向 */
}
複数行は不可。ボタンとかで便利
◀ Page 1 of 40 ▶