如何在上标元素中保持一致的行高?

162
如果在一个多行段落中有一个元素,那么带有上标的那一行的行间距会比其他行大,无论我在段落上设置什么行高。

这并不意味着我有很多段落,每个段落都只有一行。我只有一个段落,其中包含足够的内容,使其换行成多行。在文本的任何地方(任何地方)可能会有一个。这会通过在上方/下方添加额外的间距来影响该行的行高。如果我在段落上设置更大的行高,这对问题没有任何影响。行高增加了,但额外的间距仍然存在。

我该如何使其保持一致 - 即所有行的间距都相同,无论它们是否包含

您的解决方案必须支持跨浏览器(IE 6+,Firefox,Safari,Opera,Chrome)。

16个回答

203

设置行高确实可以解决问题,但您可能需要将其设置得很大:在我的设置中,我必须将行高增加到大约1.8才能使<sup>不再干扰它,但这会因字体而异。

获得一致的行高的一种可能的方法是设置自己的上标样式,而不是使用默认的vertical-align:super。如果您使用top,它将不会向行框添加任何内容,但您可能还需要进一步减小字体大小以适应它:

sup { vertical-align: top; font-size: 0.6em; }

你可以尝试使用定位来将其向上移动一点而不影响行框:

sup { vertical-align: top; position: relative; top: -0.5em; }
当然,如果你的行高不够,这样做就有撞上上一行的风险。

1
vertical-align 修复了,谢谢。即使是巨大的行高 300%+ 在 IE8、Chrome 3 或 FF 3.5 中也不能解决它。我仍然有1-2像素的差异。 - Andrew Bullock
正如所提到的,如果行高太紧密,则此方法并不总是有效。 - Ric
5
同样的情况下,使用vertical-align: bottom(虽然不如使用top效果明显),再配合使用position:relative;和一个正值的top属性。 - bobince
实际上,我更喜欢使用{vertical-align: super},因为据我所记,在IE8中它可以防止一些与行高相关的显示故障。如果有更好的替代方案,我会尽量避免过多地使用定位。粗心的顶部定位可能会在项目后期导致级联问题。 - All Bits Equal
字体大小:0.75em - 1.21 gigawatts
第二个选项对我有用。我遇到了与OP相同的问题。奇怪的是,我还必须将vertical-align值从“super”更改为“top”。看起来,“super”值应该包含这个值。 - kdub1312

129
sup {
    line-height: 0;

    /* The following rules (or similar) likely come from browser 
     * style and are not needed
     */
    font-size: 0.83em;
    vertical-align: super;
}

诀窍在于将<sup>的行高设置为0。@Scott建议使用normal,但这并不总是有效。

这意味着您不必更改周围文本的行高以适应上标文本。我已在IE7+和其他主要浏览器中进行了测试。


2
+1. 如上所述,这可以避免与其他 line-height 属性发生冲突。当然,如果整体的 line-height 设置得太小,仍然可能会与前一行发生交叉。 - Chris Krycho
太棒了,这个解决方案让Chromium不再出现问题!这是迄今为止最简单的答案。 - Aktau
1
刚刚意识到这会影响周围文本的非默认行高。在这种情况下,请使用 line-height: 100% - Matthias Hauert
这个完美地工作。此外,我发现 line-height 的可能值为0、1、1em和100%。所有这些值在Chrome和Firefox中肯定都有效。 - ClarkeyBoy
我对我的使用情况也更喜欢这个答案:这个答案适用于Gmail中的电子邮件,而被接受的答案则不适用。https://dev59.com/1WEi5IYBdhLWcg3wnNTA - Mshnik

9

我也遇到了同样的问题,但是所有给出的答案都没有生效。不过我发现一个 Git 提交记录,其中包含一个有效的解决方案:

sup {
  font-size: 0.8em;
  line-height: 0;
  position: relative;
  vertical-align: baseline;
  top: -0.5em;
}

5

保持简单:

sup { vertical-align: text-top; }

[字体大小取决于您的个人字体]


4

我更倾向于这里提出的解决方案 (链接),以这个 jsfiddle 为例:

CSS:

sup, sub {
  vertical-align: baseline;
  position: relative;
  top: -0.2em;
}

sub {
  top: 0.2em;
}

HTML:

<span>The following equation is perhaps the most well known of all: </span><span id="box">E<sub>a</sub> = mc<sup>2</sup></span><span>.  And it gives an opportunity to try out a superscript and even throw in a superfluous subscript!  I'm sure that Einstein would be pleased.</span>.

这个解决方案的美妙之处在于,您可以调整上下标的垂直位置,以避免与上下行发生冲突... 在上面的代码中,只需增加或减少0.2em来适应您的要求。

3
sup, sub {
  vertical-align: baseline;
  position: relative;
  top: -0.4em;
}
sub { 
  top: 0.4em; 
}

3
请在您的代码中提供解释,以便原帖作者能够从中学习。 - EBH

3

我只需要在页面的一个部分更改默认的<sup>行为,因此我在那里应用了一个类。对于我来说,垂直对齐:顶部效果非常好,向上调整约4个像素。

sup.my-class {
    vertical-align: top;
    position: relative;
    top: -4px;
}

2
<sup>标签影响两行之间的间距的原因与多个因素有关,包括行高、上标字体大小与普通字体大小之比、上标的行高以及上标底部的对齐方式等。如果将普通文本的行高设置为"隧道带"(这是我称之为的),即135%,那么普通文本(100%)会增加35%或更多的空白填充。对于一个段落来说,是这样的:
 p
    {
            line-height: 135%;
    }

如果您不对上标进行白色填充(即保持其行高为0),则上标只有自己文本的宽度...如果您要求上标成为正常字体的百分比(例如70%),并将其与正常文本的中间对齐(text-middle),您就可以消除问题并获得看起来像上标的上标。这是它的样子:
sup
{
    font-size: 70%;
    vertical-align: text-middle;
    line-height: 0;
}

1

我更喜欢在 vertical-align 上使用 length。这会将元素的基线与其父元素的基线相差给定的长度对齐。

sup {
   font-size: .83em;
   vertical-align: 0.25em;
   line-height: 0;
}

0

这是我的代码正常运作:

<div>
 <span>line</span><br/>
 <span>span styled with vertical align super</span><span style="vertical-align:super;">1</span><br/>
 <span>line</span><br/>
 <span>same as before but line height set to 0</span><span style="vertical-align:super; line-height:0; font-size:.75em">1</span><br/>
 <span>line</span><br/>
 <span>now using sup tag and sup class with line height 0</span><sup style="line-height: 0">1</sup><br/>
 <span>line</span>
</div>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接