ChatGPT解决这个技术问题 Extra ChatGPT

为什么垂直对齐:中间不适用于我的跨度或 div?

我正在尝试将另一个 div 元素中的 spandiv 元素垂直居中。但是,当我输入 vertical-align: middle 时,什么也没有发生。我尝试更改两个元素的 display 属性,但似乎没有任何效果。

这是我目前在我的网页中所做的:

.main { 高度:72px;垂直对齐:中间;边框:1px纯黑色;填充:2px; } .inner { 垂直对齐:中间;边框:1px 纯红色; } .second { 边框:1px 纯蓝色; }

这个盒子应该在大盒子的中心
这里的另一个盒子

这是实现的 jsfiddle,表明它不起作用:http://jsfiddle.net/gZXWC/


e
ethry

这似乎是最好的方法 - 自从我原来的帖子以来已经过去了一段时间,这就是现在应该做的:

.main { 显示:表格; /* 可选的 css 开始 */ height: 90px;宽度:90px; /* 可选的 css 结束 */ } .inner {border: 1px solid #000000;显示:表格单元格;垂直对齐:中间; }

这个


那么有人如何做OP想要做的事情呢?
关于可变行段落的任何想法? IE。如果没有办法知道它是一两行。那我需要使用jQuery吗?
如果高度必须是动态的,解决方案是什么?
不应该是公认的答案,依赖于知道'.inner'的高度,所以不完全是OP所要求的,下面的一些更好的答案见@timbergus或Tim Perkins的答案接近底部。
@Sauce 在设置固定高度时对我来说很好。如果您注意到,这里附加的 jsfiddle 不是当前提供的解决方案。我的猜测是您单击了 JSFiddle,而不是实际使用代码。
D
Dinesh Kumar

使用 CSS3:

<div class="outer">
   <div class="inner"/>
</div>

CSS:

.outer {
  display : flex;
  align-items : center;
}

使用“证明内容:中心;”水平对齐元素

注意:这可能不适用于旧 IE


所有主要的现代浏览器和最简单、最干净的解决方案都支持这一点。
还要记住 inline-flex 在内部元素内连续有多个元素。
就我而言,由于我也想将 .inner 的内容水平居中,所以我必须添加 .inner { width: 100%; }。这样,它似乎像 .outer { display: table; } .inner { display: table-cell; vertical-align: middle; } 一样工作,但没有强制最小宽度。
我使用 justify-content: center; 水平对齐效果很好
wkhtmltopdf 不支持 flex
M
Mahendra Liya

试试这个,非常适合我:

/* Internet Explorer 10 */
display:-ms-flexbox;
-ms-flex-pack:center;
-ms-flex-align:center;

/* Firefox */
display:-moz-box;
-moz-box-pack:center;
-moz-box-align:center;

/* Safari, Opera, and Chrome */
display:-webkit-box;
-webkit-box-pack:center;
-webkit-box-align:center;

/* W3C */
display:box;
box-pack:center;
box-align:center;

很好的答案,这给了我一个完全有效的解决方案,没有引起其他连锁问题(使用 jquerymobile + phonegap 的应用程序和所有其他解决方案导致 css 和 div 大小问题)。只是要指出这些参数必须添加到特定于要居中/居中的元素的 CSS 块中,例如:#element span {height:100%;display:-webkit-box;-webkit-box-pack:center;-webkit-box-align:center;} - 注意高度对于确保跨度继承其容器的完整高度很重要(可能是div) 否则你仍然不会得到垂直居中!
顺便说一句,您可以编写没有浏览器前缀的标准 flexbox 代码,然后使用 autoprefixer github.com/postcss/autoprefixer 或通过在线演示 simevidas.jsbin.com/gufoko/quiet 获取浏览器前缀
display 中的无效属性值 box
此外,@user1782556 的答案在外框有填充时效果更好。
K
Kevin Lynch

将 line-height 设置为与包含 div 的高度相同也可以

演示http://jsfiddle.net/kevinPHPkevin/gZXWC/7/

.inner {
    line-height:72px;
    border: 1px solid #000000;
}

我发布了一个链接,该链接也解释了该方法。虽然不是我喜欢的方法,但如果布局的其余部分大小不固定 - 我使用这种方法在不同大小的视口上遇到了问题。
是的,行高技术效果很好,但只有当你有单行内容时。额外的行将丢失/溢出容器外,您需要重新开始!
a) line-height 也会改变内部元素的高度。 b) 内部元素仍未准确垂直居中。 c) 它不适用于不包含文本的元素,例如:<img>,或具有固定高度的元素。
由于字体渲染差异,它也可能导致跨操作系统(Windows/Mac)失败
这是非常不可预测的,并且通常会导致容器高度增加。
k
kornieff

