为什么在处理行内块元素时,Gecko 和 Blink 的高度计算如此不一致?

Why is the height calculation so inconsistent in Gecko and Blink when dealing with inline-block elements?

正如您在下面看到的,Gecko 和 Blink 对不同的内联块元素执行不一致的高度计算,即使它们都具有相同的 css class。似乎 (*pause*) Trident 是唯一正确的布局引擎。

我是否忘记(重新)设置 属性?

此外,如您在此 fiddle 中所见,如果我将填充从 .3em 更改为 1em Blink 会按预期呈现.所有元素都具有相同的高度。不过 Gecko 仍然 "broken"。

有谁知道为什么会这样以及如何解决?


<a> <button> <input> <span>

Gecko(火狐 39.0 版)


Blink (Google Chrome v. 43.0.2357.132 m):


Trident(Internet Explorer 版本 11.0.9600.17843):


body {
    font: normal 15px arial;
    padding: 1em;
}

.button {
    background: #444444;
    border: none;
    box-sizing: content-box;
    color: #ffffff;
    cursor: pointer;
    display: inline-block;
    font-family: arial;
    font-size: 1em;
    height: auto;
    line-height: normal;
    margin: 0;
    min-height: 1em;
    padding: .3em;
    text-decoration: none;
}
<a class="button" href="#">button</a><button class="button">button</button><input class="button" type="button" value="button" /><span class="button">button</span>

对于 Gecko (Firefox),这是由于表单元素在 ::moz-focus-inner 上的边框。如果您注意到,表单元素(inputbutton)总是比其他元素宽和高约 2 像素。

要解决它,请始终将此添加到您的 CSS(作为重置的一部分):

button::-moz-focus-inner{
    border:0;
    padding:0;
    margin-top:-2px;
    margin-bottom:-2px;
}
input::-moz-focus-inner{
    border:0;
    padding:0;
    margin-top:-2px;
    margin-bottom:-2px;
}

负边距是必要的,以便字体在行高中显示 "correctly"。您可能需要调整这些值以适合您的行高,但这些值大部分都可以正常工作。

对于Blink (Chrome),元素实际上大小相同,但唯一的问题是它们是"mis-aligned"。您会注意到,在 inline-block 设置中,有时表单元素的显示略低于其他元素。要解决它,只需确保它们都使用相同的垂直对齐方式,例如:

display: inline-block;
vertical-align: top;

将上述两个属性一起声明总是一个好习惯 - 如果您指定内联块,请始终记住指定垂直对齐,以防止错位。