【问题标题】:Tricky vertical align center with css棘手的垂直对齐中心与css
【发布时间】:2013-01-15 23:16:05
【问题描述】:

我发现了关于如何使用 css 垂直对齐内容的不同建议。但是,这些都无法处理我想要的。这是我想要的:

一般来说,我有一些文本应该填满一些空间的左半部分,而一张图片应该填满空间的右半部分。

如果文字的高度小于图片,则文字和图片都应在空间顶部垂直对齐:

TextTextText   PicturePicture
TextTextText   PicturePicture
               PicturePicture

如果文字的高度大于图片的高度,则文字应垂直对齐顶部,图片相对于文字居中。

TextTextText
TextTextText   PicturePicture
TextTextText   PicturePicture
TextTextText   PicturePicture
TextTextText

这是我尝试的一种直接方式(没有图片的文本版本):

<div style="width: 100%">
  <div style="width: 50%; display: inline-block; vertical-align: top;">
    TextTextText <br>
    TextTextText <br>
    TextTextText
  </div><div style="width: 50%; display: inline-block; vertical-align: middle;">
    PicturePicture <br>
    PicturePicture
  </div>
</div>

但是,没有达到我想要的效果。右边的内部 div(图片)只是在顶部而不是相对于文本的中间对齐。设置vertical-align: middlevertical-align: top 没有区别。然而,有趣的是,设置 vertical-align: bottom 会有所不同。

外部 div 包含在某个宽度的其他元素中。但是,我不能通过任何固定的度量来指定这个宽度,例如像素。相同宽度的两个内部 div 相同。

使内部 divs 表格单元格达到正确的垂直效果。但是,我不能使用display: table-cell,因为我需要确保左侧内部 div 保持其宽度,即使右侧内部 div 的内容可能会向右溢出,例如PicturePicturePicturePicturePicture...。这会导致左侧单元格的宽度缩小,这是我不想要的。

此外,我不知道内容的高度,因此使用固定高度的垂直对齐技巧都不起作用。

这似乎不是一个太罕见的任务,但我找不到任何解决方案。可以这样做吗?

【问题讨论】:

  • 你知道图片的高度吗?
  • 不,我不知道身高。

标签: html css center vertical-alignment fixed-width


【解决方案1】:

我不清楚当图片对于右内div来说太宽时你想要什么行为,除了它不应该影响左内div的宽度,但这符合你的要求吗?

HTML。

<div class="container">
  <div class="caption cell">
    Text Text Text <br/>
    Text Text Text <br/>
    Text Text Text <br/>
    Text Text Text <br/>
    Text Text Text <br/>
    Text Text Text
  </div>

  <div class="picture cell">
    <div>
      <img src="http://placehold.it/500x50" />
    </div>
  </div>
</div>

CSS

.container {display:table; table-layout: fixed; width:100%; }
.cell { display: table-cell; width:50%; }
.caption { vertical-align: top; }
.picture { vertical-align: middle; }
.picture div { overflow-x:hidden; }

JSFiddle http://jsfiddle.net/92wcy/1/

【讨论】:

  • 太棒了!这个解决方案似乎工作得很好。所以重要的是table-layout: fixed。 (我删除了隐藏溢出的 div,因为如果它是可见的对我来说没问题。)
【解决方案2】:

如果您不希望左列缩小,请添加min-width

http://jsfiddle.net/pUbWt/1/

.container {
  display: table;
  width: 100%;
}

.container .caption, .container .picture {
  display: table-cell;
}

.container .caption {
  vertical-align: top;
  min-width: 10em;
}

.container .picture {
  vertical-align: middle;
}

Flexbox 也可以,但在生产站点中开始使用还为时过早。

【讨论】:

  • 感谢您的建议。不幸的是,通过设置min-width: 50%是无法达到我想要的效果的。它仍然在缩小。但也许我可以(并且必须)与一个固定的一起生活?
  • 一个 flexbox 解决方案看起来像这样:jsfiddle.net/pUbWt/4(不包括前缀)。子元素上的 inline-block 纯粹用于不支持 flexbox 的浏览器。它在有能力的浏览器中看起来很完美,在无能力的浏览器中可以通过。
  • 再次感谢。 flexbox 解决方案似乎无法正常工作(在 Chrome 24 和 FF 18 中)。不在中间垂直对齐,而且当太宽(超过 50% 宽度)时,图片会位于文本下方。因此,即使是这样一个新概念似乎也无能为力。这令人惊讶。
  • Chrome 需要前缀,FF20 是最早可以得到现代 flexbox 支持的,并且将没有前缀。包装是可选的:jsfiddle.net/pUbWt/6
【解决方案3】:

垂直对齐总是很棘手,因为 CSS 并不是为了实现这一点而设计的。
不过,这就是你所追求的吗? http://jsfiddle.net/N7px2/

如果是这样,请继续阅读。
首先,我删除了您的内联样式,因为这是不好的做法。只需在 HTML 的头部使用 &lt;style&gt;...&lt;/style&gt;,甚至更好:使用外部 CSS 文件。

然后,我浮动您的 div #b#c 以使它们像您的示例一样对齐。请参阅 background-colorborder 以快速了解每个元素的放置位置。
因为浮动让父元素崩溃,所以我使用了 clearfix 来解决这个问题。阅读更多关于 here 的信息。

现在垂直对齐:我将图像定位在#c 绝对位置并给它一个边距top: 50%。显然,这将图像推得太多了,但这就是它的工作原理。之后,我应用了一个否定的margin-top: -25% 将图像拉回原位。请注意,这只适用于父元素是相对定位的。 浏览器对负边距的支持非常好,只要它们不用于修复错误的布局,就可以使用它们。

另一个注意事项:因为position: absolute 将一个元素从流中取出,#c 会崩溃。如果你想给 #c 一个 background-image 或类似的东西,你需要更多的标记来解决这个问题 - 只需添加另一个 div。

希望对您有所帮助!

编辑:抱歉,我刚刚意识到这段代码并不是我所相信的那样。

【讨论】:

  • 感谢您的提示。但图片并不是真的在中间。在 Firefox 中,它几乎看不见 - 只剩下一条灰色的小线。 Chrome 更好,但它有点太多了。我不知道为什么...
猜你喜欢
  • 2011-06-12
  • 2023-01-14
  • 1970-01-01
  • 2017-01-30
  • 1970-01-01
  • 2011-03-18
  • 1970-01-01
  • 2015-09-06
  • 2011-10-03
相关资源
最近更新 更多