【问题标题】:css vertical align inside vertical align垂直对齐内的css垂直对齐
【发布时间】:2015-12-07 23:50:24
【问题描述】:

我的目标是创建 3 个垂直对齐的 div,其中一个 div 有一个父级高度的垂直条 (border-right)。父级可以有一个固定的高度,这反过来应该可以使用 css 使用垂直对齐(我知道 flexbox 可以解决它,但我真的在这里询问垂直对齐行为)。

以下 sn-p 显示了我不理解的 CSS 行为:

<div class="parent">
  <div class="a">
    Part A
  </div>
  <div class="b">
    <div>
      Part B<br>Part B  
    </div>

  </div>
  <div class="c">
    <span>Part C</span>
  </div>
</div>

还有css

.parent {
  height: 50px;
  display: inline-block;
}
.a {
  display: inline-block;
  vertical-align: middle; 
}

.b {
  display: inline-block;
  vertical-align: middle;
}

.c {
  display: inline-block;
  vertical-align: middle;
  border-right: 1px solid black;
  padding-right: 10px;
  height: 50px;
}

.span {
  display: inline-block;
  vertical-align: middle;

}

我期待 div C 垂直对齐,但它在顶部对齐。如果我从类.c 中删除height 属性,则对齐正确但垂直条太短。我为这个问题创建了以下小提琴: http://jsfiddle.net/04e2ckxm/2/

【问题讨论】:

  • 试试display: table-cell?看我的回答。

标签: css


【解决方案1】:

(我知道 flexbox 可以解决这个问题,但我真的在问这里的垂直对齐行为)。

在您的示例中,文本垂直居中,因为它的父级是文本的高度:

vertical-align: middle                  vertical-align: bottom               vertical-align: top

body {
  background: #FFF;
}
.parent {
  display: inline-block;
  padding-right: 10px;
  vertical-align: top;
  margin: 40px;
}
.parent > div {
  display: inline-block;
  background: #F8BBD0;
}
.top > div {
  vertical-align: top;
}
.middle > div {
  vertical-align: middle;
}
.bottom > div {
  vertical-align: bottom;
}
<div class="parent middle">
  <div class="a">
    Part A
  </div>
  <div class="b">
    Part B
    <br>Part B
  </div>
  <div class="c">
    Part C
    <br>Part C
    <br>Part C
  </div>
</div>
<div class="parent bottom">
  <div class="a">
    Part A
  </div>
  <div class="b">
    Part B
    <br>Part B
  </div>
  <div class="c">
    Part C
    <br>Part C
    <br>Part C
  </div>
</div>
<div class="parent top">
  <div class="a">
    Part A
  </div>
  <div class="b">
    Part B
    <br>Part B
  </div>
  <div class="c">
    Part C
    <br>Part C
    <br>Part C
  </div>
</div>

当你给元素一个固定的高度时,块是垂直居中的,不是它们的内容

vertical-align: middle                  vertical-align: bottom               vertical-align: top

body {
  background: #FFF;
}
.parent {
  display: inline-block;
  padding-right: 10px;
  vertical-align: top;
  margin: 40px;
}
.parent > div {
  display: inline-block;
  background: #F8BBD0;
}
.top > div {
  vertical-align: top;
}
.middle > div {
  vertical-align: middle;
}
.bottom > div {
  vertical-align: bottom;
}
.c {
  height: 100px;
}
<div class="parent middle">
  <div class="a">
    Part A
  </div>
  <div class="b">
    Part B
    <br>Part B
  </div>
  <div class="c">
    Part C
    <br>Part C
    <br>Part C
  </div>
</div>
<div class="parent bottom">
  <div class="a">
    Part A
  </div>
  <div class="b">
    Part B
    <br>Part B
  </div>
  <div class="c">
    Part C
    <br>Part C
    <br>Part C
  </div>
</div>
<div class="parent top">
  <div class="a">
    Part A
  </div>
  <div class="b">
    Part B
    <br>Part B
  </div>
  <div class="c">
    Part C
    <br>Part C
    <br>Part C
  </div>
</div>

为了进一步说明这一点,我们可以给每个 div 一个不同的固定高度:

vertical-align: middle                   vertical-align: bottom               vertical-align: top

body {
  background: #FFF;
}
.parent {
  display: inline-block;
  padding-right: 10px;
  vertical-align: top;
  margin: 40px;
}
.parent > div {
  display: inline-block;
  background: #F8BBD0;
}
.top > div {
  vertical-align: top;
}
.middle > div {
  vertical-align: middle;
}
.bottom > div {
  vertical-align: bottom;
}
.a {
  height: 50px;
}
.b {
  height: 100px;
}
.c {
  height: 200px;
}
<div class="parent middle">
  <div class="a">
    Part A
  </div>
  <div class="b">
    Part B
  </div>
  <div class="c">
    Part C
  </div>
</div>
<div class="parent bottom">
  <div class="a">
    Part A
  </div>
  <div class="b">
    Part B
  </div>
  <div class="c">
    Part C
  </div>
</div>
<div class="parent top">
  <div class="a">
    Part A
  </div>
  <div class="b">
    Part B
  </div>
  <div class="c">
    Part C
  </div>
</div>

【讨论】:

  • 你说块是垂直居中的,但不是它们的内容。这就是为什么我将这个问题称为“垂直对齐内的 css 垂直对齐”。因为我想在内容内部进行垂直对齐。如果您查看.span 类,您会发现它也有vertical-align:middle。对我来说,这个例子表明在 css 中不允许垂直对齐内的垂直对齐(对于内联块),但这没有多大意义,因此是这个问题。它变得更加奇怪:当我使跨度固定高度时,中间变成了顶部:jsfiddle.net/04e2ckxm/5
  • @shaft - 这就是垂直对齐与内联元素一起工作的方式。它对齐块本身,因此文本不受影响。如果你想在一个内联块元素中垂直居中文本本身,你必须使用一个小技巧like this example here.
【解决方案2】:

只需将所有子 &lt;div&gt; 的 CSS 从 display: inline-block 更改为 display: table-cell

这会产生以下(期望的)结果:

请参阅JSfiddle.net 上的工作示例。

【讨论】:

  • 哇,这似乎很容易解决。但这背后有什么理由吗?
  • @shaft HTML 中的table-cell 只允许居中垂直定位。我很高兴能帮上忙!
最近更新 更多