为啥 Gecko 和 Blink 在处理 inline-block 元素时高度计算如此不一致?

Posted

技术标签:

【中文标题】为啥 Gecko 和 Blink 在处理 inline-block 元素时高度计算如此不一致?【英文标题】:Why is the height calculation so inconsistent in Gecko and Blink when dealing with inline-block elements?为什么 Gecko 和 Blink 在处理 inline-block 元素时高度计算如此不一致? 【发布时间】:2015-09-27 20:47:25 【问题描述】:

如下所示,Gecko 和 Blink 对不同的 inline-block 元素执行不一致的高度计算,即使它们都具有相同的 css 类。似乎 (*pause*) Trident 是唯一能做到这一点的布局引擎。

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

此外,正如您在此 fiddle 中所见,如果我将填充从 .3em 更改为 1em,则 Blink 将按预期呈现。所有元素都具有相同的高度。 Gecko 仍然“坏掉”了。

有谁知道为什么会发生这种情况以及如何解决它?


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

壁虎(Firefox v. 39.0)


闪烁(Google Chrome v. 43.0.2357.132 m):


三叉戟(Internet Explorer v. 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;
&lt;a class="button" href="#"&gt;button&lt;/a&gt;&lt;button class="button"&gt;button&lt;/button&gt;&lt;input class="button" type="button" value="button" /&gt;&lt;span class="button"&gt;button&lt;/span&gt;

【问题讨论】:

【参考方案1】:

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

要解决它,请始终将其添加到您的 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;

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

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

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

将上面的两个属性一起声明总是一个好习惯 - 如果您指定 inline-block,请务必记住指定垂直对齐方式,以防止错位。

【讨论】:

太棒了!请注意:您的 Gecko 修复使情况变得更糟。但是,如果我删除 margin-topmargin-bottom 属性,一切看起来都很完美。谢谢! 是的,上边距和下边距可能需要根据个人用例进行调整(有时 0 效果最好)。这取决于您的box-sizingline-height 等一些东西。我通常使用border-boxpx 高度,而-2px 有效。如果没有,请尝试一下,一旦找到好的设置,将其用作“重置”的一部分,然后忘记它。

以上是关于为啥 Gecko 和 Blink 在处理 inline-block 元素时高度计算如此不一致?的主要内容,如果未能解决你的问题,请参考以下文章

影响回流、重绘的 CSS 属性都有哪些?

前端笔试总结

浏览器运行原理

一些前端面试题

浏览器内核趣对话

碎点小结