这个问题在这里已经有了答案:如何将元素水平和垂直居中(26 个答案)如何垂直对齐 div 中的文本? (33 个回答) 3 年前关闭。
我有一个包含文本的 <div>
元素,我想将此 <div>
的内容垂直居中对齐。
这是我的 <div>
样式:
#box { 高度:170px;宽度:270px;背景:#000;字体大小:48px;颜色:#FFF;文本对齐:居中; }
实现这一目标的最佳方法是什么?
您可以尝试这种基本方法:
div {高度:100px;行高:100px;文本对齐:居中;边框:2px 虚线 #f69c55; }
但是它只适用于单行文本,因为我们将行的高度设置为与包含框元素相同的高度。
更通用的方法
这是垂直对齐文本的另一种方法。此解决方案适用于单行和多行文本,但仍需要固定高度的容器:
div {高度:100px;行高:100px;文本对齐:居中;边框:2px 虚线 #f69c55; } 跨度 { 显示:内联块;垂直对齐:中间;行高:正常; }
CSS 仅调整 <div>
的大小,通过将 <div>
的 line-height 设置为等于其高度来垂直居中对齐 <span>
,并使 <span>
成为 vertical-align: middle
的内联块。然后它将 <span>
的 line-height 设置回正常值,因此它的内容将在块内自然流动。
模拟表格显示
这是另一个选项,它可能不适用于较旧的 browsers that don't support display: table
and display: table-cell
(基本上只是 Internet Explorer 7)。使用 CSS 我们模拟表格行为(因为表格支持垂直对齐),HTML 与第二个示例相同:
div {显示:表;高度:100px;宽度:100%;文本对齐:居中;边框:2px 虚线 #f69c55; } 跨度 { 显示:表格单元格;垂直对齐:中间; }
使用绝对定位
该技术使用绝对定位的元素,将顶部、底部、左侧和右侧设置为 0。Smashing Magazine 中的一篇文章Absolute Horizontal And Vertical Centering In CSS对此进行了更详细的描述。
div {显示:弹性;证明内容:中心;对齐项目:居中;高度:100px;宽度:100%;边框:2px 虚线 #f69c55; }
另一种方法(此处尚未提及)是使用 Flexbox。
只需将以下代码添加到容器元素中:
display: flex;
justify-content: center; /* align horizontal */
align-items: center; /* align vertical */
弹性盒演示 1
.box { 高度:150px;宽度:400px;背景:#000;字体大小:24px;字体样式:倾斜;颜色:#FFF;文本对齐:居中;填充:0 20px;边距:20px;显示:弯曲;证明内容:中心; /* 水平对齐 */ align-items: center; /* 垂直对齐 */ }
或者,除了通过 容器 对齐内容,flexbox 还可以使用 auto margin 将 flex 项目 居中,当其中只有一个 flex 项目时flex 容器(如上面问题中给出的示例)。
因此,要使弹性项目水平和垂直居中,只需将其设置为 margin:auto
弹性盒演示 2
.box { 高度:150px;宽度:400px;背景:#000;字体大小:24px;字体样式:倾斜;颜色:#FFF;文本对齐:居中;填充:0 20px;边距:20px;显示:弯曲; } .box 跨度 { 边距:自动; }
注意:以上所有内容都适用于将项目置于水平行中时居中。这也是默认行为,因为默认情况下 flex-direction
的值为 row
。但是,如果需要在 垂直列 中布置弹性项目,则应在容器上设置 flex-direction: column
以将主轴设置为列,另外将 justify-content
和 align-items
属性现在以相反的方式工作,justify-content: center
垂直居中,align-items: center
水平居中)
flex-direction:列演示
.box { 高度:150px;宽度:400px;背景:#000;字体大小:18px;字体样式:倾斜;颜色:#FFF;显示:弯曲;弹性方向:列;证明内容:中心; /* 垂直对齐项目 */ align-items: center; /* 水平对齐项目 */ } p { margin: 5px; }
当 flex-direction 为 column...
"justify-content: center" - 垂直对齐
"align-items: center" - 水平对齐
开始使用 Flexbox 以了解其一些功能并获得最大浏览器支持的语法的一个好地方是 flexyboxes
此外,现在的浏览器支持非常好:caniuse
对于 display: flex
和 align-items
的跨浏览器兼容性,您可以使用以下内容:
display: -webkit-box;
display: -webkit-flex;
display: -moz-box;
display: -ms-flexbox;
display: flex;
-webkit-flex-align: center;
-ms-flex-align: center;
-webkit-align-items: center;
align-items: center;
height: 100%;
您可以通过添加以下 CSS 代码轻松地做到这一点:
display: table-cell;
vertical-align: middle;
这意味着你的 CSS 最终看起来像:
#box { 高度:90px;宽度:270px;背景:#000;字体大小:48px;字体样式:倾斜;颜色:#FFF;文本对齐:居中;边距顶部:20px;左边距:5px;显示:表格单元格;垂直对齐:中间; }
display: flex; justify-content: center; align-items: center;
。谢谢
供参考并添加更简单的答案:
纯 CSS:
.vertical-align {
position: relative;
top: 50%;
-webkit-transform: translateY(-50%);
-ms-transform: translateY(-50%);
transform: translateY(-50%);
}
或者作为 SASS/SCSS Mixin:
@mixin vertical-align {
position: relative;
top: 50%;
-webkit-transform: translateY(-50%);
-ms-transform: translateY(-50%);
transform: translateY(-50%);
}
使用者:
.class-to-center {
@include vertical-align;
}
通过 Sebastian Ekström 的博文Vertical align anything with just 3 lines of CSS:
由于元素被放置在“半像素”上,这种方法会导致元素模糊。解决方案是将其父元素设置为 preserve-3d。如下:
.parent-element {
-webkit-transform-style: preserve-3d;
-moz-transform-style: preserve-3d;
transform-style: preserve-3d;
}
我们生活在 2015 年以上,每个主要的现代浏览器都支持 Flex Box。
这将是从现在开始制作网站的方式。
学习吧!
所有功劳归此链接所有者@Sebastian Ekström Link;请通过这个。在行动 codepen 中看到它。通过阅读上述文章,我还创建了 a demo fiddle。
只需三行 CSS(不包括供应商前缀),我们就可以借助转换来做到这一点: translateY 垂直居中我们想要的任何内容,即使我们不知道它的高度。
CSS 属性变换通常用于旋转和缩放元素,但通过它的 translateY 函数,我们现在可以垂直对齐元素。通常这必须通过绝对定位或设置行高来完成,但这些需要您知道元素的高度或仅适用于单行文本等。
因此,为此,我们编写:
.element {
position: relative;
top: 50%;
transform: translateY(-50%);
}
这就是你所需要的。这是一种类似于绝对位置方法的技术,但好处是我们不必在元素上设置任何高度或在父级上设置位置属性。它开箱即用,即使在 Internet Explorer 9 中也是如此!
为了使它更简单,我们可以将其编写为带有供应商前缀的 mixin。
CSS3 flexbox 有一个小小的魔力:
/* 重要 */ section { display: flex;显示:-webkit-flex; } section p { /* 关键部分 */ margin: auto; } /* 不重要,着色和 UI */ section { height: 200px;宽度:60%;边距:自动;边框半径:20px;边框:3px 纯橙色;背景色:金色; } 部分 p { 文本对齐:中心;字体系列:Cantarell,Calibri;字体大小:15px;背景颜色:黄色;边框半径:20px;填充:15px; } 我是一个居中的盒子!
弹性盒子很棒!
提示:如果要使文本居中,请将上面标记为“关键部分”的行替换为以下行之一:
仅垂直:margin: auto 0;仅水平:margin: 0 auto;
正如我所注意到的,这个技巧也适用于网格(即 display: grid
)。
这是使用 flexbox 的另一个选项。
#container { 显示:弹性;高度:200px;背景:橙色; } .child { 边距:自动; }
结果
https://i.stack.imgur.com/6d5Tv.png
这是一篇关于在 css 中居中的好文章。 Check it out.
灵活的方法
div { 宽度:250px;最小高度:50px;行高:50px;文本对齐:居中;边框:1px 实心 #123456;边距底部:5px; } 跨度 { 显示:内联块;垂直对齐:中间;行高:正常; }
我看到了以前的答案,它们仅适用于该屏幕宽度(无响应)。对于响应式,您必须使用 flex。
例子:
div { display:flex; align-items:center; }
被接受为答案的解决方案非常适合使用与 div 的高度相同的 line-height
,但是当文本被换行或在两行中时,此解决方案无法完美运行。
如果文本被换行或在 div 内的多行上,请尝试这个。
#box
{
display: table-cell;
vertical-align: middle;
}
如需更多参考,请参阅:
垂直居中多行文本
6种使用CSS垂直居中的方法
您可以使用以下代码片段作为参考。它对我来说就像一个魅力:
html, 身体 { 高度:100%;边距:0;填充:0;宽度:100%; } 身体 { 显示:表; } .centered-text { 文本对齐:居中;显示:表格单元格;垂直对齐:中间; }
上述代码片段的输出如下:
https://i.stack.imgur.com/q9DkN.png
试试 this solution:
.EXTENDER { 位置:绝对;顶部:0px;左:0px;底部:0px;右:0px;宽度:100%;高度:100%;溢出-y:隐藏;溢出-x:隐藏; } .PADDER-CENTER { 宽度:100%;高度:100%;显示:-webkit-box;显示:-moz-box;显示:-ms-flexbox;显示:-webkit-flex;显示:弯曲; -webkit-box-pack:中心; -moz-box-pack:中心; -ms-flex-pack:中心; -webkit-justify-content:中心;证明内容:中心; -webkit-box-align:居中; -moz-box-align:居中; -ms-flex-align:居中; -webkit-align-items:居中;对齐项目:居中; }
使用 CSS+ 构建。
您还可以使用以下属性。
display: flex;
align-content: center;
justify-content : center;
另一种方式:
不要设置div
的height
属性,而是使用padding:
来实现效果。与 line-height 类似,它仅在您有一行文本时才有效。虽然这样的话,如果内容比较多,文字还是会居中,但是div本身会稍微大一些。
因此,不要使用:
div {
height: 120px;
line-height: 120px;
}
你可以说:
div {
padding: 60px 0; // Maybe 60 minus font-size divided by two, if you want to be exact
}
这会将 div
的顶部和底部 padding
设置为 60px
,将左侧和右侧 padding
设置为零,使 div
120 像素(加上字体的高度)高,并放置文本在 div 中垂直居中。
我不确定是否有人走 writing-mode
路线,但我认为它干净利落地解决了问题并且得到了广泛的支持:
.vertical { //border: 1px 纯绿色;写作模式:垂直lr;文本对齐:居中;高度:100%;宽度:100%; } .horizontal { //border: 1px 纯蓝色;显示:内联块;写作模式:水平-tb;宽度:100%;文本对齐:居中; } .content { 文本对齐:左;显示:内联块;边框:1px 实心#e0e0e0;填充:0.5em 1em;边界半径:1em; }
当然,这将适用于您需要的任何尺寸(除了 100% 的父尺寸)。如果您取消注释边界线,这将有助于您熟悉自己。
JSFiddle demo 供您摆弄。
Caniuse support:85.22% + 6.26% = 91.48%(甚至 Internet Explorer 也在!)
满足您所有的垂直对齐需求!
声明这个 Mixin:
@mixin vertical-align($position: relative) {
position: $position;
top: 50%;
-webkit-transform: translateY(-50%);
-ms-transform: translateY(-50%);
transform: translateY(-50%);
}
然后将其包含在您的元素中:
.element{
@include vertical-align();
}
更好的主意。你也可以这样做
正文,html {高度:100%; } .parent { 空白:nowrap;高度:100%;文本对齐:居中; } .parent:after { display: inline-block;垂直对齐:中间;高度:100%;内容: ''; } .centered { 显示:内联块;垂直对齐:中间;空白:正常; }
Lorem ipsum dolor sit amet.
对于单行文本(或单个字符),您可以使用此技术:
它可以在 #box
具有非固定的相对高度(%)时使用。
<div id="box"></div>
#box::before {
display: block;
content: "";
height: 50%;
}
#box::after {
vertical-align: top;
line-height: 0;
content: "TextContent";
}
查看现场演示 at JsBin(更易于编辑 CSS)或 JsFiddle(更易于更改结果框架的高度)。
如果您想在 HTML 中而不是在 CSS 中放置内部文本,那么您需要将文本内容包装在附加的 inline 元素中并编辑 #box::after
以匹配它。 (当然,应该删除 content:
属性。)
例如,<div id="box"><span>TextContent</span></div>
。在这种情况下,#box::after
应替换为 #box span
。
对于 Internet Explorer 8 支持,您必须将 ::
替换为 :
。
尝试转换属性:
#box { 高度:90px;宽度:270px;位置:绝对;最高:50%;左:50%;变换:翻译(-50%,-50%); }
一个非常简单且最强大的垂直对齐中心解决方案:
.outer-div { 高度:200px;宽度:200px;文本对齐:居中;边框:1px 实心#000; } .inner { 位置:相对;最高:50%;变换:translateY(-50%);红色; }
无论屏幕大小或 div
大小如何,以下代码都会将 div 置于屏幕中间:
.center-screen { 显示:弹性;弹性方向:列;证明内容:中心;对齐项目:居中;文本对齐:居中;最小高度:100vh; }
查看有关 flex
here 的更多详细信息。
简单而通用的方法是(如 Michielvoo's table approach):
[ctrv]{
display:table !important;
}
[ctrv] > *{ /* adressing direct discendents */
display: table-cell;
vertical-align: middle;
// text-align: center; /* optional */
}
在父标签上使用此属性(或等效类)甚至适用于许多子标签对齐:
<parent ctrv> <ch1/> <ch2/> </parent>
试试下面的代码:
display: table-cell;
vertical-align: middle;
div {高度:80%;宽度:100%;文本对齐:居中;显示:表格单元格;垂直对齐:中间;背景:#4CAF50;颜色:#fff;字体大小:50px;字体样式:斜体; }
我只想扩展 the answer from Michielvoo 以释放对行高和 div 高度呼吸的需求。它基本上只是一个简化版本,如下所示:
div { 宽度:250px; /* 高度:100px;行高:100px; */ 文本对齐:居中;边框:1px 实心 #123456;背景颜色:#bbbbff;填充:10px;边距:10px; } 跨度 { 显示:内联块;垂直对齐:中间;行高:正常; }
注意:包含 div
的 fixed-height
需要注释掉的 css
部分。
我需要一排可点击的大象,垂直居中,但不使用表格来解决 Internet Explorer 9 的一些奇怪问题。
我最终找到了最好的 CSS(满足我的需要),它与 Firefox、Chrome 和 Internet Explorer 11 配合得很好。可悲的是,Internet Explorer 9 仍在嘲笑我……
div { 边框:1px 蓝色虚线;显示:内联;行高:100px;高度:100px; } span { 边框:1px 纯红色;显示:内联块;行高:正常;垂直对齐:中间; } .out { 边框:3px 纯银;显示:内联块; }
显然您不需要边框,但它们可以帮助您了解它是如何工作的。
您可以使用 CSS 中的定位方法:
HTML:
<div class="relativediv">
<p>
Make me vertical align as center
</p>
</div>
CSS:
.relativediv{position:relative;border:1px solid #ddd;height:300px;width:300px}
.relativediv p{position:absolute:top:50%;transfrom:translateY(-50%);}
希望你也使用这种方法。
无论您想要垂直居中的样式意味着您可以尝试 display:table-cell
和 vertical-align:middle
。
例子:
#box { 显示:表格单元格;垂直对齐:中间;高度:90px;宽度:270px;背景:#000;字体大小:48px;字体样式:倾斜;颜色:#FFF;文本对齐:居中;边距顶部:20px;左边距:5px; }
如果您不关心它的视觉 3D 效果,请将其设置在 button
而不是 div
内。
#box { 高度:120px;宽度:300px;背景:#000;字体大小:48px;字体样式:倾斜;颜色:#FFF; }
绝对定位和拉伸
与上面的方法一样,首先将父元素和子元素的定位分别设置为相对和绝对。从那里情况有所不同。
在下面的代码中,我再次使用此方法将子元素水平和垂直居中,但您只能使用该方法进行垂直居中。
HTML
<div id="parent">
<div id="child">Content here</div>
</div>
CSS
#parent {position: relative;}
#child {
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
width: 50%;
height: 30%;
margin: auto;
}
这种方法的想法是通过将顶部、底部、右侧和左侧的值设置为 0 来尝试让子元素伸展到所有四个边缘。因为我们的子元素小于父元素,所以它不能到达所有四个边。
然而,将 auto 设置为所有四个边的边距会导致相反的边距相等,并将我们的子 div 显示在父 div 的中心。
不幸的是,上面的方法在 Internet Explorer 7 及更低版本中不起作用,并且像以前的方法一样,子 div 内的内容可能会变得太大,导致它被隐藏。
.element{position: relative;top: 50%;transform: translateY(-50%);}
在元素的 CSS 属性中添加这个小代码。太棒了。试试看!
不定期副业成功案例分享