ChatGPT解决这个技术问题 Extra ChatGPT

垂直对齐图像旁边的文本?

为什么 vertical-align: middle 不起作用?然而,vertical-align: top确实有效。

跨度{垂直对齐:中间; }

small img 不起作用。


A
Andy

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

显示文本 60 x 60 的灰色图像 Works.

在FF3中测试。

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

.box { 显示:弹性;对齐项目:中心; }

作品。


flex 解决方案比 vertical-align 解决方案更好,因为它也可以处理多行文本的情况。
S
Scoots

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

单行垂直对齐:中间

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

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

display:tabledisplay:table-cell CSS 选择器效果很好,当然,在 IE7 及更低版本中除外。扯了几个小时的头发后,我决定我真的不需要和任何仍在使用 IE7 的人打交道。
M
Mori

将您的 div 更改为 flex 容器:

div { display: flex; }

方法一:

div { align-items: center; }

DEMO

方法二:

div * { margin: auto 0; }

DEMO

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


为了使文本在图像旁边或之间居中(在页面上水平),您还需要添加 justify-content: center; 并且对于间距(不使用 <br/> 标签),您可能还需要添加 {2 }。对于我们现代浏览器开发人员来说,这是一次很棒的更新。
这运作良好。我尝试了其他每个答案,虽然它们在一定程度上起作用,但对我不起作用。我有大约 3 行文本要对齐,这个答案非常有效。谢谢@Mori
C
Community

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

完全居中 < /div>

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

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

左边,文字没有对齐,右边如上图。可在此 article about vertical-align 中找到现场演示。

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

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


s
sP_

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

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

方法 #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 */
}

如果图像(高度)大于文本,则这些方法可以正常工作。但是如果图像更小,那么除了最后一个之外,所有的都失败了
J
Josh Crozier

此代码适用于 IE 和 FF:

<div>
  <img style="width:auto; height:auto;vertical-align: middle;">
  <span>It does work on all browsers</span>
</div>

J
Josh Crozier

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


我尝试将 line-height 设置为 30px,但它仍然不起作用。
D
David

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

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

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

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


text-alignvertical-align(除了它在 td 元素上用于遗留用途的应用)专门用于 inlineinline-block 元素(spanimg 等)。
J
Josh Crozier

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

-moz-box-align: center;
-webkit-box-align: center;

T
Touhid Rahman

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

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

J
Josh Crozier

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

这真的是最简单的方法。


请注意,如果您的内容分布在多行上,这将无法正常工作。
然后为什么不只是 line-height:100% ?
l
luukvhoudt

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

This solution 仅在您知道图片宽度的情况下才有效。

的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;
}

这是确切的解决方案。它也适用于多行文本......以上不适用于多行。
N
Nikhil

编写这些跨度属性

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

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


J
Josh Crozier
background:url(../images/red_bullet.jpg) left 3px no-repeat;

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


在图像大小未知或动态的情况下无济于事。
S
Super User

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

作品。


J
Josh Crozier

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

.btn-image {
    vertical-align:middle;
    margin:0 0 3px 0;
}

B
Benjamin Crouzier

多线解决方案:

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+


c
corn on the cob

在 css 中使用 flex 属性。

在 flex 中使用 align-items:center 使文本垂直居中对齐;如果你想通过在 flex 中使用 justify-content:center; 将文本水平居中对齐。

div {显示:弹性;对齐项目:居中; }

small img 有效。

在 css 中使用表格单元格。

div {显示:表; } div *{ 显示:表格单元格;垂直对齐:中间; }

small img 有效。


C
CodeGems

我同意,这可能会令人困惑。尝试利用表格功能。我使用这个简单的 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; }

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


i
isherwood

使用 align-items: center; 显示 flex 是垂直对齐项目的最佳方式

div {显示:弹性;对齐项目:居中; }

small img 它有效。


i
isherwood

div {显示:弹性;对齐项目:居中; }

small img 有效。


A
Alireza

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

要对齐图像和跨度,您只需执行 vertical-align:middle

.align-middle { 垂直对齐:中间; }

我在中间图片!感谢 CSS!万岁!


使用内联 CSS 有很多很好的理由。 React: CSS in JS 例如。
J
Jean G.T

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

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>

C
CSSBurner

在 2022 年和 nearly 96% unprefixed browser support 中,我很惊讶没有人建议使用 grid 布局。

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

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

一个额外的 UI 细节包括可选使用 gap 属性,它可以调制父 grid container (div) 中每个 grid-item 之间的空间。

grid 布局的优点

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

grid 布局的缺点

较旧的浏览器支持更具挑战性网格布局通常需要更有经验的开发人员才能正确实现 - 不像块/内联块显示那么简单


P
Pradeep
<!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>

s
strager

你可能想要这个:

<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 并不烦人。您只是没有阅读 the documentation。 ;P


如果图像高度是动态的?我搞砸了 :( PS,仅仅因为 CSS 的文档存在并不会让它变得烦人或不直观。
我和山姆一起做这个。我认为项目应该以 img 高度为中心。我想我们都可以冷静下来。