如果您不能依赖 flexbox... 将 .child 放在 .parent 的中心。在像素大小未知(换句话说,总是)并且 IE9+ 也没有问题的情况下工作。

.parent { 位置:相对; } .child { 位置:绝对;最高:50%;左:50%; -ms-transform: 翻译(-50%, -50%);变换:翻译(-50%,-50%); }


这实际上是做得最好的解决方案,尤其是因为到目前为止我见过的大多数项目都需要 IE9 兼容性
我喜欢这个解决方案,但它会将我的内容缩小 50%?我该如何避免呢?
编辑: 找到了我的解决方案,我使用了上面的解决方案并添加了 width: 80% 以将我的图像内容放入容器中。
V
VLAZ

您应该将 vertical-align: middle 放在内部元素上,而不是放在外部元素上。设置外部元素的 line-height 属性以匹配外部元素的 height。然后在内部元素上设置 display: inline-blockline-height: normal。通过这样做,内部元素上的文本将以正常的行高换行。适用于 Chrome、Firefox、Safari 和 IE 8+

.main { 高度:72px;行高:72px;边框:1px纯黑色; } .inner { 显示:内联块;垂直对齐:中间;行高:正常; }

垂直居中文本

Fiddle


这可能是最简单的方法...此页面上的所有其他答案都不必要地笨拙/笨拙,或者在旧版浏览器中不受支持,或者依赖于知道内部元素的高度。您实际上并不需要 line-height: normal; 并且 display:inline; 也可以工作。这种方法的好处是它不会干扰 text-align:center;,而使用 display: table-cell; 可能会产生问题。很多时候,我们想要水平对齐和垂直对齐。看到这个编辑过的小提琴:jsfiddle.net/br090prs/36
@mike-source 使用 line-height: normaldisplay: inline-block 的原因是内部文本将正确换行。如果您确定内部 div 中的文本永远不会换行,那么这些属性将不是必需的。
自从 Microsoft ended support for old versions of IE 以来,我一直使用 flexbox 来处理这类事情(正如@user1782556 所建议的那样)。如果您仍然需要支持 IE 10 或更早版本,我的原始答案是可行的方法。
100% 同意,但我个人还不会选择 flex box,截至 2016 年 5 月,只有 76% 的浏览器完全支持它(如果包括部分支持,则为 94%),请参阅:caniuse.com/#search=flexible%20box。不过,它已经非常接近成为最明智的选择,具体取决于您的用户群。
vertical-align: middle 在这里(几乎)没有效果。将 .inner 定位在中间的是行高。
R
Ruth Young

我用它来对齐包装器 div 中心的所有内容,以防它帮助任何人 - 我发现它最简单:

div.wrapper { /* --- 这有效 --- */ display: flex; /* 垂直对齐 */ align-items: center; /* 水平对齐 */ justify-content: center; /* --- ---------- ----- */ 宽度:100%;高度:100px;背景颜色:蓝色; } div.inner { 宽度:50px;高度:50px;背景颜色:橙色; }


k
king

这是一种现代方法,它利用了 CSS Flexbox 功能。您现在只需将这些样式添加到 .main 容器即可垂直对齐父容器中的内容

.main {
        display: flex;
        flex-direction: column;
        justify-content: center;
        align-items: center; // To center align it horizontally as well
}

您还可以使用 CSS Grids(基于网格的二维布局系统)。

.main {
  display: grid;
  justify-content: center;
  align-content: center;
}

下面是一种速记方法,但浏览器支持仍然很低 - https://caniuse.com/?search=place-items

    .main {
      display: grid; // flex  -  works for both
      place-items: center;
    }

你很高兴去!


T
Timbergus

在这里,您有两种方式进行垂直对齐的示例。我使用它们,它们工作得很好。一种是使用绝对定位,另一种是使用 flexbox

Vertical Align Example

使用 flexbox,您可以使用 align-self 将一个元素自身与另一个元素与 display: flex; 对齐。如果还需要水平对齐,可以在容器中使用 align-itemsjustify-content

如果不想使用 flexbox,可以使用 position 属性。如果您使容器相对而内容绝对,则内容将能够在容器内自由移动。因此,如果您在内容中使用 top: 0;left: 0;,它将位于容器的左上角。

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

然后,要对齐它,您只需将顶部和左侧的引用更改为 50%。这会将内容定位在内容左上角的容器中心。

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

