为什么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>
为什么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">
<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>
为了让它全面正常工作,您必须稍微修改一下 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%);
您必须同时应用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
,第一个移动元素相对于框的基线(放置在需要满足所有垂直对齐的任何位置,因此感觉相当不可预测)和第二个相对于行框的外部边界(即更具体)。
接受的答案中使用的技术仅适用于单行文本(demo),而不适用于多行文本(demo) - 如那里所述。
如果有人需要将多行文本垂直居中到图像,这里有几种方法(方法 1 和 2 受这篇 CSS-Tricks 文章的启发)
CSS:
div {
display: table;
}
span {
vertical-align: middle;
display: table-cell;
}
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 */
}
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
为<div>
. 然后将图像设置为vertical-align: middle;
这真的是最简单的方法。
用于line-height:30px
跨度,使文本与图像对齐:
<div>
<img style="width:30px; height:30px;">
<span style="line-height:30px;">Doesn't work.</span>
</div>
还没有看到margin
任何这些答案的解决方案,所以这是我对这个问题的解决方案。
此解决方案仅在您知道图像宽度的情况下才有效。
<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>
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
. 通过增加/减少该值,可以将图像更改为所需的高度。
您可以将图像设置为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>
例如,在 jQuery mobile 中的按钮上,您可以通过将这种样式应用于图像来稍微调整它:
.btn-image {
vertical-align:middle;
margin:0 0 3px 0;
}
多线解决方案:
<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 技巧将模式定位在网页的中心。它具有大型浏览器支持:
<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; }
请注意,您必须设置图像和表格容器的样式并调整其大小,以使其按您的意愿工作。享受。
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>
div {
display: flex;
align-items: center;
}
<div>
<img src="http://lorempixel.com/30/30/" alt="small img" />
<span>It works.</span>
</div>
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>
首先,完全不推荐内联 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
布局优势
min-content
)和文本长度(使用一行max-content
或包装(未显示在小提琴中)使用min-content
)都可以工作 - 无需在 CSS 中硬编码图像尺寸(两种用法都在 JSFiddle 中演示)grid
布局的缺点
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