絶対配置された親divの内側にdivを垂直方向に中央揃えする方法


146

私はピンク色の容器の真ん中に青い容器を入れようとvertical-align: middle;していますが、その場合はうまくいかないようです。

<div style="display: block; position: absolute; left: 50px; top: 50px;">
    <div style="text-align: left; position: absolute;height: 56px;vertical-align: middle;background-color: pink;">
        <div style="background-color: lightblue;">test</div>
    </div>
</div>

結果:

ここに画像の説明を入力してください

期待:

ここに画像の説明を入力してください

どうすればそれを達成できるか提案してください。

Jsfiddle


1
position: absoluteどこでも使用している理由はありますか?
Vucko 2015

vertical-align: middle;作品display: inline-blockやテーブルレイアウト
ctf0

このリンクを確認してください:vanseodesign.com/css/vertical-centering ;)
ジョルディカスティーリャ

@Vuckoはい-これは非常に複雑なレイアウトの単純化されたバージョンであるための前提条件ですが、両方のトップdivでの絶対位置が重要です。
Vladimirs

私は考えることができます@Vladimirs margin-top: calc((56px - 16px) / 2)56px - parent height16px - element height/font-size- JSFiddle
Vucko

回答:


331

まず、これvertical-alignはテーブルセルとインラインレベルの要素にのみ適用されます。

垂直方向の配置を実現するには、いくつかの方法がありますが、ニーズに合わない場合もあります。ただし、私のお気に入りから2つの 方法を紹介します。

1. transformおよびの使用top

.valign {
    position: relative;
    top: 50%;
    transform: translateY(-50%);
    /* vendor prefixes omitted due to brevity */
}
<div style="position: absolute; left: 50px; top: 50px;">
    <div style="text-align: left; position: absolute;height: 56px;background-color: pink;">
        <div class="valign" style="background-color: lightblue;">test</div>
    </div>
</div>

重要な点は、パーセンテージ値がオンであることtopを基準とheightを含むブロックの。transformsのパーセンテージ値は、ボックス自体(境界ボックス)のサイズに関連しています。

あなたが発生した場合、フォントレンダリングの問題(ぼやけフォント)を、修正が追加することですperspective(1px)transform、それはなるように宣言:

transform: perspective(1px) translateY(-50%);

CSS transform がIE9 +でサポートされていること注目に値します。

2. inline-block(疑似)要素の使用

このメソッドには、2つの兄弟があります。 inline-blockvertical-align: middle宣言によって中央で垂直に配置された要素があります。

その一つは持っているheight100%は親のおよび他のは、私たちの目的の要素を持つ私たちは途中でそれを揃えたかったです。

.parent {
    text-align: left;
    position: absolute;
    height: 56px;
    background-color: pink;
    white-space: nowrap;
    font-size: 0; /* remove the gap between inline level elements */
}

.dummy-child { height: 100%; }

.valign {
    font-size: 16px; /* re-set the font-size */
}

.dummy-child, .valign {
    display: inline-block;
    vertical-align: middle;
}
<div style="position: absolute; left: 50px; top: 50px;">
    <div class="parent">
        <div class="dummy-child"></div>
        <div class="valign" style="background-color: lightblue;">test</div>
    </div>
</div>

最後に、使用可能な方法の 1つを使用して、インラインレベルの要素間のギャップを削除する必要があります


この便利なヒントをありがとう。それは私のプロジェクトのために働いていました。良い仕事。
Sedat Kumcu 2017

最初のメソッドvalign要素は次のようになりますdisplay: block
Oleg

transform: translateY(-50%);これまでに見たことはありませんが、問題なく動作します。リアルライフセーバー。
ベニーボッテマ

55

これを使って :

.Absolute-Center {
    margin: auto;
    position: absolute;
    top: 0; left: 0; bottom: 0; right: 0;
}

このリンクを参照してください:https : //www.smashingmagazine.com/2013/08/absolute-horizo​​ntal-vertical-centering-css/


