提问人:Abdu 提问时间:9/17/2008 最后编辑:Youssouf OumarAbdu 更新时间:7/30/2023 访问量:1950971
如何垂直对齐 div 中的元素?
How can I vertically align elements in a div?
问:
我有一个带有两个图像和一个.所有这些都需要在 div 内垂直对齐,彼此相邻。其中一个图像需要定位在 中。div
h1
absolute
div
这需要什么 CSS 才能在所有常见的浏览器上运行?
<div id="header">
<img src=".." ></img>
<h1>testing...</h1>
<img src="..."></img>
</div>
答:
<div id="header" style="display: table-cell; vertical-align:middle;">
...
或者 CSS
.someClass
{
display: table-cell;
vertical-align:middle;
}
评论
table-cell
vertical-align: middle;
默认情况下,h1 是一个块元素,它将在第一个 img 之后的行上呈现,并将导致第二个 img 出现在块后面的行上。
为了阻止这种情况的发生,您可以将 h1 设置为具有内联流行为:
#header > h1 { display: inline; }
至于将 img 绝对定位在 div 中,您需要将包含的 div 设置为具有“已知大小”,然后才能正常工作。根据我的经验,您还需要将位置属性从默认值更改为 - position: relative 对我有用:
#header { position: relative; width: 20em; height: 20em; }
#img-for-abs-positioning { position: absolute; top: 0; left: 0; }
如果你能做到这一点,你可能想尝试逐步从 div.header 中删除高度、宽度、位置属性,以获得所需的最小属性,以获得你想要的效果。
更新:
下面是一个适用于 Firefox 3 的完整示例:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<title>Example of vertical positioning inside a div</title>
<style type="text/css">
#header > h1 { display: inline; }
#header { border: solid 1px red;
position: relative; }
#img-for-abs-positioning { position: absolute;
bottom: -1em; right: 2em; }
</style>
</head>
<body>
<div id="header">
<img src="#" alt="Image 1" width="40" height="40" />
<h1>Header</h1>
<img src="#" alt="Image 2" width="40" height="40"
id="img-for-abs-positioning" />
</div>
</body>
</html>
评论
所有这些都需要在 div 中垂直对齐
如何对齐?图像的顶部与文本的顶部对齐?
其中一个图像需要在 div 中绝对定位。
相对于 DIV 的绝对定位?也许你可以勾勒出你在寻找什么......?
FD描述了绝对定位的步骤,以及调整元素的显示,使图像与它内联显示。为此,我要补充一点,您可以使用样式对齐图像:H1
vertical-align
#header h1 { display: inline; }
#header img { vertical-align: middle; }
...这会将标题和图像放在一起,顶部边缘对齐。存在其他对齐选项;请参阅文档。您可能还会发现删除 DIV 并将图像移动到元素内是有益的 - 这为容器提供了语义值,并且无需调整 :H1
H1
<h1 id=header">
<img src=".." ></img>
testing...
<img src="..."></img>
</h1>
哇,这个问题很受欢迎。这是基于对物业的误解。这篇优秀的文章解释了它:vertical-align
了解垂直对齐
,或Gavin Kistner的“如何(不)垂直居中内容”。
“如何在 CSS 中居中”是一个很棒的 Web 工具,它有助于为不同情况找到必要的 CSS 居中属性。
简而言之(并防止链接腐烂):
- 内联元素(并且只有内联元素)可以通过 在其上下文中垂直对齐。但是,“上下文”不是整个父容器高度,而是它们所在的文本行的高度。jsfiddle 示例
vertical-align: middle
- 对于块元素,垂直对齐更难,并且很大程度上取决于具体情况:
- 如果内部元素可以具有固定高度,则可以设置其位置并指定其 、 和 位置。jsfiddle 示例
absolute
height
margin-top
top
- 如果居中元素由一条线组成,并且其父高度是固定的,则只需设置容器以填充其高度即可。根据我的经验,这种方法非常通用。jsfiddle 示例
line-height
- ...这样的特殊情况还有很多。
- 如果内部元素可以具有固定高度,则可以设置其位置并指定其 、 和 位置。jsfiddle 示例
评论
vertical-align: middle
inline-block
table-cell
line-height
vertical-align
它对我有用:
.vcontainer {
min-height: 10em;
display: table-cell;
vertical-align: middle;
}
评论
margin : 0 auto
display: table-cell
使用此公式,它将始终无裂缝地工作:
#outer {height: 400px; overflow: hidden; position: relative;}
#outer[id] {display: table; position: static;}
#middle {position: absolute; top: 50%;} /* For explorer only*/
#middle[id] {display: table-cell; vertical-align: middle; width: 100%;}
#inner {position: relative; top: -50%} /* For explorer only */
/* Optional: #inner[id] {position: static;} */
<div id="outer">
<div id="middle">
<div id="inner">
any text
any height
any content, for example generated from DB
everything is vertically centered
</div>
</div>
</div>
评论
我一个朋友的技巧:
div:before {content:" "; display:inline-block; height:100%; vertical-align:middle;}
div p {display:inline-block;}
<div style="height:100px; border:1px solid;">
<p style="border:1px dotted;">I'm vertically centered.</p>
</div>
在这里演示。
评论
我使用了这个非常简单的代码:
div.ext-box { display: table; width:100%;}
div.int-box { display: table-cell; vertical-align: middle; }
<div class="ext-box">
<div class="int-box">
<h2>Some txt</h2>
<p>bla bla bla</p>
</div>
</div>
显然,无论您使用 a 还是 ,结果都不会改变。.class
#id
评论
只是这个:
<div>
<table style="width: 100%; height: 100%">
<tr>
<td style="width: 100%; height: 100%; vertical-align: middle;">
What ever you want vertically-aligned
</td>
</tr>
</table>
</div>
div 内部的单单元格表处理垂直对齐,并向后兼容石器时代!
只需在 div 中使用一个单元格表即可!只需将单元格和表格高度和 with 设置为 100%,您就可以使用垂直对齐。
div 内部的单单元格表处理垂直对齐,并向后兼容石器时代!
这里只是另一种(响应式)方法:
html,
body {
height: 100%;
}
body {
margin: 0;
}
.table {
display: table;
width: auto;
table-layout:auto;
height: 100%;
}
.table:nth-child(even) {
background: #a9edc3;
}
.table:nth-child(odd) {
background: #eda9ce;
}
.tr {
display: table-row;
}
.td {
display: table-cell;
width: 50%;
vertical-align: middle;
}
http://jsfiddle.net/herrfischerhamburg/JcVxz/
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
<head>
<style type="text/css">
#style_center { position:relative; top:50%; left:50%; }
#style_center_absolute { position:absolute; top:50px; left:50px; }
<!--#style_center { position:relative; top:50%; left:50%; height:50px; margin-top:-25px; }-->
</style>
</head>
<body>
<div style="height:200px; width:200px; background:#00FF00">
<div id="style_center">+</div>
</div>
</body>
</html>
几乎所有的方法都需要指定高度,但通常我们没有任何高度。
所以这里有一个 CSS 3 三行技巧,不需要知道高度。
.element {
position: relative;
top: 50%;
transform: translateY(-50%);
}
即使在 Internet Explorer 9 中也支持此功能。
替换为其供应商前缀:
.element {
position: relative;
top: 50%;
-webkit-transform: translateY(-50%);
-ms-transform: translateY(-50%);
transform: translateY(-50%);
}
评论
我已经使用以下解决方案(没有定位和线高)一年多了。它也适用于 Internet Explorer 7 和 Internet Explorer 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>
这是我个人对 .i
div
[HTML全文]
<div class="circle">
<i class="fa fa-plus icon">
</i></div>
CSS的
.circle {
border-radius: 50%;
color: blue;
background-color: red;
height:100px;
width:100px;
text-align: center;
line-height: 100px;
}
.icon {
font-size: 50px;
vertical-align: middle;
}
要将块元素定位到中心(适用于 Internet Explorer 9 及更高版本),它需要一个包装器:div
.vcontainer {
position: relative;
top: 50%;
transform: translateY(-50%);
-webkit-transform: translateY(-50%);
}
评论
我的诀窍是在 div 中放置一个具有一行一列的表,设置 100% 的宽度和高度,以及属性 vertical-align:middle:
<div>
<table style="width:100%; height:100%;">
<tr>
<td style="vertical-align:middle;">
BUTTON TEXT
</td>
</tr>
</table>
</div>
小提琴:http://jsfiddle.net/joan16v/sbqjnn9q/
评论
现在 Flexbox 支持正在增加,应用于包含元素的这个 CSS 将垂直居中所有包含的项目(除了那些指定对齐方式的项目,例如 align-self:start
)
.container {
display: flex;
align-items: center;
}
如果还需要面向 Internet Explorer 10 及更早版本 (< 4.4 (KitKat)) Android 浏览器,请使用带前缀的版本:
.container {
display: -ms-flexbox;
display: -webkit-flex;
display: flex;
-ms-flex-align: center;
-webkit-align-items: center;
-webkit-box-align: center;
align-items: center;
}
评论
对我来说,它是这样工作的:
<div style="width:70px; height:68px; float:right; display: table-cell; line-height: 68px">
<a href="javascript:void(0)" style="margin-left: 4px; line-height: 2" class="btn btn-primary">Login</a>
</div>
使用 Bootstrap 类将“a”元素转换为按钮,现在它垂直居中在外部“div”内。
使用 CSS 垂直居中,您可以让外部容器像表格一样工作,而内容像表格单元格一样。在这种格式中,您的对象将保持居中。:)
例如,我在 JSFiddle 中嵌套了多个对象,但核心思想是这样的:
[HTML全文]
<div class="circle">
<div class="content">
Some text
</div>
</div>
CSS的
.circle {
/* Act as a table so we can center vertically its child */
display: table;
/* Set dimensions */
height: 200px;
width: 200px;
/* Horizontal center text */
text-align: center;
/* Create a red circle */
border-radius: 100%;
background: red;
}
.content {
/* Act as a table cell */
display: table-cell;
/* And now we can vertically center! */
vertical-align: middle;
/* Some basic markup */
font-size: 30px;
font-weight: bold;
color: white;
}
多对象示例:
[HTML全文]
<div class="container">
<div class="content">
<div class="centerhoriz">
<div class="circle">
<div class="content">
Some text
</div><!-- content -->
</div><!-- circle -->
<div class="square">
<div class="content">
<div id="smallcircle"></div>
</div><!-- content -->
</div><!-- square -->
</div><!-- center-horiz -->
</div><!-- content -->
</div><!-- container -->
CSS的
.container {
display: table;
height: 500px;
width: 300px;
text-align: center;
background: lightblue;
}
.centerhoriz {
display: inline-block;
}
.circle {
display: table;
height: 200px;
width: 200px;
text-align: center;
background: red;
border-radius: 100%;
margin: 10px;
}
.square {
display: table;
height: 200px;
width: 200px;
text-align: center;
background: blue;
margin: 10px;
}
.content {
display: table-cell;
vertical-align: middle;
font-size: 30px;
font-weight: bold;
color: white;
}
#smallcircle {
display: inline-block;
height: 50px;
width: 50px;
background: green;
border-radius: 100%;
}
结果
https://jsfiddle.net/martjemeyer/ybs032uc/1/
我们可以使用 CSS 函数计算来计算元素的大小,然后相应地定位子元素。
HTML 示例:
<div class="box">
<span><a href="#">Some Text</a></span>
</div>
和 CSS:
.box {
display: block;
background: #60D3E8;
position: relative;
width: 300px;
height: 200px;
text-align: center;
}
.box span {
font: bold 20px/20px 'source code pro', sans-serif;
position: absolute;
left: 0;
right: 0;
top: calc(50% - 10px);
}
a {
color: white;
text-decoration: none;
}
在这里创建的演示: https://jsfiddle.net/xnjq1t22/
此解决方案适用于响应式和。div
height
width
注意:calc 函数未测试与旧浏览器的兼容性。
我找到了一种新的解决方法,可以使用 CSS 3 垂直对齐 div 中的多个文本行(我还使用 bootstrap v3 网格系统来美化 UI),如下所示:
.immediate-parent-of-text-containing-div {
height: 50px; /* Or any fixed height that suits you. */
}
.text-containing-div {
display: inline-grid;
align-items: center;
text-align: center;
height: 100%;
}
根据我的理解,包含元素的文本的直接父级必须具有一定的高度。
垂直和水平对齐元素
使用其中任何一个。结果是一样的:
- 引导程序 4
- CSS3的
1. 引导程序 4.3+
对于垂直对齐:d-flex align-items-center
对于水平对齐:d-flex justify-content-center
对于垂直和水平对齐:d-flex align-items-center justify-content-center
.container {
height: 180px;
width:100%;
background-color: blueviolet;
}
.container > div {
background-color: white;
padding: 1rem;
}
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"
rel="stylesheet"/>
<div class="d-flex align-items-center justify-content-center container">
<div>I am in Center</div>
</div>
2.CSS 3
.container {
height: 180px;
width:100%;
background-color: blueviolet;
}
.container > div {
background-color: white;
padding: 1rem;
}
.center {
display: flex;
align-items: center;
justify-content: center;
}
<div class="container center">
<div>I am in Center</div>
</div>
评论
.outer {
display: flex;
align-items: center;
justify-content: center;
}
评论
justify-content: center
使用 display flex 时,首先需要包裹要对齐的项的容器:
<div class="outdiv">
<div class="indiv">
<span>test1</span>
<span>test2</span>
</div>
</div>
然后应用以下 CSS 内容来包装 div 或 outdiv 在我的示例中:
.outdiv {
display: flex;
justify-content: center;
align-items: center;
}
评论
我最喜欢的方法是使用 CSS 网格:
/* technique */
.wrapper {
display: inline-grid;
grid-auto-flow: column;
align-items: center;
justify-content: center;
}
/* visual emphasis */
.wrapper {
border: 1px solid red;
height: 180px;
width: 400px;
}
img {
width: 100px;
height: 80px;
background: #fafafa;
}
img:nth-child(2) {
height: 120px;
}
<div class="wrapper">
<img src="https://source.unsplash.com/random/100x80/?bear">
<img src="https://source.unsplash.com/random/100x120/?lion">
<img src="https://source.unsplash.com/random/100x80/?tiger">
</div>
将 child() 居中对齐的四种方法。div
- 绝对定位方式
- Flexbox 方法
- Transform/translate 方法
- CSS 网格方法
浏览器对 CSS 网格的支持
/* Absolute Positioning Method */
.parent1 {
background: darkcyan;
width: 150px;
height: 150px;
position: relative;
}
.child1 {
background: white;
height: 30px;
width: 30px;
position: absolute;
top: 50%;
left: 50%;
margin: -15px;
}
/* Flexbox Method */
.parent2 {
display: flex;
justify-content: center;
align-items: center;
background: darkcyan;
width: 150px;
height: 150px;
}
.child2 {
background: white;
height: 30px;
width: 30px;
}
/* Transform/Translate Method */
.parent3 {
position: relative;
width: 150px;
height: 150px;
background: darkcyan;
}
.child3 {
background: white;
height: 30px;
width: 30px;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
/* CSS grid */
.parent4, .parent5 {
position: relative;
width: 150px;
height: 150px;
background: darkcyan;
display: grid;
place-items: center;
}
.child4, .child5 {
background: white;
height: 30px;
width: 30px;
}
.parent5 {
display: grid;
justify-items: centre;
align-content: centre;
}
<div class="parent1">
<div class="child1"></div>
</div>
<hr />
<div class="parent2">
<div class="child2"></div>
</div>
<hr />
<div class="parent3">
<div class="child3"></div>
</div>
<hr />
<div class="parent4">
<div class="child4"></div>
</div>
<hr />
<div class="parent5">
<div class="child5"></div>
</div>
仅使用 Bootstrap 类:
- div:
class="container d-flex"
- div 中的元素:
class="m-auto"
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.3/css/bootstrap.min.css" crossorigin="anonymous">
<div class="container d-flex mt-5" style="height:110px; background-color: #333;">
<h2 class="m-auto"><a href="https://hovermind.com/">H➲VER➾M⇡ND</a></h2>
</div>
我尝试使用 CSS flex 来做到这一点,但如果对象超出块,它会截断对象(使用“overflow: auto”)。
通过实验,我发现,如果您使用 Grid,则很容易将任何对象(线或块)居中。
我真的很喜欢这个解决方案,所以我在CMS Effcore中实现了它。
下面是一个代码示例:
<head>
<style>
[data-id^='example-'] {
max-width: 800px;
height: 200px;
margin: 20px auto;
background: gray;
}
[data-id^='example-'] img {
width: 50px;
height: 50px;
border: 1px solid black;
background: gray;
}
</style>
</head>
<body>
<div data-id="example-1">
<img src="gallery/pictures/thumbnail-01.png">
</div>
<div data-id="example-2">
<img src="gallery/pictures/thumbnail-01.png">
</div>
</body>
</html>
通过网格的示例:
/*
┌─────┬───────────────────────┬─────┐
│ 1fr │ 1fr │ 1fr │
├─────┼───────────────────────┼─────┤
│ │ ▲ │ │
│ │ ◀┼──────────────────▶ │ │
│ 1fr │ │ 1px|max-content │ 1fr │
│ │ │ │ │
│ │ ▼ │ │
├─────┼───────────────────────┼─────┤
│ 1fr │ 1fr │ 1fr │
└─────┴───────────────────────┴─────┘
*/
[data-id='example-1'] {
display: grid;
grid-template-columns: 1fr minmax(1px, max-content) 1fr;
grid-template-rows : 1fr minmax(1px, max-content) 1fr;
}
[data-id='example-1'] img {
grid-column-start: 2;
grid-row-start: 2;
}
通过“vertical-align”的示例。
[data-id='example-2'] {
text-align: center;
white-space: nowrap;
}
[data-id='example-2']:before {
content: '';
display: inline-block;
height: 100%;
vertical-align: middle;
}
[data-id='example-2'] img {
vertical-align: middle;
}
评论