我想用CSS垂直居中放置一个div。我不需要表或JavaScript,只需要纯CSS。我找到了一些解决方案,但都缺少Internet Explorer 6支持。
<body>
<div>Div to be aligned vertically</div>
</body>
如何在所有主要浏览器(包括Internet Explorer 6)中垂直居中放置div?
我想用CSS垂直居中放置一个div。我不需要表或JavaScript,只需要纯CSS。我找到了一些解决方案,但都缺少Internet Explorer 6支持。
<body>
<div>Div to be aligned vertically</div>
</body>
如何在所有主要浏览器(包括Internet Explorer 6)中垂直居中放置div?
当前回答
居中是CSS最困难的方面之一。
这些方法本身通常不难理解。相反,这更多是因为有很多方法可以将事情集中起来。
您使用的方法可能会有所不同,这取决于您试图居中的HTML元素,或者是水平居中还是垂直居中。
水平居中
水平对中元件通常比垂直对中元件更容易。下面是一些常见的元素,您可能希望水平居中,以及不同的方法。
使用CSS文本居中属性居中文本
要使文本或链接水平居中,只需使用文本对齐属性和值中心:
HTML
<div class="container">
<p>Hello, (centered) World!</p>
</div>
CSS
.container {
font-family: arial;
font-size: 24px;
margin: 25px;
width: 350px;
height: 200px;
outline: dashed 1px black;
}
p {
/* Center horizontally*/
text-align: center;
}
使用CSS边距自动居中分隔
使用值为0的速记边距属性,自动将块级元素(如div)水平居中:
HTML
<div class="container">
<div class="child"></div>
</div>
CSS
.container {
font-family: arial;
font-size: 24px;
margin: 25px;
width: 350px;
height: 200px;
outline: dashed 1px black;
}
.child {
width: 50px;
height: 50px;
background-color: red;
/* Center horizontally*/
margin: 0 auto;
}
使用Flexbox水平居中跳水
Flexbox是在页面上居中的最现代的方式,它使设计响应式布局比以前容易得多。然而,它在一些传统浏览器(如Internet Explorer)中并不完全受支持。
要使用Flexbox水平居中元素,只需将display:flex和justify content:center应用于父元素:
HTML
<div class="container">
<div class="child"></div>
</div>
CSS
.container {
font-family: arial;
font-size: 24px;
margin: 25px;
width: 350px;
height: 200px;
outline: dashed 1px black;
/* Center child horizontally*/
display: flex;
justify-content: center;
}
.child {
width: 50px;
height: 50px;
background-color: red;
}
垂直居中
如果没有像Flexbox这样的现代方法,将元素垂直居中可能是一件很麻烦的事。在这里,我们将介绍一些较旧的方法,首先垂直居中,然后向您展示如何使用Flexbox实现这一点。
如何使用CSS绝对定位和负边距使Div垂直居中
在很长一段时间里,这是垂直居中的常用方法。对于此方法,必须知道要居中的元素的高度。
首先,将父元素的position属性设置为relative。
然后,对于子元素,将position属性设置为absolute,并将top设置为50%:
HTML
<div class="container">
<div class="child"></div>
</div>
CSS
.container {
font-family: arial;
font-size: 24px;
margin: 25px;
width: 350px;
height: 200px;
outline: dashed 1px black;
/* Setup */
position: relative;
}
.child {
width: 50px;
height: 50px;
background-color: red;
/* Center vertically */
position: absolute;
top: 50%;
}
但这实际上只是将子元素的顶部边缘垂直居中。
要使子元素真正居中,请将margin-top属性设置为-(子元素高度的一半):
.container {
font-family: arial;
font-size: 24px;
margin: 25px;
width: 350px;
height: 200px;
outline: dashed 1px black;
/* Setup */
position: relative;
}
.child {
width: 50px;
height: 50px;
background-color: red;
/* Center vertically */
position: absolute;
top: 50%;
margin-top: -25px; /* Half this element's height */
}
使用变换和平移使Div垂直居中
如果您不知道要居中的元素的高度(或者即使您知道),这个方法是一个很好的技巧。
该方法与上述负边距方法非常相似。将父元素的位置属性设置为相对。
对于子元素,将position属性设置为absolute,并将top设置为50%。现在,不要使用负边距来真正居中子元素,只需使用transform:translate(0,-50%):
HTML
<div class="container">
<div class="child"></div>
</div>
CSS
.container {
font-family: arial;
font-size: 24px;
margin: 25px;
width: 350px;
height: 200px;
outline: dashed 1px black;
/* Setup */
position: relative;
}
.child {
width: 50px;
height: 50px;
background-color: red;
/* Center vertically */
position: absolute;
top: 50%;
transform: translate(0, -50%);
}
请注意,translate(0,-50%)是translateX(0)和translateY(-50%)的简写。您还可以编写transform:translateY(-50%)以垂直居中子元素。
垂直和水平居中
使用CSS绝对定位和负边距使Div垂直和水平居中
这与上述垂直居中元素的方法非常相似。和上次一样,您必须知道要居中的元素的宽度和高度。
将父元素的位置属性设置为相对。
然后将孩子的位置属性设置为绝对,顶部设置为50%,左侧设置为50%。这只会使子元素的左上角垂直和水平居中。
要使子元素真正居中,请将负上边距设置为子元素高度的一半,将负左边距设置为子元素宽度的一半:
HTML
<div class="container">
<div class="child"></div>
</div>
CSS
.container {
font-family: arial;
font-size: 24px;
margin: 25px;
width: 350px;
height: 200px;
outline: dashed 1px black;
/* Setup */
position: relative;
}
.child {
width: 50px;
height: 50px;
background-color: red;
/* Center vertically and horizontally */
position: absolute;
top: 50%;
left: 50%;
margin: -25px 0 0 -25px; /* Apply negative top and left margins to truly center the element */
}
其他回答
这在我的情况下有效(仅在现代浏览器中测试):
.textthatneedstobecentered {
margin: auto;
top: 0; bottom: 0;
}
下面是我可以构建的最好的全方位解决方案,以垂直和水平居中固定宽度、灵活高度的内容框。它已在Firefox、Opera、Chrome和Safari的最新版本中测试并运行。
.外部{显示:表格;位置:绝对;顶部:0;左:0;高度:100%;宽度:100%;}.中间{显示:表格单元格;垂直对齐:中间;}.内部{左边距:自动;右边距:自动;宽度:400px;/*你想要什么宽度*/}<div class=“outer”><div class=“middle”><div class=“inner”><h1>内容</h1><p>从前,一个沉闷的午夜</p></div></div></div>
查看动态内容的工作示例
我内置了一些动态内容来测试它的灵活性,并希望知道是否有人发现它有任何问题。它也可以很好地用于居中的覆盖——灯箱、弹出窗口等。
不幸的是,但并不令人惊讶的是,解决方案比人们希望的更复杂。同样不幸的是你需要在垂直居中的div周围使用额外的div。
对于符合标准的浏览器,如Mozilla、Opera、Safari等,您需要将外部div设置为显示为表,将内部div设置为表单元格-然后可以垂直居中。对于InternetExplorer,您需要将内部div绝对放置在外部div中,然后将顶部指定为50%。以下页面很好地解释了这一技术,并提供了一些代码示例:
CSS中的垂直居中未知高度的CSS垂直居中(兼容Internet Explorer 7)(Wayback Machine提供的存档文章)
还有一种使用JavaScript进行垂直居中的技术。内容与JavaScript和CSS的垂直对齐演示了这一点。
最好的做法是:
#vertalign{
height: 300px;
width: 300px;
position: absolute;
top: calc(50vh - 150px);
}
150像素,因为在本例中,这是div高度的一半。
仅垂直居中
如果您不关心InternetExplorer6和7,可以使用包含两个容器的技术。
外部容器:
应具有显示:table;
内部容器:
应具有显示:表格单元格;应垂直对齐:中间;
内容框:
应该有显示:inline块;
您可以将任何内容添加到内容框中,而不必考虑其宽度或高度!
演示:
正文{边距:0;}.外部容器{位置:绝对;显示:表格;宽度:100%;/*这可以是任意宽度*/高度:100%;/*这可能是任何高度*/背景:#ccc;}.内部容器{显示:表格单元格;垂直对齐:中间;}.居中内容{显示:内联块;背景:#fff;填充:20px;边框:1px实心#000;}<div class=“outer container”><div class=“内部容器”><div class=“居中内容”>马尔科姆在中间</div></div></div>
另请参见此Fiddle!
水平和垂直居中
如果要水平和垂直居中,还需要以下内容。
内部容器:
文本应对齐:居中;
内容框:
应重新调整水平文本对齐方式,例如文本对齐方式:左对齐;或文本对齐:右;,除非您希望文本居中
演示:
正文{边距:0;}.外部容器{位置:绝对;显示:表格;宽度:100%;/*这可以是任意宽度*/高度:100%;/*这可能是任何高度*/背景:#ccc;}.内部容器{显示:表格单元格;垂直对齐:中间;文本对齐:居中;}.居中内容{显示:内联块;文本对齐:左侧;背景:#fff;填充:20px;边框:1px实心#000;}<div class=“outer container”><div class=“内部容器”><div class=“居中内容”>马尔科姆在中间</div></div></div>
另请参见此Fiddle!