如何在绝对定位的父div内部垂直居中放置div


145

我正在尝试在粉红色的中间放置一个蓝色的容器,但是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

vertical-align: middle;与工作display: inline-block或表格布局
ctf0


@Vucko是的,这是前提条件,因为这只是非常复杂布局的简化版本,但是在两个顶级div中的绝对位置都是关键。
Vladimirs

@Vladimirs我只能想到的margin-top: calc((56px - 16px) / 2),在这里56px - parent height16px - element height/font-size- 的jsfiddle
Vucko

Answers:


330

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

有两种方法可以实现垂直对齐,这可能会或可能不会满足您的需求。但是,我将从我的收藏夹中向您展示两种 方法

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>

关键是百分比值on top相对于height包含块的百分比;而transforms 上的百分比值是相对于框本身(边界框)的大小而言的。

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

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

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

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

在此方法中,我们有两个同级inline-block元素,它们通过vertical-align: middle声明在中间垂直对齐。

其中一个具有其父级的a 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>

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


感谢您的有用提示。它正在为我的项目工作。干得好。
Sedat Kumcu'4

对于第一个方法valign元素应为display: block
Oleg,

transform: translateY(-50%);以前从未见过,但是它完美无缺。现实生活中的救星。
Benny Bottema

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

如果我的父母中有多个div怎么办?不会全部都放在彼此的顶部吗?
psykid

如果再有一个处于“绝对中心”水平的孩子则不起作用
Pascut

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假定保持大小不变​​,否则我不了解绝对内部绝对的目的吗?
G-Cyrillus

1

这是使用Top对象的简单方法。

例如:如果绝对元素大小为60px。

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

2
使用calc是有帮助的,尽管top: calc(50% - 30px)实际上应该使它居中。
脑袋

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.