如何在绝对定位的父div中垂直居中div

Vla*_*irs 125 html css absolute vertical-alignment

我试图在粉红色的容器中间获得蓝色容器,但是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>
Run Code Online (Sandbox Code Playgroud)

结果:

在此输入图像描述

期望:

在此输入图像描述

请建议我如何实现这一目标.

的jsfiddle

Has*_*ami 287

首先请注意,vertical-align它仅适用于表格单元格和内联级元素.

有几种方法可以实现垂直对齐,这可能会或可能不会满足您的需求.不过我会向你展示我最喜欢的两种 方法:

1.使用transformtop

.valign {
    position: relative;
    top: 50%;
    transform: translateY(-50%);
    /* vendor prefixes omitted due to brevity */
}
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)

关键点是百分比值top是相对于height包含块的百分比值; 虽然transforms 上的百分比值是相对于框本身的大小(边界框).

如果遇到字体渲染问题(模糊字体),修复方法是添加perspective(1px)transform声明中,使其变为:

transform: perspective(1px) translateY(-50%);
Run Code Online (Sandbox Code Playgroud)

值得注意的transform 是,IE9 +支持 CSS .

2.使用inline-block(伪)元素

在这个方法中,我们有两个兄弟inline-block元素,通过vertical-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;
}
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)

最后,我们应该使用一种可用的方法来消除内联级元素之间的差距.

  • `transform:translateY(-50%);` 以前从未见过这个,但它工作得完美无缺。真正的救星。 (3认同)

小智 44

用这个 :

.Absolute-Center {
    margin: auto;
    position: absolute;
    top: 0; left: 0; bottom: 0; right: 0;
}
Run Code Online (Sandbox Code Playgroud)

请参考此链接:https://www.smashingmagazine.com/2013/08/absolute-horizo​​ntal-vertical-centering-css/

  • 请记住,必须定义`height`属性(在px,em等中)才能使其正常工作. (16认同)
  • 这怎么不是主要的解决方案?如此简单,而且有效! (3认同)

Chr*_*cht 17

在absoutely定位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;
}
Run Code Online (Sandbox Code Playgroud)

  • 是的,Flexbox 是 2021 年的发展方向!尽管确保使用 `top: 0; 底部:0;左:0;right 0;` 因此,首先它的尺寸变得与相对定位的父 div 的尺寸相同,然后 Flexbox 的魔力开始发挥作用! (2认同)

Kar*_*yal 16

仅适用于垂直居中

    <div style="text-align: left; position: relative;height: 56px;background-color: pink;">
        <div style="background-color: lightblue;position:absolute;top:50%;    transform: translateY(-50%);">test</div>
    </div>
Run Code Online (Sandbox Code Playgroud)

我总是喜欢这样做,这是一个非常短且简单的代码,可以水平和垂直居中

.center{
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
}
Run Code Online (Sandbox Code Playgroud)
<div class="center">Hello Centered World!</div>
Run Code Online (Sandbox Code Playgroud)


Jua*_*gel 9

垂直和水平居中:

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


G-C*_*Cyr 5

您可以使用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;
}
Run Code Online (Sandbox Code Playgroud)
<div class="a">
  <div  class="b">
    <div class="c" >test</div>
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)