【问题标题】:Vertical center with CSSCSS垂直居中
【发布时间】:2014-02-27 06:56:12
【问题描述】:

我知道有很多方法可以让 CSS 居中。水平居中任何东西都非常简单。但是,如果您要将任何东西垂​​直居中,那将是一个全新的故事。 我只是想知道为什么我们不能只说 bottom-align:auto;顶部对齐:自动;就像我们想要水平居中的东西一样? 为什么在水平居中某物时看起来像居中一样简单的东西看起来那么简单?我知道有很多方法,但我们只是说你有一个未知大小的元素,你想在另一个未知大小的元素中居中。

我已经坐了将近两天了,没有找到关于这个答案的好问题,我们有很多不同的方法来水平居中项目,但是为什么没有一个单一的 CSS 标准想出一种方法来垂直居中?这是一件坏事吗?它会让人哭泣还是随机分娩?它会熔化核反应堆吗?

我们生活在 2014 年。似乎没有必要使用 Javascript 来做一些简单的事情,比如在另一个元素中居中。

编辑: 我的意思的代码示例: http://jsfiddle.net/VsakD/

CSS:

div.parentbox
{
    width:500px;
    height:500px;
    border-style:solid;
}

div.childbox
{
    width:300px;
    height:300px;   
    border-style:solid;
    margin-left:auto;
    margin-right:auto;
    margin-top:auto;
    margin-bottom:auto;
}

HTML:

<div class="parentbox">
    <div class="childbox">
        I shall be in the middle of parentbox regardless of its size!
    </div>
</div>

【问题讨论】:

  • 请提供一些代码。我们比故事更了解代码
  • display:flex 赢得胜利
  • vertical-align 适用于表格单元格内的内容(td 或 display as )或内联框之间的内容,使用它们的基线作为参考。 display:table-cell 在 IE8 中工作,它让事情变得非常简单:)
  • 如果只是一行文字,您可以将line-height设置为等于父级的宽度。否则,您可以只使用绝对定位的偏移边距(单击here 获取有关绝对垂直定位的博文)。或者,就像@GCyrillus 建议的那样,将父级设为display:table,将其设为display:table-cell;vertical-align:middle 的子级。
  • 这是一个从 2006 年开始的旧测试,没有使用 javascript,它在 IE55 和 6 gcyrillus.free.fr/essai/v-align-midlle-block-tous.html 中工作,它涉及内联块和布局(FF 1 可以理解显示表而不是 IE6 :) gcyrillus.free.fr/essai/v-align-midlle-block-tous.html ) 红色元素显示正在发生的事情,如果选择了 display:table 方法,现在可以是伪元素或不使用:)

标签: javascript jquery html css


【解决方案1】:

有人能具体说明一下为什么我不能只说margin-top:auto; margin-bottom:auto; 进行垂直对齐吗?因为您使用margin-left:auto; margin:right:auto; 进行水平对齐,所以假设这是合乎逻辑的?

根据Spec10.6.2):

内联替换元素,普通块级替换元素 flow, 'inline-block' 替换了正常流和浮动中的元素 替换元素

如果'margin-top'或'margin-bottom'是'auto',它们的使用值为0

这就是为什么在这种情况下使用顶部/底部margin,不会做出任何改变。

顺便说一句,为了在容器内垂直对齐 div 元素(未知尺寸),您可以关注this approach

.parentbox {        
    text-align: center; /* Align inline elements center horizontally */
    font: 0/0 a; /* <-- remove the gap between inline(-block) elements */
}

.parentbox:before {
    content: ' ';
    display: inline-block;
    vertical-align: middle;
    height: 100%;
}

.childbox {
    display: inline-block;
    vertical-align: middle;
    font: 1rem/1 Arial, sans-serif;  /* <-- Reset the font */
}

WORKING DEMO

【讨论】:

    【解决方案2】:

    我实现您想要的技术的最佳方法是使用 table display 规则。

    <div class="parent-container'>
       <div class="child-container">
             This is vertically centered text!
       </div>
    </div>
    

    诀窍在于CSS

        .parent-container {
            display: table;
            width: 100%;
            height: 300px;
            background-color: #ff0000;
        }
    
        .child-container {
            display: table-cell;
            vertical-align: middle;
        }
    

    通过使父容器显示为table,子容器显示为cell,它遵循与table 相同的垂直对齐规则,因为这就是您要告诉它自己识别的内容.

    这是我的 JS fiddle 供参考。我设置了一个固定高度来显示实际的垂直对齐,但实际上,它也适用于百分比高度或填充的计算高度。 http://jsfiddle.net/JTVeG/

    【讨论】:

    • 如果您阅读了我的问题,我在问为什么我使用 margin-top:auto 时文本不会居中;和边距底部:自动;以及为什么如此简单的任务必须如此难以解决。
    【解决方案3】:

    修改后的作者代码 不管它的大小,我都将在 parentbox 的中间!

    div.parentbox
    {
        width:500px;
        height:500px;
        border-style:solid;
        display: table; //added this line
    }
    
    div.childbox
    {
        width:300px;
        height:300px;   
        border-style:solid;
        margin-left:auto;
        margin-right:auto;
        margin-top:auto;
        margin-bottom:auto;
        display: table-cell; //added this line
        vertical-align: middle;
        text-align: center;
    }
    

    【讨论】:

    • 仅发布代码不会帮助任何人理解您的答案。请解释你的代码的哪一部分是答案
    • 我想使用 CSS 来居中,而不是表格。我知道当有人将表格用于不打算格式化的任何内容时,网络开发人员会受到伤害。
    • 天哪! display:table 不是 ,它只是 table 的默认显示,如 list-item 用于 lis 或 block 用于 div,不要混合 CSS 和 HTML ...
    • 那家伙在我发表评论后立即更改了评论;)
    【解决方案4】:

    display: table 方法是一种方法,但也可以利用 CSS 转换。与许多其他 CSS 属性(如“top”)不同,这些属性的百分比是相对于 包含 元素计算的,CSS 转换将百分比应用于元素本身。因此,您可以将元素放置在其容器内向下 50% 的位置,然后将其向上变换自身大小的 50%:

    .center-me {
      position: relative;
      top: 50%;
      transform: translateY(-50%);
      margin-left: auto; margin-right: auto;
      width: 300px; /* or whatever */
    }
    
    <div class=center-me> Hello World! </div>
    

    Thanks go to the great Dave Walsh.Here is a jsfiddle to demonstrate.

    【讨论】:

      【解决方案5】:

      您可以轻松找到旧的技术来执行此操作,但这里讨论了一种较新的技术:http://zerosixthree.se/vertical-align-anything-with-just-3-lines-of-css/

      它适用于 IE9+ 和所有其他浏览器。使用它的好处是不必知道元素的高度或使用绝对定位。多行文本不受 line-height 方法的影响。

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

      【讨论】:

        猜你喜欢
        • 2012-12-29
        • 1970-01-01
        • 2014-10-22
        • 1970-01-01
        • 2012-04-26
        • 2018-05-17
        • 1970-01-01
        • 1970-01-01
        • 2012-02-05
        相关资源
        最近更新 更多