これが主な解決策ではありませんか?とても簡単でうまくいきます!
メイソン

21
これを機能させるには、heightプロパティを定義する必要があります(px、emなどで)。
Vaidas 2017年

親の中に複数のdivがある場合はどうなりますか?すべてが互いに重なり合うのではないでしょうか?
psykid

同じレベルに「絶対中心」の子がもう1人いる場合は機能しません
パスカット

18

コンテンツを中央に配置するために、絶対配置されたdivでflex bloxを使用します。

例を見るhttps://plnkr.co/edit/wJIX2NpbNhO34X68ZyoY?p=preview

.some-absolute-div {    
  display: -webkit-box;
  display: -webkit-flex;
  display: -moz-box;
  display: -moz-flex;
  display: -ms-flexbox;
  display: flex;

  -webkit-box-pack: center;
  -ms-flex-pack: center;
  -webkit-justify-content: center;
  -moz-justify-content: center;
  justify-content: center;

  -webkit-box-align: center;
  -ms-flex-align: center;
  -webkit-align-items: center;
  -moz-align-items: center;
  align-items: center;
}

11

垂直方向と水平方向の中央に配置:

.parent{
  height: 100%;
  position: absolute;
  width: 100%;
  top: 0;
  left: 0;
}
.c{
  position: absolute;
  top: 50%;
  left: 0;
  right: 0;
  transform: translateY(-50%);
}

3

display:table/を使用できますtable-cell;

.a{
   position: absolute; 
  left: 50px; 
  top: 50px;
  display:table;
}
.b{
  text-align: left; 
  display:table-cell;
  height: 56px;
  vertical-align: middle;
  background-color: pink;
}
.c {
  background-color: lightblue;
}
<div class="a">
  <div  class="b">
    <div class="c" >test</div>
  </div>
</div>


おかげで、あなたの例は完璧に動作しますが、.b欠けposition: absolute;ているのは、コードをより明確にするために、私が含めなかった他のものをプロパティに表示するために重要です。テーブルセルを絶対的に配置しても意味がないことはわかっていますposition: absolute;が、.a.bクラスの両方で保持できる別のアプローチがあると思いますか?
Vladimirs

aが絶対位置で、b(子)がサイズを指定している場合、b自体がコンテンツの残りの部分に対して絶対位置になります。aがサイズ変更されないままであると想定しない限り、absoluteの中でabsoluteの目的を理解できませんか?
G-Cyrillus、2015

1

Topオブジェクトを使用する簡単な方法を次に示します。

例:要素の絶対サイズが60pxの場合。

.absolute-element { 
    position:absolute; 
    height:60px; 
    top: calc(50% - 60px);
}

2
使用することcalcは役に立ちますが、これはtop: calc(50% - 30px)実際に中央に配置するためのものです。
ブレインバッグ2018年

1

追加のシンプルなソリューション

HTML:

<div id="d1">
    <div id="d2">
        Text
    </div>
</div>

CSS:

#d1{
    position:absolute;
    top:100px;left:100px;
}

#d2{
    border:1px solid black;
    height:50px; width:50px;
    display:table-cell;
    vertical-align:middle;
    text-align:center;  
}

0

同様の問題に対するこの回答を確認してください。

これは、私が見つけた最も簡単な方法です。

https://stackoverflow.com/a/26079837/4593442

注意。私はディスプレイを使用しました:-webkit-flex; 表示の代わりに:flex; サファリ内のテスト用。

脚注。私は初心者で、明確に経験を積んだ人からの助けを共有しています。


0

display:table;親divとdisplay: table-cell; vertical-align: middle;子divで使用することでそれを行うことができます

<div style="display:table;">
      <div style="text-align: left;  height: 56px;  background-color: pink; display: table-cell; vertical-align: middle;">
          <div style="background-color: lightblue; ">test</div>
      </div>
  </div>


3
あなたの答えは良いかもしれませんが、あなたのコードが何をするかのいくつかの説明を追加することによってそれを非常に改善することができます...
DaFois
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.