如何中心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

请建议我怎样才能做到这一点。

< a href = " http://jsfiddle.net/kqmp1z9m/ " > Jsfiddle < / >

301589 次浏览

编辑:10/22像现在一样,display flexgrid被广泛实现,我建议使用其中一个(__ABC3/table-cell仍然可以工作,如果你需要兼容旧的或外来的浏览器,比如我的电视…)

  • flex

.a{
position: absolute;
left: 50px;
top: 50px;
}
.b{
display:flex;
align-items:center;
background-color: pink;
height: 56px;
}
.c {
background-color: lightblue;
}
/* move the flex demo aside */
.a.b{left:100px}
You even need less markup
<div class="a">
<div class="b">
<div class="c">test</div>
</div>
</div>




<div class="a b">
<div class="c">test</div>
</div>

  • 网格(与此相似)

.a{
position: absolute;
left: 50px;
top: 50px;
}
.b{
display:grid;
align-items:center;
background-color: pink;
height: 56px;
}
.c {
background-color: lightblue;
}


/* move the grid  demo aside */
.a.b{left:100px}
You even need less markup
<div class="a">
<div class="b">
<div class="c">test</div>
</div>
</div>




<div class="a b">
<div class="c">test</div>
</div>


原回答2015年2月2日(仍然在任何地方有效)

你可以使用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>

首先要注意,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>

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

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

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

值得注意的是CSS transform IE9+. c。

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

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

其中一个有其父元素的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>

最后,我们应该使用可用于删除内联级元素之间的间隙的方法

使用flex blox在你的绝对定位div居中它的内容。

参见示例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;
}

用这个:

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

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

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

如果元素的绝对大小是60px。

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

垂直和水平居中:

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

另外一个简单的解决方案

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

你可以在父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>

仅适用于垂直中心

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

我总是这样做,这是一个非常简短和容易的代码,水平和垂直居中

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