如何使用CSS将一个<div>
水平居中于另一个<div>
中?
<div id="outer">
<div id="inner">Foo foo</div>
</div>
#outer {
width: 100%;
height: 100%;
display: box;
box-orient: horizontal;
box-pack: center;
box-align: center;
}
<div id="outer">
<div id="inner">Foo foo</div>
</div>
我通常使用绝对定位来实现:
#inner {
left: 0;
right: 0;
margin-left: auto;
margin-right: auto;
position: absolute;
}
<div id="outer">
<div id="inner">Foo foo</div>
</div>
外部 div 不需要任何额外的属性即可正常工作。
最近我需要将一个“隐藏”的div(即display:none;
)居中放置在页面上,该div中包含了一个表单。我编写了以下jQuery代码来显示隐藏的div,并更新CSS内容以自动生成表格的宽度并更改边距以使其居中。(显示切换由单击链接触发,但不必要显示此代码。)
注意:我分享这段代码是因为Google将我带到了Stack Overflow的解决方案,并且除了隐藏元素没有任何宽度并且在显示之前无法调整大小/居中之外,其他都可以工作。
$(function(){
$('#inner').show().width($('#innerTable').width()).css('margin','0 auto');
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="inner" style="display:none;">
<form action="">
<table id="innerTable">
<tr><td>Name:</td><td><input type="text"></td></tr>
<tr><td>Email:</td><td><input type="text"></td></tr>
<tr><td>Email:</td><td><input type="submit"></td></tr>
</table>
</form>
</div>
适用于Firefox和Chrome浏览器:
<div style="width:100%;">
<div style="width: 50%; margin: 0px auto;">Text</div>
</div>
对于Internet Explorer、Firefox和Chrome:
<div style="width:100%; text-align:center;">
<div style="width: 50%; margin: 0px auto; text-align:left;">Text</div>
</div>
text-align:
属性对于现代浏览器来说是可选的,但在 Internet Explorer 怪异模式下,它对于支持旧版浏览器非常必要。
使用:
#outerDiv {
width: 500px;
}
#innerDiv {
width: 200px;
margin: 0 auto;
}
<div id="outerDiv">
<div id="innerDiv">Inner Content</div>
</div>
如果不想为其中一个元素设置宽度,另一种解决方案是使用CSS 3的transform
属性。
#outer {
position: relative;
}
#inner {
position: absolute;
left: 50%;
transform: translateX(-50%);
}
<div id="outer">
<div id="inner">Foo foo</div>
</div>
translateX(-50%)
将#inner
元素设置为其自身宽度的50%向左。您可以使用相同的技巧进行垂直对齐。
这里有一个Fiddle,展示了水平和垂直对齐。
更多信息请参见Mozilla开发者网络。
-webkit-transform: translate(-50%,0); -moz-transform: translate(-50%,0); -ms-transform: translate(-50%,0); -khtml-transform: translate(-50%,0); -o-transform: translate(-50%,0);
。这些前缀可以确保你的代码在不同浏览器中都能够正确地渲染出来,并保持一致的效果。 - Skippy le Grand GourouChris Coyier 在他的博客上写了一篇优秀的文章,名为“在未知尺寸下居中”。这是多种解决方案的综述。我发布了一个在此问题中没有发布的解决方案。它比Flexbox解决方案具有更好的浏览器支持,并且您不需要使用display: table;
,这可能会破坏其他东西。
/* This parent can be any width and height */
#outer {
text-align: center;
}
/* The ghost, nudged to maintain perfect centering */
#outer:before {
content: '.';
display: inline-block;
height: 100%;
vertical-align: middle;
width: 0;
overflow: hidden;
}
/* The element to be centered, can
also be of any width and height */
#inner {
display: inline-block;
vertical-align: middle;
width: 300px;
}
<div id="outer">
<div id="inner">Foo foo</div>
</div>
我最近发现了一种方法:
#outer {
position: absolute;
left: 50%;
}
#inner {
position: relative;
left: -50%;
}
<div id="outer">
<div id="inner">Foo foo</div>
</div>
两个元素的宽度必须相同才能正常工作。
#inner
设置以下规则:#inner { position:relative; left:50%; transform:translateX(-50%); }
。这适用于任何宽度。 - Jose Rui Santosdiv#outer {
height: 120px;
background-color: red;
}
div#inner {
width: 50%;
height: 100%;
background-color: green;
margin: 0 auto;
text-align: center; /* For text alignment to center horizontally. */
line-height: 120px; /* For text alignment to center vertically. */
}
<div id="outer" style="width:100%;">
<div id="inner">Foo foo</div>
</div>
<div id="outer" style="width:100%;">
<div class="inner"> Foo Text </div>
<div class="inner"> Foo Text </div>
<div class="inner"> Foo Text </div>
<div class="inner"> </div>
<div class="inner"> </div>
<div class="inner"> </div>
<div class="inner"> </div>
<div class="inner"> </div>
<div class="inner"> Foo Text </div>
</div>
那么请查看这个在JSFiddle上的示例。
根据我的经验,将以下属性应用于元素是最好的方式来实现水平居中:
text-align: center;
display: inline-block;
.container {
width: 100%;
height: 120px;
background: #CCC;
text-align: center;
}
.centered-content {
display: inline-block;
background: #FFF;
padding: 20px;
border: 1px solid #000;
}
<div class="container">
<div class="centered-content">
Center this!
</div>
</div>
请参见此Fiddle!
在我的经验中,居中一个盒子的最佳方式是使用一个额外的容器,并应用以下属性以使其同时垂直和水平居中:
display: table;
属性display: table-cell;
属性vertical-align: middle;
属性text-align: center;
属性display: inline-block;
属性.outer-container {
display: table;
width: 100%;
height: 120px;
background: #CCC;
}
.inner-container {
display: table-cell;
vertical-align: middle;
text-align: center;
}
.centered-content {
display: inline-block;
background: #FFF;
padding: 20px;
border: 1px solid #000;
}
<div class="outer-container">
<div class="inner-container">
<div class="centered-content">
Center this!
</div>
</div>
</div>
请参考this Fiddle!
display:flex;
是最容易记住的(Chrome 在 DevTools 中提供指南),并支持在两个轴上居中。 - Akshay K Nair