ホームページ制作 オフィスオバタ

fixedで指定したCSSを縦横中央寄席にしてみた

スタイルシートで、縦横中央寄席はよくありますが、いざ設定してみようとするとなかなかうまくいきません。

横中央揃えならともかく、縦中央が特に難しいです。
なぜならば、スタイルシートに標準で縦中央揃えする指定がないためです。

こんかいさらに、fixed指定のボックスを縦横中央に揃える事例がありました。
なかなかうまくできなかったのですが、ググって調べ、うまくできました。

忘備録として記録いたします。

何も考えずにやってみたらずれました。

まずはどうすればよいかわからなかったため、TOP、LEFTを50%指定でやってみました。
するとこのようになりました。

サンプルはこちらです。

なんか微妙にずれています。
cssの記述はこのような感じです。

.box 
{
	background-color: #F00;
	line-height: 100px;
	text-align: center;
	vertical-align: middle;

	position: fixed;
	height: 100px;
	width: 400px;
	left: 50%;
	top: 50%;
}

50%指定していてもなぜずれるのでしょうか?

原因は記述しているBOXサイズの分を考慮していないため

サンプルのボックスは横400px 縦100px あります。
例えば、横2000px 縦1000pxの場合、ボックスサイズを考慮し、次のように指定しなければいけません。

left: 800px;
top: 450px;

ところが、縦横50%指定すると次のような指定になってしまいます。

left:1000px;
top:500px;

横200px 縦50pxずれることになります。
だから真ん中によっていなかったのです。

これを何とかするためには、ボックスサイズの分を反映しなければいけません。
しかし、ウィンドウサイズは一定でないため、%指定しなければいけません。
%指定に対してピクセルで調整することはできるのでしょうか?

この部分でつまづきましたが、ググって調べて対処することができました。

縦横中央寄せする3つの方法

幅を%指定しつつ、ピクセル単位で調整する方法をググったところ、以下の3つの方法があることがわかりました。

3つの方法とも同じ結果が得られます。
これらの方法について記載いたします。

(1)transformで指定する方法

transform指定は、図形を回転させたり、x軸y軸へ位置をずらしたりすることができます。
transformを指定して中央寄せしたサンプルがこちらです。

ソースはこちら


<!doctype html>
<html>
<head>
<meta charset="shift_jis">
<title>fixed 中央寄せ</title>
<style type="text/css">
body
{
	text-align: center;
}
.box 
{
	background-color: #6C6;
	line-height: 100px;
	text-align: center;
	vertical-align: middle;

	position: fixed;
	height: 100px;
	width: 400px;
	left: 50%;
	top: 50%;
	transform: translateX(-50%) translateY(-50%);

}
</style>
</head>

<body>
<p>transform を使用して位置調整</p>
<div class="box">box</div>

</body>
</html>

失敗した例にtransform1行足すことで実現できました。

仕組み

left top指定で、ボックスを画面の50%位置へ配置します。
translateX、translateYで、ボックスの50%サイズずらします。

ボックスサイズの半分をずらすことで、ぴったり中央寄せになります。
-50%の代わりに、ピクセル指定でもOKですがここは%指定のほうが汎用性があります。

(2)calcで指定する方法

calcはスタイルシート記述で計算ができる命令です。
特色は、単位が違っていてもピクセルに変換して実行してくれます。

この特性を利用して%とピクセルの調整を行います。

この方法で中央寄席したサンプルがこちらです。

ソースはこちら


<!doctype html>
<html>
<head>
<meta charset="shift_jis">
<title>fixed 中央寄せ</title>
<style type="text/css">
body
{
	text-align: center;
}

.box 
{
	background-color: #6C6;
	line-height: 100px;
	text-align: center;
	vertical-align: middle;

	position: fixed;
	height: 100px;
	width: 400px;
	top: calc(50% - 100px/2);
	left: calc(50% - 400px/2);
}
</style>
</head>

<body>
<p>calc を使用して位置調整</p>
<div class="box">box</div>

</body>
</html>

仕組み

left:50% top:50%でずれる分をcalcで引き算して調整しています。
実際に記述している部分はこちらです。

top: calc(50% - 100px/2);
left: calc(50% - 400px/2);

50%から、ボックスサイズの半分を引き算した値をleft、topに指定しています。
ずれる分を引き算しているので、中央寄せになるという仕組みです。

(3)insetで指定する方法

inset はtop left right bottomを一括指定する方法です。
つまり、上下左右に0を指定することで、結果的に中央寄せにする方法です。

この方法で中央寄せにしたサンプルがこちらです。

ソースはこちら


<!doctype html>
<html>
<head>
<meta charset="shift_jis">
<title>fixed 中央寄せ</title>
<style type="text/css">
body
{
	text-align: center;
}
.box 
{
	background-color: #6C6;
	line-height: 100px;
	text-align: center;
	vertical-align: middle;
	height: 100px;
	width: 400px;

	position: fixed;
	inset: 0;
	margin:auto;
}
</style>
</head>

<body>
<p>inset を使用して位置調整</p>
<div class="box">box</div>

</body>
</html>

inset:0; を指定するだけで縦横中央寄せが実現できています。
3つの中で一番シンプルです。

なんでこれだけで中央寄せになるのか不思議でしたが、次の指定と同じ意味になることが分かって理解できました。

top: 0;
left: 0;
right: 0;
bottom: 0;

insetはtop,left,right,bottomをまとめて指定することになるため、4方向0を指定するのと同じ結果になります。

事実、insetを使わず、top,left,right,bottomに0をを指定してみたところ、縦横中央寄せになりました。

どの方法を使うかはケースバイケース

今回の事例では、3つの方法いずれもうまくいきましたが、場合によってはうまくいかないこともあります。

例えば、画面切り替え時に、読み込みが終わるまで「お待ちください」を表示するJqueryを使用した場合、(2)のcalcのみ中央寄せになりました。

このように、jqueryなど様々な要因が絡んだ場合、うまくいかなくなるケースもあります。
なので、いろいろ試してうまくいく方法を見つけ出すことも肝要です。

モバイルバージョンを終了