如何在绝对定位的父级 div 内垂直居中 div
How to center div vertically inside of absolutely positioned parent 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>
结果:
期望:
请建议我怎样才能做到这一点。
您可以使用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
仅适用于 table 个单元格和 inline-level 个元素。
有几种方法可以实现垂直对齐,这可能会或可能不会满足您的需要。不过,我会从我的收藏夹中向您展示 two methods:
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
; transform
s 上的百分比值是相对于框本身(边界框)的大小。
如果您遇到 font rendering issues(字体模糊),修复方法是将 perspective(1px)
添加到 transform
声明中,使其变为:
transform: perspective(1px) translateY(-50%);
值得注意的是CSS transform
is supported in IE9+.
2。使用 inline-block
(伪)元素
在这个方法中,我们有两个兄弟 inline-block
元素,它们通过 vertical-align: middle
声明在中间垂直对齐。
其中一个的 parent 有 height
个 100%
个,另一个是我们想要的元素,我们希望将其居中对齐。
.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>
最后,我们应该使用available methods to remove the gap between inline-level elements之一。
在绝对定位的 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;
}
参考这个link: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>
我试图在粉色容器中间放置蓝色容器,但似乎 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>
结果:
期望:
请建议我怎样才能做到这一点。
您可以使用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
仅适用于 table 个单元格和 inline-level 个元素。
有几种方法可以实现垂直对齐,这可能会或可能不会满足您的需要。不过,我会从我的收藏夹中向您展示 two methods:
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
; transform
s 上的百分比值是相对于框本身(边界框)的大小。
如果您遇到 font rendering issues(字体模糊),修复方法是将 perspective(1px)
添加到 transform
声明中,使其变为:
transform: perspective(1px) translateY(-50%);
值得注意的是CSS transform
is supported in IE9+.
2。使用 inline-block
(伪)元素
在这个方法中,我们有两个兄弟 inline-block
元素,它们通过 vertical-align: middle
声明在中间垂直对齐。
其中一个的 parent 有 height
个 100%
个,另一个是我们想要的元素,我们希望将其居中对齐。
.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>
最后,我们应该使用available methods to remove the gap between inline-level elements之一。
在绝对定位的 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;
}
参考这个link: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>