ChatGPT解决这个技术问题 Extra ChatGPT

如何使用 CSS 垂直居中文本? [复制]

这个问题在这里已经有了答案:如何将元素水平和垂直居中(26 个答案)如何垂直对齐 div 中的文本? (33 个回答) 3 年前关闭。

我有一个包含文本的 <div> 元素,我想将此 <div> 的内容垂直居中对齐。

这是我的 <div> 样式:

#box { 高度:170px;宽度:270px;背景:#000;字体大小:48px;颜色:#FFF;文本对齐:居中; }

Lorem ipsum dolor sit

实现这一目标的最佳方法是什么?

#box{line-height: -moz-block-height;}
您可以使用垂直对齐:中间;
有一些 css 中心生成器有助于决定使用哪种定心解决方案是有效的。 Fe 我使用this one

1
14 revs, 7 users 76%

您可以尝试这种基本方法:

div {高度:100px;行高:100px;文本对齐:居中;边框:2px 虚线 #f69c55; }

你好,世界!

但是它只适用于单行文本,因为我们将行的高度设置为与包含框元素相同的高度。

更通用的方法

这是垂直对齐文本的另一种方法。此解决方案适用于单行和多行文本,但仍需要固定高度的容器:

div {高度:100px;行高:100px;文本对齐:居中;边框:2px 虚线 #f69c55; } 跨度 { 显示:内联块;垂直对齐:中间;行高:正常; }

Hello World!

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; } 跨度 { 显示:表格单元格;垂直对齐:中间; }

Hello World!

使用绝对定位

该技术使用绝对定位的元素,将顶部、底部、左侧和右侧设置为 0。Smashing Magazine 中的一篇文章Absolute Horizontal And Vertical Centering In CSS对此进行了更详细的描述。

div {显示:弹性;证明内容:中心;对齐项目:居中;高度:100px;宽度:100%;边框:2px 虚线 #f69c55; }

Hello World!


因为如果 div 或 text 更改或添加更多内容就会出错。
但这就是他所说的,如果您知道将使用多少文本,则完全可以接受……但是下面的解决方案更加灵活
第一个选项中可能还需要“填充:0”
但我想将文本仅垂直居中而不是水平居中,那么解决方案是什么?
M
Mauricio Gracia Gutierrez

另一种方法(此处尚未提及)是使用 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; /* 垂直对齐 */ }

Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh

或者,除了通过 容器 对齐内容,flexbox 还可以使用 auto margin flex 项目 居中,当其中只有一个 flex 项目时flex 容器(如上面问题中给出的示例)。

因此,要使弹性项目水平和垂直居中,只需将其设置为 margin:auto

弹性盒演示 2

.box { 高度:150px;宽度:400px;背景:#000;字体大小:24px;字体样式:倾斜;颜色:#FFF;文本对齐:居中;填充:0 20px;边距:20px;显示:弯曲; } .box 跨度 { 边距:自动; }

margin:auto on a flex item 水平和垂直居中

注意:以上所有内容都适用于将项目置于水平行中时居中。这也是默认行为,因为默认情况下 flex-direction 的值为 row。但是,如果需要在 垂直列 中布置弹性项目,则应在容器上设置 flex-direction: column 以将主轴设置为列,另外将 justify-contentalign-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: flexalign-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;

当某些文本为 1 行而其他文本为 2 行时,或者任何时候您有不同的高度元素时,这非常有效。对我来说最好的答案。
必须使用该解决方案,它也适用于内部文本。虽然必须添加 height: 100%;
A
Ariful Islam

您可以通过添加以下 CSS 代码轻松地做到这一点:

display: table-cell;
vertical-align: middle;

这意味着你的 CSS 最终看起来像:

#box { 高度:90px;宽度:270px;背景:#000;字体大小:48px;字体样式:倾斜;颜色:#FFF;文本对齐:居中;边距顶部:20px;左边距:5px;显示:表格单元格;垂直对齐:中间; }

一些文字


不过,看起来这会杀死边距属性。
对我有用,如果我将父 div 设置为 display: flex; justify-content: center; align-items: center;。谢谢
在铬上不起作用..?
P
Peter Mortensen

供参考并添加更简单的答案:

纯 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

这将是从现在开始制作网站的方式。

学习吧!


在别人不工作的时候工作
P
Peter Mortensen

所有功劳归此链接所有者@Sebastian Ekström Link;请通过这个。在行动 codepen 中看到它。通过阅读上述文章,我还创建了 a demo fiddle

只需三行 CSS(不包括供应商前缀),我们就可以借助转换来做到这一点: translateY 垂直居中我们想要的任何内容,即使我们不知道它的高度。

CSS 属性变换通常用于旋转和缩放元素,但通过它的 translateY 函数,我们现在可以垂直对齐元素。通常这必须通过绝对定位或设置行高来完成,但这些需要您知道元素的高度或仅适用于单行文本等。

因此,为此,我们编写:

.element {
    position: relative;
    top: 50%;
    transform: translateY(-50%);
} 

这就是你所需要的。这是一种类似于绝对位置方法的技术,但好处是我们不必在元素上设置任何高度或在父级上设置位置属性。它开箱即用,即使在 Internet Explorer 9 中也是如此!

为了使它更简单,我们可以将其编写为带有供应商前缀的 mixin。


即使对于文本和图像组合,这也对我有用
M
MAChitgarha

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)。


您能否解释一下为什么在这种情况下 flex 会对段落居中产生这种影响?
@elena事实上,我不知道为什么,我在尝试时发现了。但是,这将是较新版本的 CSS 的考虑因素。例如,如果您在这种情况下将显示更改为网格,它将与弹性框一样工作。我认为网格和 flexbox 带有新的特性来弥补 CSS 之前的缺陷;而这个技巧就是其中之一。
请不要进行只会影响帖子或线程的更改。对帖子的编辑,甚至是您自己的,都应该是实质性的。
@TylerH 对不起,但我不太明白你的意思。为什么要撞?!虽然这不是一个很好的理由,但我已经看到了很多微小的编辑。例如,请参阅下面帖子的最新编辑。另外,请查看 this。我不明白它会产生什么重大(甚至是次要)影响。另外,即使我们认为您是正确的,对整个答案投反对票也是对此类行动的不良反应。
@MAChitgarha 这与编辑建议没有任何关系;这里的问题是您的更改不会对内容产生任何影响/改进;所做的编辑只是为了“碰撞”帖子。另外,我不确定您在谈论关于否决票的内容。
T
Teocci

这是使用 flexbox 的另一个选项。

#container { 显示:弹性;高度:200px;背景:橙色; } .child { 边距:自动; }

Lorem ipsum dolor sit amet consectetur adipisicing elit.鼹鼠,尼莫。

结果

https://i.stack.imgur.com/6d5Tv.png

这是一篇关于在 css 中居中的好文章。 Check it out.


P
Peter Mortensen

灵活的方法

div { 宽度:250px;最小高度:50px;行高:50px;文本对齐:居中;边框:1px 实心 #123456;边距底部:5px; } 跨度 { 显示:内联块;垂直对齐:中间;行高:正常; }

Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
< /div>
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Lorem ipsum dolor sit amet.


D
D Malan

我看到了以前的答案,它们仅适用于该屏幕宽度(无响应)。对于响应式,您必须使用 flex。

例子:

div { display:flex; align-items:center; }

S
Spencer O'Reilly

被接受为答案的解决方案非常适合使用与 div 的高度相同的 line-height,但是当文本被换行或在两行中时,此解决方案无法完美运行。

如果文本被换行或在 div 内的多行上,请尝试这个。

#box
{
  display: table-cell;
  vertical-align: middle;
}

如需更多参考,请参阅:

垂直居中多行文本

6种使用CSS垂直居中的方法


T
Teocci

您可以使用以下代码片段作为参考。它对我来说就像一个魅力:

html, 身体 { 高度:100%;边距:0;填充:0;宽度:100%; } 身体 { 显示:表; } .centered-text { 文本对齐:居中;显示:表格单元格;垂直对齐:中间; }

是的,这是我的着陆页

正在建设中,即将推出!!!

上述代码片段的输出如下:

https://i.stack.imgur.com/q9DkN.png


P
Peter Mortensen

试试 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+ 构建。


S
Sender

您还可以使用以下属性。

display: flex; 
align-content: center; 
justify-content : center;

谢谢'satwik boorgula',我不认为你的代码有问题,也许我的代码有一些冲突。我使用以下代码进行测试:
Your Content!
但它可以通过使用上面提到的“michielvoo”代码来修复。
P
Peter Mortensen

另一种方式:

不要设置divheight属性,而是使用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 中垂直居中。


P
Peter Mortensen

我不确定是否有人走 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 也在!)


P
Peter Girnus

满足您所有的垂直对齐需求!

声明这个 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();
}

