2143

为什么vertical-align: middle行不通?然而,vertical-align: top 确实有效。

span{
  vertical-align: middle;
}
<div>
  <img src="https://via.placeholder.com/30" alt="small img" />
  <span>Doesn't work.</span>
</div>

4

26 回答 26

2467

实际上,在这种情况下,它非常简单:将垂直对齐应用于图像。由于它都在一行中,因此它实际上是您要对齐的图像,而不是文本。

<!-- moved "vertical-align:middle" style from span to img -->
<div>
  <img style="vertical-align:middle" src="https://via.placeholder.com/60x60">
  <span style="">Works.</span>
</div>

在FF3中测试。

现在您可以将 flexbox 用于这种类型的布局。

.box {
   display: flex;
   align-items:center;
}
<div class="box">
    <img src="https://via.placeholder.com/60x60">
    <span style="">Works.</span>
</div>

于 2009-01-28T21:10:50.180 回答
350

以下是一些简单的垂直对齐技术:

单行垂直对齐:中间

这很简单:将文本元素的行高设置为等于容器的行高

<div>
  <img style="width:30px; height:30px;">
  <span style="line-height:30px;">Doesn't work.</span>
</div>

多行垂直对齐:底部

相对于其容器绝对定位内部 div

<div style="position:relative;width:30px;height:60px;">
  <div style="position:absolute;bottom:0">This is positioned on the bottom</div>
</div>

多行垂直对齐:中间

<div style="display:table;width:30px;height:60px;">
  <div style="display:table-cell;height:30px;">This is positioned in the middle</div>
</div>

如果你必须支持旧版本的 IE <= 7

为了让它全面正常工作,您必须稍微修改一下 CSS。幸运的是,有一个对我们有利的 IE 错误。top:50%在容器和内部 div 上设置top:-50%,可以达到相同的效果。我们可以使用 IE 不支持的另一个功能将两者结合起来:高级 CSS 选择器。

<style type="text/css">
  #container {
    width: 30px;
    height: 60px;
    position: relative;
  }
  #wrapper > #container {
    display: table;
    position: static;
  }
  #container div {
    position: absolute;
    top: 50%;
  }
  #container div div {
    position: relative;
    top: -50%;
  }
  #container > div {
    display: table-cell;
    vertical-align: middle;
    position: static;
  }
</style>

<div id="wrapper">
  <div id="container">
    <div><div><p>Works in everything!</p></div></div>
  </div>
</div>

可变容器高度垂直对齐:中间

