【问题标题】:What is the best way to vertically and horizontally center an HTML element within the viewport?在视口中垂直和水平居中 HTML 元素的最佳方法是什么?
【发布时间】:2012-03-28 23:36:57
【问题描述】:

假设我想在我的视口中心放置一个元素以用作弹出消息。它应满足以下要求:

  • 即使元素大小动态变化,元素也应在浏览器中保持居中(水平和垂直)
  • 如果调整浏览器大小,元素应保持居中
  • 不允许使用 Javascript
  • 仍可在 IE7 上运行

有没有更好的方法来实现这一点,而无需使用下面的基于表格的解决方案?

<table style="position:absolute;width:100%;height:100%">
    <tr>
        <td align="center">
            <span id="centeredContent">I always remain centered</span>
        </td>
    </tr>
</table>

【问题讨论】:

标签: html css html-table center centering


【解决方案1】:

最好的解决方案(在我看来)是使用绝对定位将元素的左上角放置在 50%/50% 处,然后使用负边距将元素推回中心。唯一的缺点是您必须指定元素的宽度和高度。这是一个例子:

HTML:

​<div id="centerme">
    Hello, world!
</div>​

CSS:

​#centerme
{
    position: absolute;
    left: 50%;
    top: 50%;

    /* You must set a size manually */
    width: 100px;
    height: 50px;

    /* Set negative margins equal to half the size */
    margin-left​: -50px;
    margin-top: -25px;

    background-color: cornflowerblue;
}

这是一个关于 jsfiddle 的演示:http://jsfiddle.net/UGm2V/


如果您确实需要居中的内容具有动态高度,则可以使用更高级的解决方案。请注意,它不适用于旧的 IE 浏览器。 HTML 如下:

<div id="outter-container">
    <div id="inner-container">
        <div id="centred">
            <p>I have a dynamic height!</p>
            <p>Sup!</p>
        </div>        
    </div>
</div>

外部容器需要覆盖页面的宽度和高度。这是一个绝对定位的块元素。
内容器实际上是一张桌子!这是由display: table css 属性决定的。这里的胜利是您实际上不需要任何表格 HTML。
#centred div 是最后一个必需的元素。它仍然覆盖 100% 的页面宽度和高度,但放置在其中的任何内容都将垂直和水平居中。这是您需要的 css,并附有说明:

/*
An outter container is needed because the table
won't cover the page width and height on it's own
*/
#outter-container
{
    position: absolute;
    top: 0px;
    right: 0px;
    bottom: 0px;
    left: 0px;
}

/*
The inner container is a table which is set to
cover the width and height of the page.
*/
#inner-container
{
    display: table;
    width: 100%;
    height: 100%;
}

/*
This table cell will cover 100% of the page width
and height, but everything placed inside it will
be placed in the absolute centre.
*/
#centred
{
    display: table-cell;
    vertical-align: middle;
    text-align: center;
}

​当然,这里还有一个 jsfiddle 演示:http://jsfiddle.net/N7ZAr/3/

【讨论】:

  • +1 为漂亮整洁的例子。但是并没有完全涵盖动态大小的元素的居中。
  • 确实如此,但根据我的经验,我很少需要将具有动态高度的东西居中。如果您确实需要在动态居中的元素上垂直居中,则必须使用表格。或者,您可以使用display: table css 属性,它允许您在 HTML 中使用 div。我将在中进行编辑
  • 我认为这种情况有一些常见的用途。如果我将它用于弹出消息,那么我希望宽度随着消息文本而增长。如果该宽度超过指定的max-width,那么我希望高度开始增长。我想另一个典型的用途是图像查看器,您只希望图像居中,无论它们的大小。无论哪种方式,我认为您更新的解决方案是我们将获得的最接近的解决方案。它有效并且不使用table。非常感谢您的努力。
  • 使用图像查看器,您可以使用 Javascript 获取图像的大小并将其相应地放置在视口的中心 :-) 但如果您不关心老式 IE 支持,那么这是压力小很多
【解决方案2】:

如果是固定大小的元素,你可以这样做:

#centered {
    position:absolute;
    width:200px;
    height:400px;
    top:50%;
    left:50%;
    margin-left:-100px; // negative-half of element's width
    margin-top:-200px; // negative-half of element's height
}​

这里的诀窍是top:50%; left:50%;。将它与一个margin-left 和一个margin-top 结合起来,等于你的widthheightnegative-half,你的元素将在你的页面中居中.

如果您不使用 Eric Meyer 的 CSS 重置或 normalize.css 等重置样式表,请务必将您的 body 设置为 margin:0; 以使此技巧起作用。

这是一个 jsfiddle:http://jsfiddle.net/remibreton/fZywe/1/

我做的一个网站的例子:http://althotels.ca/

【讨论】:

  • 感谢您的示例。我很欣赏这可能是解决问题的最常见方法,但是当您的居中元素具有动态大小时,它就会失败。在我的弹出消息框示例中,我真的希望我的框根据其内容调整大小。据我所知,我仍然需要使用基于表格的解决方案。还是我错过了什么?
【解决方案3】:

【讨论】:

  • 这只有在你知道代码时居中 div 的尺寸时才有效
  • 是的,如果处理固定的元素大小(正如 yunzen 提到的),这个解决方案当然可以使用 - 但我最初的问题是寻找动态大小元素的居中解决方案。因此,如果我的元素被用作消息框,我希望该框与消息文本一起调整大小。这个解决方案不允许这样做......但无论如何谢谢。
【解决方案4】:

如果不知道居中内容的大小,则需要两步居中 此处示例:http://jsfiddle.net/G6fUE/

<div class="popup-center">
    <div class="content">
        sadalshd<br />
        sadalshd<br />
        <img src="http://www.lorempixel.com/200/200" />
        sadalshd<br>
    </div>
</div>​

.popup-center {
    position: absolute;
    top: 50%;
    left: 50%;
}
.popup-center div {
    margin-left: -50%;
    margin-top: -50%;
}

【讨论】:

  • +1 几乎可以正常工作。我将进一步研究这个解决方案,但简单的示例似乎确实适用于大多数浏览器 - 而且我不必指定明确的高度或宽度。但是,我的居中元素在 IE7 中似乎不可见。
【解决方案5】:

对于左/右居中,您可以为元素指定宽度并将左右边距设置为“自动”。

对于垂直居中,它有点棘手。您可以使用百分比高度,但请记住将主体高度设置为 100%,否则将不起作用。

不知道这在IE7中是否有效,抱歉。

【讨论】:

  • 我不太明白设置百分比高度如何使元素垂直居中?除非您正在谈论在要居中的元素上方放置“间隔”元素。如果我遗漏了什么,请告诉我。
  • 抱歉,我的意思是为“顶部”指定一个百分比。我认为有更好的方法来获得垂直居中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-23
  • 2012-06-08
  • 2013-10-27
  • 2013-03-07
  • 2019-05-07
  • 2011-09-04
相关资源
最近更新 更多