こんにちは。CSS 触ってますか?CSS って世界で一番設計が難しいプログラム言語ですよね。
今回は CSS で上下左右中央揃えをする為の方法を5パターン用意してみました。画面の表示はまったく一緒なのにやり方が5つもあるんてなんて素敵な言語でしょうか。
<style>
.wrap {}
.box {}
</style>
<div class="wrap">
<div class="box">
May the center be with you.
</div>
</div>
こちらの HTML をベースにご紹介していきます。
最近の主流のやり方
<style>
.wrap {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
}
</style>
<div class="wrap">
<div class="box">
May the center be with you.
</div>
</div>
最近主流のやり方はこれですね。 display: flex;
に対していくつかのスタイルを適応させて、上下左右中央揃えを実現しています。コンテンツの中身に依らず使えるので、覚えておいて損はないと思います。
ふた昔ぐらい前のやり方
<style>
.wrap {
display: table;
height: 100vh;
width: 100vw;
}
.box {
display: table-cell;
vertical-align: middle;
text-align: center;
}
</style>
<div class="wrap">
<div class="box">
May the center be with you.
</div>
</div>
そこそこ前のやり方だと、こうですね。 display: table-cell;
を使うことで上下の中央を指定できるようになるので、ちょっとむりやりですが、上下左右中央揃えを実現できています。
シンプルだけど使用用途は限られるやり方
<style>
.box {
line-height: 100vh;
text-align: center;
}
</style>
<div class="wrap">
<div class="box">
May the center be with you.
</div>
</div>
これが一番短く上下左右中央揃えを実現できるやり方ですね。 line-height: 100vh;
で行の高さを画面いっぱいにする事で可能にしています。逆に言えば、中身のコンテンツ次第では実現は出来なくなるので、要注意ですね。
CSS の仕様と利用したやり方
<style>
.wrap {
position: relative;
height: 100vh;
}
.box {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
margin: auto;
width: 100%;
height: 1rem;
text-align: center;
}
</style>
<div class="wrap">
<div class="box">
May the center be with you.
</div>
</div>
こちらは CSS の仕様と利用したやり方ですね。top, right, bottom, left に 0 を指定して margin に auto を指定すると実現できます。何故かと言われれば、そういうものだからという回答になります。
比較的新しいやり方
<style>
.wrap {
position: relative;
height: 100vh;
}
.box {
position: absolute;
top: 50%;
left: 50%;
transform: translateX(-50%) translateY(-50%);
-webkit-transform: translateX(-50%) translateY(-50%);
}
</style>
<div class="wrap">
<div class="box">
May the center be with you.
</div>
</div>
こちらは transform
を利用したやり方になっています。top と left に 50% を指定して、ブロックの左上を中央にした後に transform
で調整してブロックを真ん中に持っていく方法になっています。
おわりに
いやぁー画面の表示はまったく一緒なのにやり方が5つもあるんてなんて素敵な言語なんでしょう(2回目)ちなみにWeb屋になってもう十数年ですが、いまだに「キレイに CSS の設計ができた!」って思えた事はないです。まだまだ奥が深いですね…!