因此,您需要更正此问题,将内容的一半大小向左和顶部平移。

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


B
Brijesh Patel

HTML

<div id="myparent">
  <div id="mychild">Test Content here</div>
</div>

CSS

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

我们将父 div 设置为显示为表格,将子 div 设置为显示为表格单元格。然后我们可以在子 div 上使用 vertical-align 并将其值设置为 middle。此子 div 内的任何内容都将垂直居中。


A
Alexis Wilke

这是一篇关于如何垂直对齐的好文章。我喜欢浮动方式。

http://www.vanseodesign.com/css/vertical-centering/

的HTML:

<div id="main">
    <div id="floater"></div>
    <div id="inner">Content here</div>
</div>

以及对应的样式:

#main {
   height: 250px;
}

#floater {
   float: left;
   height: 50%;
   width: 100%;
   margin-bottom: -50px;
}

#inner {
   clear: both;
   height: 100px;
}

我认为,如果您定义 #inner 块的高度,它会使正确垂直居中的概念无效。 OPS 要求使其自动化,所以我想这意味着内盒的高度在受孕时是未知的。
S
Sнаđошƒаӽ

这很简单。只需在您的主类中添加 display:table-cell

.main {
  height: 72px;
  vertical-align: middle;
  display:table-cell;
  border: 1px solid #000000;
}

看看这个jsfiddle


D
Downhillski

这是最新最简单的解决方案 - 无需更改任何内容,只需将三行 CSS 规则添加到您希望居中的 div 容器中。我喜欢 Flex Box #LoveFlexBox

.main { /* 我将高度更改为 200px 以便于查看对齐方式。 */ 高度:200px;垂直对齐:中间;边框:1px 实心#000000;填充:2px; /* 只需将以下三个规则添加到要居中的容器中。 */ 显示:弹性;弹性方向:列;证明内容:中心; /* 这是真正的垂直中心,不需要数学。 */ } .inner { 边框:1px 实心 #000000; } .second { 边框:1px 实心 #000000; }

这个盒子应该在大盒子的中心
这里的另一个盒子
这个盒子应该在大盒子的中心
这里的另一个盒子

奖金

justify-content 值可以设置为以下几个选项:

flex-start,它将子 div 对齐到 flex 流在其父容器中开始的位置。在这种情况下,它将保持在顶部。

center,它将子 div 对齐到其父容器的中心。这真的很整洁,因为您不需要添加额外的 div 来包裹所有子项,以将包装器放在父容器中以使子项居中。因此,这是真正的垂直中心(在列 flex-direction 中。类似地,如果将流方向更改为行,它将变为水平居中。

flex-end,它将子 div 对齐到 flex 流在其父容器中结束的位置。在这种情况下,它将移动到底部。

space-between,它将所有孩子从流程的开始传播到流程的结束。如果是演示,我添加了另一个子 div,以显示它们是分散的。

space-around,类似于 space-between,但在流的开始和结束处有一半的空间。


完美的解决方案。不兼容的浏览器会使内容不对齐,用户必须处理它或升级他/她的浏览器。
R
Rahul Daksh

设置在 CSS 下面

 /*Parent*/
 display: table;

/*immediate child*/
display: table-cell;
vertical-align: middle;

~拉胡尔·达克什


S
Smig

由于 vertical-aligntd 上按预期工作,您可以在 div 中放置一个单元格的 table 以对齐其内容。

<div>
    <table style="width: 100%; height: 100%;"><tr><td style="vertical-align: middle; text-align: center">
        Aligned content here...
    </td></tr></table>
</div>

笨重,但据我所知。它可能没有其他解决方法的缺点。


不,拜托,没有桌子了。 CSS 可以以一种干净的方式做到这一点。在这种情况下,不需要使用 。
R
Ramiro Mosquera

只需将内容放在高度为 100% 的表格中,并设置主 div 的高度

<div style="height:80px;border: 1px solid #000000;">
<table style="height:100%">
<tr><td style="vertical-align: middle;">
  This paragraph should be centered in the larger box
</td></tr>
</table>
</div>

P
Paul Rooney

要在另一个 div 中垂直居中 span 或 div 元素,请添加相对于父 div 的位置并将绝对位置添加到子 div。现在子 div 可以定位在 div 内的任何位置。下面的示例水平和垂直居中。

<div class="parent">
    <div class="child">Vertically and horizontally centered child div</div>
</div>

CSS:

.parent{
    position: relative;
}
.child{
    position: absolute;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    margin: auto;
}