如何在页面中垂直居中一个div?

29

我尝试在中垂直居中它(而不是水平居中)。此外,我不想指定高度或任何其他东西。我尝试添加一个具有100%高度和其他元素的包装器,但没有任何进展。你能帮我解决这个问题吗?

这里是jsFiddle

 <form name="signup" class="signup" action="signup.php" style="border: 1px solid #000; ">
     <input type="text" placeholder="Email"/><br>
     <input type="text" placeholder="Username"/><br>
     <input type="password" placeholder="Password"/><br>
     <button type="submit">Next</button>
 </form>​

1
说到高度,快速的答案总是“你不能”。HTML页面旨在垂直滚动,高度应根据内容自由变化。因此,没有适当的方法可以使用CSS和HTML垂直居中您的div。不过,如果您有兴趣学习,可能会有一些JavaScript/jQuery的解决方法。 - Carlo Moretti
1
把它放在一个表格中,使用valign属性怎么样?'<td valign="top|middle|bottom|baseline">' 这里还有更多的信息,你可能会发现有用的。http://phrogz.net/css/vertical-align/index.html - Rhys
2
可能是 https://dev59.com/KXVD5IYBdhLWcg3wL4gA 的重复问题。 - eddy147
我得去上班了,但是这个页面上有一些例子应该会有所帮助。http://www.jakpsatweb.cz/css/css-vertical-center-solution.html - Rhys
1
这是一个 jQuery 的 fiddle 示例:http://jsfiddle.net/23NUC/3/ - Carlo Moretti
显示剩余3条评论
7个回答

62

请查看此处经过编辑的jsFiddle

基本上,只需将您的内容置于<div class = "main"><div class = "wrapper"></div></div>中,并添加以下CSS:

html, body {
    height: 100%;
}
.main {
    height: 100%;
    width: 100%;
    display: table;
}
.wrapper {
    display: table-cell;
    height: 100%;
    vertical-align: middle;
}

1
为什么我必须要有一个主函数、包装器,然后才是我的对象...另外,我的页面主体有一个100%高度的背景图片,而高度属性会导致溢出。 - Hunter Mitchell
@EliteGamer 溢出来自于 paddingmargins,通过设置 margin: 0; padding: 0; 来移除它们,或者在您的页面中添加 CSS Normalize 以避免未来出现问题。这两个包装器是居中所必需的;如果您不想使用 JavaScript,那么这是唯一的方法。 - Chris

16
如果您有 flexbox 可用,则可以在不使用 display: table; 的情况下完成它。
代码示例:

html,
body {
  height: 100%;
  width: 100%;
}

.container {
  align-items: center;
  display: flex;
  justify-content: center;
  height: 100%;
  width: 100%;
}
<html>
  <body>
    <div class="container">
      <div class="content">
        This div will be centered
      </div>
    </div>
  </body>
</html>

Ta-da!垂直和水平居中的内容div。JSFiddle:https://jsfiddle.net/z0g0htm5/

主要参考自https://philipwalton.github.io/solved-by-flexbox/demos/vertical-centering/https://css-tricks.com/snippets/css/a-guide-to-flexbox/


我认为这是最好的答案。我希望我可以投多次赞。 - Radvylf Programs

12

更新:codesandbox.io

form {
    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 */     
}
<form name="signup" class="signup" action="signup.php" style="border: 1px solid #000; ">
     <input type="text" placeholder="Email"/><br>
     <input type="text" placeholder="Username"/><br>
     <input type="password" placeholder="Password"/><br>
     <button type="submit">Next</button>
 </form>

相关文章: 如何在所有浏览器中垂直居中一个div


1
这对我有用:

这在我的情况下有效:

Style.css

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

我发现这段代码片段here

1

您确实可以在不使用包装器的情况下垂直和水平居中单个容器。关键是要理解100%的高度和宽度的含义,它们表示相对于父元素的百分比。您必须将百分比链接到层次结构向上直到实际视口高度和宽度。

HTML 元素 <---> BODY 元素 <----> DIV 元素

在 DIV 中 100% 的高度会查找 BODY 的高度,BODY 再查找 HTML 的高度,HTML 最终查找视口的大小。为了使其正常工作,您不能在 CSS 中组合 HTML 和 BODY,而应分别处理它们。

* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

html {
  height: 100%;
  width: 100%;
}

body {
  height: 100%;
  width: 100%;
}

div {
  height: 100%;
  width: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
}
<html>
  <body>
    <div>
      Center me!
    </div>
  </body> 
</html>


0

一个带有表格包装的JSFiddle示例

在上述解决方案中,为html和body提供css,并使用"height: 100%"将要居中的表单包装在一个表格中。

代码示例

<html>
<body>    
<table height="100%" width="100%" border="1">
    <tr>
    <td>
    <form name="signup" class="signup" action="signup.php" style="border: 1px solid #000; ">

                <input type="text" placeholder="Email"/><br>

                <input type="text" placeholder="Username"/><br>

                <input type="password" placeholder="Password"/><br>

                <button type="submit">Next</button>

            </form>
        </td>
        </tr>
</table>    
</body>
</html>


这个似乎不居中... 为什么要发布一个没有完成要求的小例子? - Carlo Moretti
1
抱歉..忘记更新JSFiddle了...已经更新了http://jsfiddle.net/23NUC/4/ - bhatanant2

-2

CSS: width: 200px; margin: 0 auto;


1
目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何撰写好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接