它工作得很好。只是给一些读者的评论:这段代码是 Sass
K
Kumar

更好的主意。你也可以这样做

正文,html {高度:100%; } .parent { 空白:nowrap;高度:100%;文本对齐:居中; } .parent:after { display: inline-block;垂直对齐:中间;高度:100%;内容: ''; } .centered { 显示:内联块;垂直对齐:中间;空白:正常; }

Lorem ipsum dolor sit amet.


P
Peter Mortensen

对于单行文本(或单个字符),您可以使用此技术:

可以#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 支持,您必须将 :: 替换为 :


在此处描述的所有方法中,您的方法是唯一一种可以发挥作用的方法。我的案例:一个 div 有一个 span 元素和一个使用 css 的旋转时钟图标(用于加载层)。我刚刚删除了#box::after 的“TextContent”(将属性保留为空字符串),就是这样。
s
sstauross

尝试转换属性:

#box { 高度:90px;宽度:270px;位置:绝对;最高:50%;左:50%;变换:翻译(-50%,-50%); }

Lorem ipsum dolor sit amet, consectetur adipiscing elit。


M
Manish Kumar

一个非常简单且最强大的垂直对齐中心解决方案:

.outer-div { 高度:200px;宽度:200px;文本对齐:居中;边框:1px 实心#000; } .inner { 位置:相对;最高:50%;变换:translateY(-50%);红色; }

无可用数据


但这不是垂直中心....
如果你改变“top:45%;”到“顶部:50%;”。刚试了用一、二、三条线围成一圈,中心就完美对齐了。
C
Caner

无论屏幕大小或 div 大小如何,以下代码都会将 div 置于屏幕中间:

.center-screen { 显示:弹性;弹性方向:列;证明内容:中心;对齐项目:居中;文本对齐:居中;最小高度:100vh; }

我在中心

查看有关 flex here 的更多详细信息。


P
Peter Mortensen

简单而通用的方法是(如 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>

P
Peter Mortensen

试试下面的代码:

display: table-cell;
vertical-align: middle;

div {高度:80%;宽度:100%;文本对齐:居中;显示:表格单元格;垂直对齐:中间;背景:#4CAF50;颜色:#fff;字体大小:50px;字体样式:斜体; }

Lorem Ipsum 只是印刷和排版行业的虚拟文本。自 1500 年代以来,Lorem Ipsum 一直是业界标准的虚拟文本


P
Peter Mortensen

我只想扩展 the answer from Michielvoo 以释放对行高和 div 高度呼吸的需求。它基本上只是一个简化版本,如下所示:

div { 宽度:250px; /* 高度:100px;行高:100px; */ 文本对齐:居中;边框:1px 实心 #123456;背景颜色:#bbbbff;填充:10px;边距:10px; } 跨度 { 显示:内联块;垂直对齐:中间;行高:正常; }

所有的大人都曾经是孩子……但只有少数人记得它
现在这是我的秘密,一个非常简单的秘密:只有用心才能看清;重要的东西是肉眼看不见的。

注意:包含 divfixed-height 需要注释掉的 css 部分。


E
Emile Bergeron

我需要一排可点击的大象,垂直居中,但不使用表格来解决 Internet Explorer 9 的一些奇怪问题。

我最终找到了最好的 CSS(满足我的需要),它与 Firefox、Chrome 和 Internet Explorer 11 配合得很好。可悲的是,Internet Explorer 9 仍在嘲笑我……

div { 边框:1px 蓝色虚线;显示:内联;行高:100px;高度:100px; } span { 边框:1px 纯红色;显示:内联块;行高:正常;垂直对齐:中间; } .out { 边框:3px 纯银;显示:内联块; }

一个可爱的可点击选项。
< img src="http://www.birdfolk.co.uk/bang2/Ship01.png"/>
一些迷人的点击。

显然您不需要边框,但它们可以帮助您了解它是如何工作的。


S
Sivaprakash D

您可以使用 CSS 中的定位方法:

Check the result here....

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%);}

希望你也使用这种方法。


P
Peter Mortensen

无论您想要垂直居中的样式意味着您可以尝试 display:table-cellvertical-align:middle

例子:

#box { 显示:表格单元格;垂直对齐:中间;高度:90px;宽度:270px;背景:#000;字体大小:48px;字体样式:倾斜;颜色:#FFF;文本对齐:居中;边距顶部:20px;左边距:5px; }

Lorem ipsum dolor sit amet, consectetur adipiscing elit。


P
Peter Mortensen

如果您不关心它的视觉 3D 效果,请将其设置在 button 而不是 div 内。

#box { 高度:120px;宽度:300px;背景:#000;字体大小:48px;字体样式:倾斜;颜色:#FFF; }

P
Peter Mortensen

绝对定位和拉伸

与上面的方法一样,首先将父元素和子元素的定位分别设置为相对和绝对。从那里情况有所不同。

在下面的代码中,我再次使用此方法将子元素水平和垂直居中,但您只能使用该方法进行垂直居中。

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 内的内容可能会变得太大,导致它被隐藏。


P
Peter Mortensen
.element{position: relative;top: 50%;transform: translateY(-50%);}

在元素的 CSS 属性中添加这个小代码。太棒了。试试看!