web-dev-qa-db-ja.com

絶対位置の親divの内側でdivを垂直方向の中央に配置する方法

私はピンク色のものの真ん中に青いコンテナを入れようとしています、しかしその場合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>

結果:

enter image description here

期待:

enter image description here

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

Jsfiddle

105
Vladimirs

vertical-alignはテーブルセルとインラインレベルの要素にのみ適用可能です。

あなたのニーズに合うかもしれないしそうでないかもしれない垂直方向の整列を達成するためのいくつかの方法があります。しかし、私はあなたからお見せします twomethods 私のお気に入りから:

1. transformtopを使う

.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のパーセント値は、ボックス自体のサイズ(境界ボックス)に対する相対値です。

フォントレンダリングの問題 (ぼやけたフォント)が発生した場合は、transform宣言にperspective(1px)を追加して修正してください。

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

CSS transformIE9 +でサポートされています ということに注目する価値があります。

2. inline-block(pseudo-)要素を使う

このメソッドでは、2つの兄弟inline-block要素があり、それらはvertical-align: middle宣言によって中央で垂直方向に整列されています。

それらのうちの1つは、その親の100%heightを持ち、もう一方は中央でそれを整列させたい私たちの希望する要素です。

.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つを使うべきです。

253
Hashem Qolami

これを使って :

.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/

34

内容を中央に配置するには、絶対位置に配置された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;
}
14
Chris Aelbrecht

垂直方向と水平方向の中央揃え

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

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>
3
G-Cyr

これがTopオブジェクトを使った簡単な方法です。

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

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

追加の簡単な解決策

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;  
}
1
Hicham

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

これは私が見つけたはるかに簡単な方法です。

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

注意。サファリの中でテストするためにdisplay:-webkit-flex;の代わりにdisplay:-webkit-flex;を使った。

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

1
Whanau Paitai

これは、親のdivにdisplay:table;を、子のdivにdisplay: table-cell; vertical-align: middle;を使用して実行できます。

<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>
0
Arindam Sarkar