在另一个 div 中垂直居中一个 div [重复]

Posted

技术标签:

【中文标题】在另一个 div 中垂直居中一个 div [重复]【英文标题】:Vertically centering a div inside another div [duplicate] 【发布时间】:2011-09-23 07:58:13 【问题描述】:

我想将另一个 div 中的 div 居中。

<div id="outerDiv">
    <div id="innerDiv">
    </div>
</div>

这是我目前使用的 CSS。

    #outerDiv 
        width: 500px;
        height: 500px;
        position: relative;
    
    
    #innerDiv 
        width: 284px;
        height: 290px;
        position: absolute;
        top: 50%;
        left: 50%;
        margin-top: -147px;
        margin-left: -144px;
    

如您所见,我现在使用的方法取决于#innerDiv 的宽度和高度。如果宽度/高度发生变化,我将不得不修改 margin-topmargin-left 值。是否有任何通用解决方案可用于将#innerDiv 居中而不考虑其大小?

我发现使用margin: auto 可以将#innerDiv 水平对齐到中间。但是垂直对齐呢?

【问题讨论】:

如果你做 margin-top: auto;边距底部:自动; jsfiddle.net/k6ShD/4 这里有两种简单的方法可以让 div 在 div 中居中,垂直居中,水平居中或两者兼而有之(纯 CSS):***.com/a/31977476/3597276 别人给的建议是对的。只是补充。如果你有名为 DivParent 的父 div 和名为 ChildDiv 的子 div,那么只需将 margin: auto 添加到子 div,这将使 childDiv 或 innerDiv 在 ParentDiv 的中心。 【参考方案1】:

tl;dr

垂直对齐中间有效,但您必须在父元素上使用table-cell,在子元素上使用inline-block

此解决方案不适用于 IE6 和 7。您的解决方案更安全。 但由于您使用 CSS3 和 html5 标记了您的问题,我认为您不介意使用现代解决方案。

经典解决方案(表格布局)

这是我最初的答案。它仍然可以正常工作,并且是获得最广泛支持的解决方案。表格布局将impact your rendering performance,因此我建议您使用更现代的解决方案之一。

Here is an example


测试于:

FF3.5+ FF4+ Safari 5+ Chrome 11+ IE9+

HTML

<div class="cn"><div class="inner">your content</div></div>

CSS

.cn 
  display: table-cell;
  width: 500px;
  height: 500px;
  vertical-align: middle;
  text-align: center;


.inner 
  display: inline-block;
  width: 200px; height: 200px;


现代解决方案(转换)

由于转换是fairly well supported now,因此有一种更简单的方法。

CSS

.cn 
  position: relative;
  width: 500px;
  height: 500px;


.inner 
  position: absolute;
  top: 50%; left: 50%;
  transform: translate(-50%,-50%);
  width: 200px;
  height: 200px;

Demo


♥我最喜欢的现代解决方案(flexbox)

我开始越来越多地使用 flexbox its also well supported now 这是迄今为止最简单的方法。

CSS

.cn 
  display: flex;
  justify-content: center;
  align-items: center; 

Demo

更多示例和可能性: Compare all the methods on one pages

【讨论】:

+1 如果不需要居中文本,OP 是否需要将任何文本包装在另一个容器中? 虽然这确实有效,但它可以作为一个清晰的例子来说明为什么 CSS 存在如此大的缺陷。像这样简单的事情不应该需要纠缠和变通。 在父元素中包含display: table; 有多重要? 是的,你的例子是正确的。我在谈论您答案中的代码(此处)。您似乎有“位置:flex”,这似乎不是有效的 css 属性。 经过 3 个小时的摆弄并试图显示 div 垂直对齐后,这个答案结束了我的挫败感。该 flex 示例运行良好,并且由于客户使用 IE11/Chrome,我可以毫无问题地使用它。非常感谢!【参考方案2】:

对于没有指定高度值的innerdiv,没有纯css解决方案使其垂直居中。一个javascript解决方案可以获取innerdiv的offsetHeight,然后计算style.marginTop。

【讨论】:

【参考方案3】:

我知道这个问题是在一年前提出的... 无论如何感谢CSS3,您可以轻松地在div中垂直对齐div(例如http://jsfiddle.net/mcSfe/98/)

<div style="width: 100px; height: 100px">
<div>
Go to Hell!
</div>
</div>

div

display:-moz-box;
-moz-box-align:center;
 

【讨论】:

这在 Safari 中似乎不起作用。 这仅适用于使用 Mozilla 框架的浏览器(例如 Firefox)。提供/使用不适合跨浏览器的代码是不好的做法。【参考方案4】:

实现这种水平和垂直居中的另一种方法是:

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

(Reference)

【讨论】:

+1,但奇怪的是它取决于位置的顺序。开始 bottom: 0; left: 0; 让内部 div 卡在父级的底部(Chrome 33,无论如何)。 在我的情况下,在您希望 div 对齐的方向定义 0,在搜索表单字段中它是 .search-header margin:auto; top:0px; bottom:0px; right:0px; 没有分配“左”以继续前一个的顺序和位置 而且不需要精确定位父 div 的位置 我会说这是最好的解决方案,但只有当你的内部元素的高度可以预先指定时。例如,这使得它不适合垂直居中流动文本。 不适用于左侧,始终与左侧对齐(OS/X Chrome 66.0.3359.117)【参考方案5】:

与其将自己与难以编写和难以维护的 CSS 纠缠在一起(这也需要仔细的跨浏览器验证!)我发现放弃 CSS 并改用非常简单的 HTML 要好得多1.0:

<table id="outerDiv" cellpadding="0" cellspacing="0" border="0">
    <tr>
        <td valign="middle" id="innerDiv">
        </td>
    </tr>
</table>

这完成了原始发布者想要的一切,并且健壮且可维护。

【讨论】:

大多数人认为这不是一个好的做法,我同意。像“table”这样的标记元素不应该用于布局。如果您实际显示的是表格数据,请使用表格。 如果您重视风格而不是可维护的代码,那么您的担忧是有效的。其他人可能会以不同的方式权衡这两个因素,他们应该会看到所有选项。 我认为这个解决方案非常棒,绝对可以跨浏览器 尽管有 CSS 纳粹分子和他们对表格的仇恨,但我发现这个解决方案比堆积依赖表格单元格格式的神秘 CSS 指令要好得多。当前状态下的 CSS 根本无法正确处理。 一票暗示 css 正在堆积一堆变通方法(至少在术语上)来实现这个简单的事情。对于开发人员来说,这绝对是一个更易于管理的解决方案,我希望将来不再需要它。【参考方案6】:

一年多以来我一直在使用以下解决方案,它也适用于 IE 7 和 8。

<style>
.outer 
    font-size: 0;
    width: 400px;
    height: 400px;
    background: orange;
    text-align: center;
    display: inline-block;


.outer .emptyDiv 
    height: 100%;
    background: orange;
    visibility: collapse;


.outer .inner 
    padding: 10px;
    background: red;
    font: bold 12px Arial;


.verticalCenter 
    display: inline-block;
    *display: inline;
    zoom: 1;
    vertical-align: middle;

</style>

<div class="outer">
    <div class="emptyDiv verticalCenter"></div>
    <div class="inner verticalCenter">
        <p>Line 1</p>
        <p>Line 2</p>
    </div>
</div>

【讨论】:

【参考方案7】:

您可以使用简单的 javascript (jQuery) 块来完成此操作。

CSS

#outerDiv
    height:100%;

Javascript

<script type="text/javascript">
    $(document).ready(function () 
        $("#innerDiv").css('top', ($(window).height() - $("#content").height()) / 2);
    );
</script>

【讨论】:

【参考方案8】:

另一种方法是使用转换翻译

Outer Div 必须将其position 设置为relativefixed,并且Inner Div 必须将其position 设置为absolutetopleft50% 并应用@ 987654330@.

div.cn 
    position: relative;
    width: 200px;
    height: 200px;
    background: gray;
    text-align: center;


div.inner 
    position: absolute;
    top: 50%;
    left: 50%;
    width: 100px;
    height: 100px;
    -webkit-transform: translate(-50%, -50%);  
    transform: translate(-50%, -50%);   
    background: red;
  
<div class="cn">
    <div class="inner">
        test
    </div>
</div>

测试于:

Opera 24.0(最低 12.1) Safari 5.1.7(至少 4 个,带有 -webkit- 前缀) Firefox 31.0(最低 3.6 带 -moz- 前缀,16 不带前缀) Chrome 36(至少 11 个带 -webkit- 前缀,36 个不带前缀) IE 11, 10(最少 9 个带 -ms- 前缀,10 个不带前缀) More browsers, Can I Use?

【讨论】:

这段代码最好的部分是它与全宽外部 div 完美搭配。干得好! 我知道我们需要使用transform: translate(-50%, -50%); 来真正使div 居中,但为什么单独使用top:50%left:50% 不起作用?有人可以解释一下吗? @KevinChandra,我认为topleft 指的是容器尺寸,translate 指的是内容大小。希望有帮助!【参考方案9】:

文本在父元素上居中对齐,在子元素上显示内联块。这将使所有的东西居中。我相信它称之为“块浮动”。

<div class="outer">
 <div class="inner"> some content </div>
</div><!-- end outer -->

<style>
div.outer
 width: 100%;
 text-align: center;

div.inner
 display: inline-block;
 text-align: left

</style>

这也是float的好选择,祝你好运!

【讨论】:

你的答案与水平居中有关;问题是关于垂直居中【参考方案10】:

Vertical Align Anything with just 3 lines of CSS

HTML

<div class="parent-of-element">

    <div class="element">
        <p>Hello</p>
    </div>

</div>

最简单

.element 
  position: relative;
  top: 50%;
  transform: translateY(-50%);

CSS

.parent-of-element 
   position: relative;
   height: 500px;
   /* or height: 73.61% */
   /* or height: 35vh */
   /* or height: ANY HEIGHT */


.element 
  position: absolute;
  top: 50%;

  -webkit-transform: translateY(-50%);
      -ms-transform: translateY(-50%);
          transform: translateY(-50%);

根据shouldiprefix,这是您唯一需要的前缀

您也可以使用 % 作为 .parent-of-element 的 'height' 属性的值,只要元素的父级具有高度或扩展其垂直大小的某些内容即可。

【讨论】:

无法告诉你原因,但在我的情况下,当我在 translateY 上使用 (50%) 而不是 (-50%) 时,效果非常好... 我喜欢这种优雅的解决方案。唯一的问题是,如果用户将他们的浏览器压缩到 100px 高(例如),我会丢失居中 的顶部,这对我来说是个问题,因为出于美学/设计原因我希望我的标题在那里。不过说实话:我非常喜欢这个解决方案,我什至不确定我是否在乎! KjetilNordin,根据您的布局,当您使用 50% 而不是 -50% 时,它有时会起作用。但是只要居中元素的容器有高度,-50% 就可以完美地工作。【参考方案11】:

我个人更喜欢使用隐藏的伪元素来跨越外部容器的整个高度,并将其与其他内容垂直对齐的技巧。 Chris Coyier 有一篇关于这项技术的好文章。 http://css-tricks.com/centering-in-the-unknown/ 这样做的巨大优势是可扩展性。您不必知道内容的高度或担心它的增长/缩小。此解决方案可扩展:)。

这里有你需要的所有 CSS 和一个工作示例。 http://jsfiddle.net/m5sLze0d/

.center:before 
    content: ""; /* Adding Extra Space Above Element */
    display: inline-block;
    height: 100%;
    margin-right: -0.3em;
    vertical-align: middle;

.center_element 
    display:inline-block;
    float:none;
    vertical-align:middle;
    white-space:normal;
    text-align:left;

【讨论】:

6年后,这是最好的解决方案!【参考方案12】:

尝试像这样对齐内部元素:

top: 0;
bottom: 0;
margin: auto;
display: table;

当然还有:

position: absolute;

【讨论】:

它是垂直的而不是水平的【参考方案13】:

这对我有用。可以定义外层div的宽高。

代码如下:

.outer 
  position: relative;
  text-align: center;
  width: 100%;
  height: 150px; // Any height is allowed, also in %.
  background: gray;


.outer > div:first-child 
  position: absolute;
  top: 50%;
  left: 50%;
  width: 100%;
  -webkit-transform: translate(-50%, -50%);
  -ms-transform: translate(-50%, -50%);
  transform: translate(-50%, -50%);
  background: red;
<div class="outer">
  <div class="inner">
    Put here your text or div content!
  </div>
</div>

【讨论】:

【参考方案14】:

您可以使用 flex 在 CSS 中垂直和水平居中 div;

#outerDiv
width: 500px;
    height: 500px;
    position:relative;
    border:1px solid #000;
    margin:0 auto;
    display: flex;
    -webkit-flex-direction: row;
    flex-direction: row;
    -webkit-align-items: center;
    align-items: center;
    -webkit-justify-content: center;
    justify-content: center;

    

#innerDiv
    width: 284px;
    height: 290px;
    border:1px solid #eee;


第二个如下;

    #outerDiv
        width: 500px;
        height: 500px;
        position:relative;
        border:1px solid #000;
        

        #innerDiv
        max-width: 300px;
        height: 200px;
        background-color: blue;
        position:absolute; 
        left:0;
        right:0;
        top:0;
        bottom:0;
        margin:auto;
        border:1px solid #000;
        border-radius:4px;
    

以及生成的 HTML:

    <div id="outerDiv">
        <div id="innerDiv"></div>
    </div>

【讨论】:

【参考方案15】:

小提琴链接http://jsfiddle.net/dGHFV/2515/>

试试这个

   #outerDiv
        width: 500px;
        height: 500px;
        position:relative;
        border:1px solid red;
    

    #innerDiv
        width: 284px;
        height: 290px;
        position:absolute;
        top: 0px;
        left:0px;
        right:0px;
        bottom:0px;
        margin:auto;
        border:1px solid green;
    

【讨论】:

【参考方案16】:

如果您在阅读了上面给出的奇妙答案后仍然不明白。

这里有两个简单的例子来说明如何实现它。

Using display: table-cell

.wrapper 
  display: table-cell;
  vertical-align: middle;
  text-align: center;
  width: 400px;
  height: 300px;
  border: 1px solid #555;


.container 
  display: inline-block;
  text-align: left;
  padding: 20px;
  border: 1px solid #cd0000;
<div class="wrapper">
  <div class="container">
    Center align a div using "<strong>display: table-cell</strong>"
  </div>
</div>

Using flex-box (display: flex)

.wrapper 
  display: flex;
  justify-content: center;
  width: 400px;
  height: 300px;
  border: 1px solid #555;


.container 
  align-self: center;
  padding: 20px;
  border: 1px solid #cd0000;
<div class="wrapper">
    <div class="container">
        Centering a div using "<strong>display: flex</strong>"
    </div>
</div>

注意:在使用上述实现之前,请检查 display: table-cell 和 flex 的浏览器兼容性。

【讨论】:

【参考方案17】:

enter image description here 100% 有效

.div1
  height: 300px;
  background: red;
  width: 100%;
  display: -ms-flexbox;
  display: -webkit-flex;
  display: flex;
  -ms-flex-align: center;
  -webkit-align-items: center;
  -webkit-box-align: center;
  align-items: center;

.div2
  background: green;
  height: 100px;
  width: 100%;


    <div class="div1">
      <div class="div2">
      sdfd
      </div>
    </div>

https://jsfiddle.net/Mangesh1556/btn1mozd/4/

【讨论】:

这很好用【参考方案18】:

当您的height 未设置时(自动);您可以给内部 div 一些填充(顶部和底部)以使其垂直居中:

<div>
    <div style="padding-top:20px;padding-bottom:20px">
    <!--content-->
    </div>
</div>

【讨论】:

【参考方案19】:

这将回到 IE6!

&lt;!DOCTYPE html&gt; 在 IE6 上也是必需的! [也将强制 IE6 默认严格模式]。

(当然,方框着色仅用于演示目的)

#outer
        width: 180px;
        height: 180px;
        margin: auto; 
        text-align: center;
    
    #inner
        text-align: center;
        vertical-align: middle;
        width: 100px;
        height: 100px;
        display: inline-block;
        padding: .3em;
    
    #center
        height: 100%; width:0px;
        vertical-align: middle;
        display: inline-block;
    
    div background: rgba(0,110,255,.7)
<DIV id=outer>
<div id=center>
</div><!--Don't break this line!--><div id=inner>
The inner DIV
</div>
</DIV>

【讨论】:

【参考方案20】:

您可以通过简单地添加下面提到的 css 样式来做到这一点。大多数浏览器都支持这一点。您可以查看here 以获取浏览器支持。一切顺利。如有任何疑问,请发表评论

#outerDiv 
        width: 500px;
        height: 500px;
        position:relative;
        background:grey;
        display:flex;
        justify-content:center;
        align-items:center;
    

#innerDiv 
        background:cyan;
        width: 284px;
        height: 290px;
    
<div id="outerDiv">
    <div id="innerDiv">
        Inner Div
    </div>
</div>

【讨论】:

【参考方案21】:

在另一个 div 中垂直居中一个 div

#outerDiv
  width: 500px;
  height: 500px;
  position:relative;
  
  background-color: lightgrey;  


#innerDiv
  width: 284px;
  height: 290px;
  
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  -ms-transform: translate(-50%, -50%); /* IE 9 */
  -webkit-transform: translate(-50%, -50%); /* Chrome, Safari, Opera */	
  
  background-color: grey;
<div id="outerDiv">
  <div id="innerDiv"></div>
</div>

【讨论】:

【参考方案22】:

垂直和水平居中对齐:

#parentDiv
    display:table;
    text-align:center;


#child 
     display:table-cell;
     vertical-align:middle;

【讨论】:

【参考方案23】:

在另一个 div 中垂直居中 div 项

只需将容器设置为display:table,然后将内部项目设置为display:table-cell。在容器上设置height,然后在内部项目上设置vertical-align:middle。早在 IE9 时代,它就具有广泛的兼容性。

请注意,垂直对齐将取决于父容器的高度。

.cn

display:table;
height:80px;
background-color:#555;


.inner

display:table-cell;
vertical-align:middle;
color:#FFF;
padding-left:10px;
padding-right:10px;
<div class="cn">
  <div class="inner">Item 1</div>
  <div class="inner">Item 2</div>
</div>

【讨论】:

【参考方案24】:

我想展示另一种跨浏览器的方式,它可以使用 CSS3 calc() 解决这个问题。

当子div相对于父div绝对定位时,我们可以使用calc()函数来控制子div的margin-top属性。

使用calc()的主要优点是可以随时更改父元素的高度,而子div将始终居中对齐。

margin-top 计算是动态进行的(通过 css 而不是脚本,这是一个非常大的优势)。

看看这个LIVE DEMO

<!DOCTYPE html>
<html>
  <head>
    <style>
      #parent
        background-color:blue;
        width: 500px;
        height: 500px;
        position:relative;
      
      #child
        background-color:red;
        width: 284px;
        height: 250px;
        position:absolute;
        /* the middle of the parent(50%) minus half of the child (125px) will always             
           center vertically the child inside the parent */
        margin-top: -moz-calc(50% - 125px);
        /* WebKit */
        margin-top: -webkit-calc(50% - 125px);
        /* Opera */
        margin-top: -o-calc(50% - 125px);
        /* Standard */
        margin-top: calc(50% - 125px);
      
    </style>
  </head>
  <body>
    <div id="parent">
      <div id="child">
      </div>
    </div>
  </body>
</html>

输出:

【讨论】:

以上是关于在另一个 div 中垂直居中一个 div [重复]的主要内容,如果未能解决你的问题,请参考以下文章

在另一个 div 中垂直居中一个 div

在另一个 div 的中间垂直居中 div

div+css 怎么让一个小div在另一个大div里面 垂直居中

一个div在另一个div中垂直居中的方法

DIV在另一个DIV里面垂直居中,水平居中

垂直和水平将 div 居中在另一个内部