该解决方案需要比其他解决方案更现代的浏览器,因为它利用了该transform: translateY属性。(http://caniuse.com/#feat=transforms2d

将以下 3 行 CSS 应用于元素将使其在其父元素中垂直居中,而与父元素的高度无关:

position: relative;
top: 50%;
transform: translateY(-50%);
于 2009-01-28T21:45:03.963 回答
104

将您的更改div为 flex 容器:

div { display: flex; }

现在有两种方法可以使所有内容的对齐方式居中:

方法一:

div { align-items: center; }

演示


方法二:

div * { margin: auto 0; }

演示


尝试不同的宽度和高度值img以及不同的字体大小值span,您会发现它们始终保持在容器的中间。

于 2014-03-24T07:54:59.223 回答
97

您必须同时应用vertical-align: middle这两个元素才能使其完美居中。

<div>
  <img style="vertical-align:middle" src="http://lorempixel.com/60/60/">
  <span style="vertical-align:middle">Perfectly centered</span>
</div>

接受的答案确实将图标集中在其旁边文本 x 高度的一半左右(如CSS 规范中所定义)。如果文本在顶部或底部突出显示升序或降序,这可能已经足够好,但看起来有点偏离:

居中图标比较

左边,文字没有对齐,右边如上图。可以在这篇关于 vertical-align的文章中找到现场演示。

有没有人谈论过为什么vertical-align: top在场景中有效?问题中的图像可能比文本高,因此定义了行框的顶部边缘。vertical-align: top在 span 元素上,然后将其放置在行框的顶部。

vertical-align: middle和之间行为的主要区别在于top,第一个移动元素相对于框的基线(放置在需要满足所有垂直对齐的任何位置,因此感觉相当不可预测)和第二个相对于行框的外部边界(即更具体)。

于 2014-09-11T12:58:35.143 回答
64

接受的答案中使用的技术仅适用于单行文本(demo),而不适用于多行文本(demo) - 如那里所述。

如果有人需要将多行文本垂直居中到图像,这里有几种方法(方法 1 和 2 受这篇 CSS-Tricks 文章的启发)

方法 #1:CSS 表格 ( FIDDLE ) (IE8+ ( caniuse ))

CSS:

div {
    display: table;
}
span {
    vertical-align: middle;
    display: table-cell;
}

方法#2:容器上的伪元素(FIDDLE)(IE8+)

CSS:

div {
   height: 200px; /* height of image */
}

div:before {
  content: '';
  display: inline-block;
  height: 100%;
  vertical-align: middle;
  margin-right: -0.25em; /* Adjusts for spacing */
}

img {
    position: absolute;
}

span {
  display: inline-block;
  vertical-align: middle;
  margin-left: 200px;  /* width of image */
}

方法#3:Flexbox ( FIDDLE ) ( caniuse )

CSS(上面的小提琴包含供应商前缀):

div {   
    display: flex; 
    align-items: center;    
}
img {
    min-width: 200px; /* width of image */
}
于 2013-12-24T21:06:14.827 回答
30

此代码适用于 IE 和 FF:

<div>
  <img style="width:auto; height:auto;vertical-align: middle;">
  <span>It does work on all browsers</span>
</div>
于 2012-07-02T14:41:34.423 回答
20

因为您必须将其设置line-height为 div 的高度才能正常工作

于 2009-01-28T21:05:08.817 回答
12

作为记录,对齐“命令”不应该在 SPAN 上工作,因为它是一个内联标签,而不是一个块级标签。对齐、边距、填充等内容不适用于内联标签,因为内联点不会破坏文本流。

CSS 将 HTML 标签分为两组:内联和块级。搜索“css block vs inline”,就会出现一篇很棒的文章......

http://www.webdesignfromscratch.com/html-css/css-block-and-inline/

(理解核心 CSS 原则是它不那么烦人的关键)

于 2011-11-18T13:24:05.230 回答
12

基本上,您将不得不开始使用 CSS3。

-moz-box-align: center;
-webkit-box-align: center;
于 2011-11-29T18:24:13.407 回答
11

您可以做的另一件事是将文本设置line-height<div>. 然后将图像设置为vertical-align: middle;

这真的是最简单的方法。

于 2012-01-12T14:52:01.553 回答
11

用于line-height:30px跨度,使文本与图像对齐:

<div>
  <img style="width:30px; height:30px;">
  <span style="line-height:30px;">Doesn't work.</span>
</div>
于 2013-05-20T23:50:12.333 回答
10

还没有看到margin任何这些答案的解决方案,所以这是我对这个问题的解决方案。

此解决方案仅在您知道图像宽度的情况下才有效。

的HTML

<div>
    <img src="https://placehold.it/80x80">
    <span>This is my very long text what should align. This is my very long text what should align.</span>
</div>

CSS

div {
  overflow:hidden;
}
img {
   width:80px
   margin-right:20px;
   display:inline-block;
   vertical-align:middle;
}
span {
   width:100%;
   margin-right:-100px;
   padding-right:100px;
   display:inline-block;
   vertical-align:middle;
   box-sizing:border-box;
   -moz-box-sizing:border-box;
   -webkit-box-sizing:border-box;
}
于 2016-04-10T11:26:02.127 回答
7

编写这些跨度属性

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

使用display:inline-block;时使用vertical-align属性。这些是关联属性

于 2016-11-08T06:26:18.517 回答
6
background:url(../images/red_bullet.jpg) left 3px no-repeat;

我一般用 3px 代替top. 通过增加/减少该值,可以将图像更改为所需的高度。

于 2012-04-13T07:21:30.740 回答
6

您可以将图像设置为inline element使用display属性

<div>
  <img style="vertical-align: middle; display: inline;" src="https://placehold.it/60x60">
  <span style="vertical-align: middle; display: inline;">Works.</span>
</div>

于 2017-01-30T14:54:55.460 回答
3

例如,在 jQuery mobile 中的按钮上,您可以通过将这种样式应用于图像来稍微调整它:

.btn-image {
    vertical-align:middle;
    margin:0 0 3px 0;
}
于 2012-10-24T15:22:55.923 回答
3

多线解决方案:

http://jsfiddle.net/zH58L/6/

<div style="display:table;width:30px;height:160px;">
    <img style="display:table-cell;width:30px;height:60px;padding:50px" src='...' />
    <div style="display:table-cell;height:30px;vertical-align:middle">
      Multiline text centered vertically
    </div>
</div>
<!-- note: img (height + 2x padding) must be equal to root div height -->

适用于所有浏览器和 ie9+

于 2014-02-24T14:20:27.650 回答
2

我同意,这可能会令人困惑。尝试利用表格功能。我使用这个简单的 CSS 技巧将模式定位在网页的中心。它具有大型浏览器支持:

<div class="table">
    <div class="cell">
        <img src="..." alt="..." />
        <span>It works now</span>
    </div>
</div>

和 CSS 部分:

.table { display: table; }
.cell { display: table-cell; vertical-align: middle; }

请注意,您必须设置图像和表格容器的样式并调整其大小,以使其按您的意愿工作。享受。

于 2017-07-06T02:12:31.927 回答
2

flex property在 css 中使用。

align-items:center;如果要使用 in flex using 将文本水平居中对齐,请使用 in flex using 将文本垂直居中对齐justify-content:center;

div{
  display: flex;
  align-items: center;
}
<div>
  <img src="http://lorempixel.com/30/30/" alt="small img" />
  <span>It works.</span>
</div>

table-cell在 css 中使用。

div{
  display: table;
}
div *{
  display: table-cell;
  vertical-align: middle;
}
<div>
  <img src="http://lorempixel.com/30/30/" alt="small img" />
  <span>It works.</span>
</div>

于 2020-09-19T10:44:18.860 回答
1

div {
  display: flex;
  align-items: center;
}
<div>
  <img src="http://lorempixel.com/30/30/" alt="small img" />
  <span>It works.</span>
</div>

于 2021-08-16T06:44:30.960 回答
1

Display flex withalign-items: center;是垂直对齐项目的最佳方式

div {
  display: flex;
  align-items: center;
}
<div>
  <img src="https://via.placeholder.com/30" alt="small img" />
  <span>it works.</span>
</div>

于 2021-10-10T16:26:13.900 回答
0

首先,完全不推荐内联 CSS,它真的会弄乱你的 HTML。

对于对齐图像和跨度,您可以简单地执行vertical-align:middle.

.align-middle {
  vertical-align: middle;
}
<div>
  <img class="align-middle" src="https://i.stack.imgur.com/ymxaR.png">
  <span class="align-middle">I'm in the middle of the image! thanks to CSS! hooray!</span>
</div>

于 2017-05-25T12:47:49.980 回答
0

不知道为什么它不会在您的导航浏览器上呈现它,但我通常在尝试显示带有图像和居中文本的标题时使用这样的片段,希望它有所帮助!

https://output.jsbin.com/jeqorahupo

            <hgroup style="display:block; text-align:center;  vertical-align:middle;  margin:inherit auto; padding:inherit auto; max-height:inherit">

            <header style="background:url('http://lorempixel.com/30/30/') center center no-repeat; background-size:auto; display:inner-block; vertical-align:middle; position:relative; position:absolute; top:inherit; left:inherit; 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;">

            <image src="http://lorempixel.com/60/60/" title="Img title" style="opacity:0.35"></img>
                    http://lipsum.org</header>
                    </hgroup>
于 2019-11-05T05:21:33.793 回答
0

在 2022 年,近 96% 的无前缀浏览器支持,我很惊讶没有人建议使用grid布局。

这个 JSFiddle中,3 行是实现 OP 目标所必需的(但提供了多个对齐方式以供比较):

div {
    display: grid;
    grid-template-columns: min-content max-content;
    align-items: center
}

一个额外的 UI 细节将包括该gap属性的可选使用,它可以调制父网格容器( ) 中每个网格项之间的空间。div

grid布局优势

  1. 网格项目的简单垂直和水平对齐
  2. 网格项之间的空间调制
  3. 任何尺寸的图像(使用min-content)和文本长度(使用一行max-content或包装(未显示在小提琴中)使用min-content)都可以工作 - 无需在 CSS 中硬编码图像尺寸(两种用法都在 JSFiddle 中演示)
  4. 现代方法

grid布局的缺点

  1. 较旧的浏览器支持更具挑战性
  2. 网格布局一般需要更有经验的开发者才能正确实现——不像block/inline-block显示那么简单
于 2022-02-28T03:18:08.233 回答
-1
<!DOCTYPE html>
<html>
<head>
<style>
 .block-system-branding-block {
 flex: 0 1 40%;
}
@media screen and (min-width: 48em) {
.block-system-branding-block {
flex: 0 1 420px;
margin: 2.5rem 0;
text-align: left;
}
}
.flex-containerrow {
display: flex;
}
.flex-containerrow > div {
  justify-content: center;
align-items: center;
  }
 .flex-containercolumn {
display: flex;
flex-direction: column;
}
.flex-containercolumn > div {
  width: 300px;
 margin: 10px;
 text-align: left;
 line-height: 20px;
 font-size: 16px;
}
.flex-containercolumn  > site-slogan {font-size: 12px;}
.flex-containercolumn > div > span{ font-size: 12px;}
</style>
</head>
<body>
<div id="block-umami-branding" class="block-system block- 
system-branding-block">
  <div class="flex-containerrow">
 <div>
  <a href="/" rel="home" class="site-logo">
  <img src="https://placehold.it/120x120" alt="Home">
</a>
</div><div class="flex-containerrow"><div class="flex-containercolumn">
  <div class="site-name ">
    <a href="/" title="Home" rel="home">This is my sitename</a>
   </div>
    <div class="site-slogan "><span>Department of Test | Ministry of Test | 
 TGoII</span></div>
 </div></div>
</div>
 </div>
</body>
</html>
于 2020-06-06T18:45:04.590 回答
-4

你可能想要这个:

<div>
   <img style="width:30px; height:30px;">
   <span style="vertical-align:50%; line-height:30px;">Didn't work.</span>
</div>

正如其他人所建议vertical-align的那样,尝试图像:

<div>
   <img style="width:30px; height:30px; vertical-align:middle;">
   <span>Didn't work.</span>
</div>

CSS 并不烦人。您只是不阅读文档。;P

于 2009-01-28T21:10:00.417 回答