繁体   English   中英

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

[英]Vertically align text next to an image?

为什么不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>

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

 <!-- moved "vertical-align:middle" style from span to img --> <div> <img style="vertical-align:middle" src="https://via.placeholder.com/60x60" alt="A grey image showing text 60 x 60"> <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>

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

单行垂直对齐:中间

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

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

将您的div更改为 flex 容器:

div { display: flex; }

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

方法一:

 div { align-items: center; }

演示


方法二:

 div * { margin: auto 0; }

演示


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

您必须对两个元素应用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 元素上,然后将其定位在 line box 的顶部。

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

接受的答案中使用的技术仅适用于单行文本( 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 */
}

此代码适用于 IE 和 FF:

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

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

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

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

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

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

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

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

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

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

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

这真的是最简单的方法。

在这些答案中还没有看到有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;
}

编写这些跨度属性

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

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

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

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

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

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

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

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

多线解决方案:

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+

在 css 中使用flex property

在 flex 中使用align-items:center; 如果你想通过在 flex 中使用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>

在 css 中使用table-cell

 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>

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

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

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

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

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

首先,完全不推荐内联 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>

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

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>

在 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显示那么简单
<!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>

你可能想要这个:

<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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM