我想将一个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-top
和{{1} }值。是否有任何通用的解决方案,我可以使用它来margin-left
,无论其大小如何?
我发现使用innerDiv
可以将innerDiv水平对齐到中间。但是对于垂直对齐中间呢?
答案 0 :(得分:697)
垂直对齐中间作品,但您必须在父元素上使用table-cell
并在子元素上使用inline-block
。
这个解决方案在IE6&amp; 7.你的是更安全的方式。
但是,既然你用CSS3和HTML5标记了你的问题,我以为你不介意使用现代的解决方案。
经典解决方案(表格布局)
这是我原来的答案。它仍然可以正常工作,是最广泛支持的解决方案。表格布局将为impact your rendering performance,因此我建议您使用一种更现代的解决方案。
经过测试:
<强> 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;
}
♥我最喜欢的现代解决方案(flexbox)
我开始越来越多地使用flexbox its also well supported now这是迄今为止最简单的方法。
<强> CSS 强>
.cn {
display: flex;
justify-content: center;
align-items: center;
}
更多示例&amp;可能性: Compare all the methods on one pages
答案 1 :(得分:112)
实现这种水平和垂直居中的另一种方法是:
.Absolute-Center {
margin: auto;
position: absolute;
top: 0; left: 0; bottom: 0; right: 0;
}
答案 2 :(得分:45)
外部区必须将其position
设置为relative
或fixed
,并且内部区必须将其position
设置为absolute
,top
并left
至50%
并应用transform: translate(-50%, -50%)
。
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>
测试:
答案 3 :(得分:43)
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'属性的值,只要element的父元素具有高度或某些内容可以扩展其垂直大小。
答案 4 :(得分:16)
我没有把自己绑在一个难以编写和难以维护的CSS(这也需要仔细的跨浏览器验证!)的结中。我发现放弃CSS并使用非常简单的HTML要好得多1.0:
<table id="outerDiv" cellpadding="0" cellspacing="0" border="0">
<tr>
<td valign="middle" id="innerDiv">
</td>
</tr>
</table>
这可以完成原始海报所需的一切,并且功能强大且易于维护。
答案 5 :(得分:5)
我个人更喜欢使用隐藏的伪元素来跨越外部容器的整个高度,并将其与其他内容垂直对齐。 克里斯科伊尔有一篇关于这项技术的好文章。 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 :(得分:4)
只需将容器设置为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;
}
&#13;
<div class="cn">
<div class="inner">Item 1</div>
<div class="inner">Item 2</div>
</div>
&#13;
答案 7 :(得分:4)
#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>
你可以通过简单地添加上面提到的css样式来实现。祝一切顺利。查询写评论
答案 8 :(得分:3)
未设置height
时(自动);你可以给内部div一些填充(顶部和底部)使其垂直居中:
<div>
<div style="padding-top:20px;padding-bottom:20px">
<!--content-->
</div>
</div>
答案 9 :(得分:2)
我使用以下解决方案一年多来,它也适用于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>
答案 10 :(得分:2)
这对我有用。可以定义外部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;
}
&#13;
<div class="outer">
<div class="inner">
Put here your text or div content!
</div>
</div>
&#13;
答案 11 :(得分:2)
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>
答案 12 :(得分:2)
Fiddle Link&lt; http://jsfiddle.net/dGHFV/2515/&GT;
试试这个
#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;
}
答案 13 :(得分:2)
如果你在阅读上面给出的奇妙答案后仍然不明白。
以下是两个如何实现它的简单示例。
.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>
.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的浏览器兼容性。
答案 14 :(得分:1)
我想展示另一种跨浏览器的方法,该方法可以使用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 allways 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>
输出:
答案 15 :(得分:1)
这将回到IE6!
IE6上也需要 <!DOCTYPE html>
!
[将强制IE6默认严格模式]。
(当然,盒子着色仅用于演示目的)
#outer{
width: 205px;
height: 205px;
margin: auto;
text-align: center;
}
#inner{
text-align: left;
vertical-align: middle;
width: 120px;
height: 120px;
display: inline-block;
}
#center{
height: 100%; width:0px;
vertical-align: middle;
display: inline-block;
}
div {background: rgba(0,128,255,.6)}
<div id=outer>
<div id=center></div><div id=inner> The inner DIV
</div>
</div>
答案 16 :(得分:1)
您可以使用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>
答案 17 :(得分:1)
尝试像这样对齐内部元素:
top: 0;
bottom: 0;
margin: auto;
display: table;
当然:
position: absolute;
答案 18 :(得分:1)
您可以使用简单的javascript(jQuery)块执行此操作。
<强> CSS 强>:
#outerDiv{
height:100%;
}
<强>的Javascript 强>:
<script type="text/javascript">
$(document).ready(function () {
$("#innerDiv").css('top', ($(window).height() - $("#content").height()) / 2);
});
</script>
答案 19 :(得分:1)
对于没有指定高度值的innerdiv,没有纯css解决方案使其垂直居中。一个javascript解决方案可以获取innerdiv的offsetHeight,然后计算style.marginTop。
答案 20 :(得分:0)
在父元素上对齐文本,在子元素上显示内联块。这将集中所有任何东西。我相信它的称呼是“块浮动”。
<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>
这也是漂浮的好选择,祝你好运!
答案 21 :(得分:0)
#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 :(得分:0)
垂直和水平居中对齐:
#parentDiv{
display:table;
text-align:center;
}
#child {
display:table-cell;
vertical-align:middle;
}
答案 23 :(得分:-6)
我知道这个问题是在一年前创建的... 无论如何,感谢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;
}