在内联块中垂直居中文本

Jos*_*owe 26 html css vertical-alignment centering

我正在尝试使用样式化的超链接为网站创建一些按钮.我设法让按钮看起来像我想要的,禁止一个小问题.我无法将文本(下面的源代码中的"链接")放到垂直居中.

不幸的是,第二个按钮可能会显示多行文本,所以我不能用line-height它来垂直居中.

我最初的解决方案是使用display: table-cell;而不是inline-block,并在Chrome,Firefox和Safari中对问题进行排序,但在Internet Explorer中没有,因此我认为我需要坚持使用内联块.

我如何在57pxx中垂直居中链接文本100px inline-block,并让它迎合多行文本?提前致谢.

CSS:

.button {
    background-image:url(/images/categorybutton-off.gif);
    color:#000;
    display:inline-block;
    height:57px;
    width:100px;
    font-family:Verdana, Geneva, sans-serif;
    font-size:10px;
    font-weight:bold;
    text-align:center;
    text-decoration:none;
    vertical-align:middle;
}
.button:hover {
    background-image:url(/images/categorybutton-on.gif);
}
.button:before {
    content:"Click Here For\A";
    font-style:italic;
    font-weight:normal !important;
    white-space:pre;
}
Run Code Online (Sandbox Code Playgroud)

HTML:

<a href="/" class="button">Link</a>
<a href="/" class="button">Link<br />More Details</a>
Run Code Online (Sandbox Code Playgroud)

Raf*_*łka 32

非常感谢@avrahamcool,就像一个魅力!

我有一点升级.您可以使用css替换冗余的.Centerer span

.button:before {
  content: '';
  display: inline-block;
  vertical-align: middle;
  height: 100%;
}
Run Code Online (Sandbox Code Playgroud)

请参阅此处的演示:http://jsfiddle.net/modernweb/bXD2V/

注意:这不适用于"content"属性中的文本.


avr*_*ool 19

用span(中心)包裹你的文本,然后在它之前写一个空的span(Centerer).

HTML:

<a href="..." class="button">
  <span class="Centerer"></span>
  <span class='Centered'>Link</span>
</a>
Run Code Online (Sandbox Code Playgroud)

CSS

.Centered
{
    vertical-align: middle;
    display: inline-block;
}

.Centerer
{
    display: inline-block;
    height: 100%;
    vertical-align: middle;
}
Run Code Online (Sandbox Code Playgroud)

看看这里:http://jsfiddle.net/xVnQ6/

  • `vertical_align`定义兄弟姐妹之间的对齐(而不是父母和孩子之间的对齐).所以我们创建第一个元素并将其高度设置为100%(它是一个宽度为0的元素),我们将第二个元素居中(现在它使第二个元素居中于父元素),因为第一个元素和父元素具有相同的元素高度. (2认同)

Jas*_*n C 6

您不需要为此创建任何包装元素或任何内容...只需使用内联柔性(或网格,但我将描述柔性)和中心内容,就像这样(这与使用非内联柔性相同,但添加了一个vertical-align元素来设置合理的基线):

    .button { 
      display: inline-flex; 
      flex-direction: column;
      justify-content: center;
      text-align: center;
      vertical-align: middle;
    }
Run Code Online (Sandbox Code Playgroud)
    <a href="/" class="button">Link</a>
    <a href="/" class="button">Link<br />More Details</a>
Run Code Online (Sandbox Code Playgroud)

这也适用于动态高度内容。


经历每一个;所以首先有一个显而易见的问题:

display: inline-flex;
Run Code Online (Sandbox Code Playgroud)

接下来,由于::before正在使用,因此有两个子项目(the::before和 text)。因为我想我们希望它们垂直堆叠,所以我们需要设置方向(因为默认为“行”):

flex-direction: column;     /* PS: this defines the "main" axis */
Run Code Online (Sandbox Code Playgroud)

然后,由于我们希望元素沿着垂直(即列,即主轴)打包和居中(如果您使用“行”弯曲方向,则应align-content在此处使用):

justify-content: center;
Run Code Online (Sandbox Code Playgroud)

由于我们想要将文本居中,因此每行都单独居中(请记住,每个项目默认填充十字轴,即水平轴,因此它们已经是全宽):

text-align: center;
Run Code Online (Sandbox Code Playgroud)

从技术上讲,这已经足够了,但由于这是一个内联元素,基线将遍布各处(基于内容),因此我们可以将它们设置为一致且合理的内容:

vertical-align: middle;   /* align *this* element in the *parent*! */
Run Code Online (Sandbox Code Playgroud)

就是这样;只是直接应用于元素。没有内部 div 或包装器或任何需要的东西。

如果你只有一个子元素(例如没有::before或其他),那么 Flex 方向是什么并不重要,因此你可以使用默认值稍微缩短 CSS:

/* if there's just one child, or you want to */
/* arrange children horizontally: */
.button {
    display: flex;
    align-content: center;
    text-align: center;
    vertical-align: middle;
}
Run Code Online (Sandbox Code Playgroud)

vertical-align如果元素的容器将其放置在可接受的位置并且不需要调整基线,您也可以删除。


顺便说一句,如果您愿意,也可以使用内联网格布局来完成同样的事情——单行/列网格与 Flex 有很多功能重叠:

/* using grid instead: */
.button { 
  display: inline-grid;
  grid: max-content / auto; 
  align-content: center;
  text-align: center;
  vertical-align: middle;
}
Run Code Online (Sandbox Code Playgroud)

display: inline-flex;
Run Code Online (Sandbox Code Playgroud)
flex-direction: column;     /* PS: this defines the "main" axis */
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案。在我看来,这是 2022 年最好的答案——它将适用于所有现代浏览器。+1避免使用隐藏/伪元素。 (2认同)