【问题标题】:How to center div vertically inside of absolutely positioned parent div如何在绝对定位的父 div 内垂直居中 div
【发布时间】:2015-04-11 20:50:18
【问题描述】:

我正在尝试将蓝色容器放在粉色容器的中间,但在这种情况下,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

【问题讨论】:

  • 你到处使用position: absolute有什么原因吗?
  • vertical-align: middle; 适用于display: inline-block 或表格布局
  • @Vucko 是的 - 这是先决条件,因为这只是非常复杂布局的简化版本,但两个顶部 div 中的绝对位置是关键。
  • @Vladimirs 我只能想到margin-top: calc((56px - 16px) / 2),其中56px - parent height16px - element height/font-size - JSFiddle

标签: html css vertical-alignment absolute


【解决方案1】:

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

有几种方法可以实现垂直对齐,它们可能会也可能不会满足您的需求。不过,我会从我的收藏夹中向您展示two methods

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 上的百分比值与框本身(边界框)的大小有关。

如果您遇到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声明在中间垂直对齐。

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

最后,我们应该使用available methods to remove the gap between inline-level elements 之一。

【讨论】:

  • 感谢这个有用的提示。它适用于我的项目。好作品。
  • 对于第一个方法valign元素应该是display: block
  • transform: translateY(-50%); 以前从未见过,但它完美无缺。真正的救星。
  • 现在我们终于可以放弃对 IE8 的支持了,translateY 方法具有通用的跨浏览器支持。
【解决方案2】:

使用这个:

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

【讨论】:

  • 这不是主要的解决方案吗?如此简单,它的工作原理!
  • 请记住,必须定义 height 属性(以 px、em 等为单位)才能使其正常工作。
  • 如果我在父级中有多个 div 怎么办?不是都放在一起吗?
  • “absolute-center”同层多一个孩子就不行了
  • 我在 10 年的编程生涯中怎么没用过这个? =D 谢谢
【解决方案3】:

在绝对定位的 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;
}

【讨论】:

  • 是的,flexbox 是 2021 年的发展方向!虽然一定要使用top: 0; bottom: 0; left:0; right 0;,以便首先它的尺寸与相对定位的父div的尺寸相同,然后flexbox的魔法开始了!
【解决方案4】:

垂直和水平居中:

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

【讨论】:

    【解决方案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;
    }
    <div class="a">
      <div  class="b">
        <div class="c" >test</div>
      </div>
    </div>

    【讨论】:

    • 谢谢,您的示例运行良好,但是 .b 缺少 position: absolute; 这对于获取其他显示属性很重要,我没有包含这些属性以保持代码更清晰。我知道让表格单元绝对定位是没有意义的,但也许还有另一种方法可以在.a.b 类中保留position: absolute;
    • 如果 a 是绝对位置,并且 b(孩子)给它它的大小,b 本身就是相对于其余内容的绝对位置。除非假设 a 保持未调整大小,否则我不明白 absolute 内 absolute 的目的?
    【解决方案6】:

    仅垂直居中

        <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%);
    }
    &lt;div class="center"&gt;Hello Centered World!&lt;/div&gt;

    【讨论】:

    • 这个答案已经在接受的答案中给出了。
    • 这意味着我不能在这里添加任何新东西@TaylerH
    • htmlcss 每天都有很多其他问题供您尝试回答。如果您可以向任何现有答案添加新内容,则仅应发布答案。重复内容对任何人都没有帮助。
    【解决方案7】:

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

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

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

    【讨论】:

    • 使用 calc 会很有帮助,尽管它应该是 top: calc(50% - 30px) 才能真正居中。
    【解决方案8】:

    另一个简单的解决方案

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

    【讨论】:

      【解决方案9】:

      您可以通过在父 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>

      【讨论】:

      • 您的答案可能很好,但您可以通过添加一些关于您的代码功能的描述来改进它...
      猜你喜欢
      • 2010-12-12
      • 1970-01-01
      • 1970-01-01
      • 2017-07-29
      • 2012-03-21
      • 2014-11-09
      • 1970-01-01
      • 2018-08-16
      相关资源
      最近更新 更多