创建display:inline-block 时发生的一件事是line-height 的计算会发生变化:
在内联格式化上下文中,框是水平布局的,一个
在另一个之后,从包含块的顶部开始。
在这些之间尊重水平边距、边框和填充
盒子。这些框可以以不同的方式垂直对齐:它们的
底部或顶部可以对齐,或其中文本的基线
可以对齐。
来源:http://www.w3.org/TR/CSS2/visuren.html#block-formatting
计算line box中每个inline-level box的高度。为了
替换元素、行内块元素和行内表元素,
这是他们的边距框的高度;对于内联框,这是
他们的“线高”。
来源:http://www.w3.org/TR/CSS2/visudet.html#line-height
CSS 假定每种字体都有指定
基线以上的特征高度和其以下的深度。在这个
部分我们使用 A 来表示高度(对于给定字体的给定
尺寸)和 D 深度。我们还定义 AD = A + D,距离
从上到下。
来源:http://www.w3.org/TR/CSS2/visudet.html#inline-box-height
所以行高将根据它们的字体类型来定义。但是,当inline-block 为空时,它将具有基本的line-height。然而,它仍然尝试使用字体生成他的line-height。
为了快速解决这个问题,您可以使用一个包装器,它定义了没有字体的排他性,所以没有 line-height 导致没有高度:
.wrapper
{
font-size: 0;
}
您可以在inline-block 中重置此属性:
.wrapper div
{
font-size: medium;
}
font-size 的默认值为 medium。
jsFiddle
这样您仍然可以使用inline-block 中的内容而不会出现间隙。
更新
本次更新是因为Kevin Wheelers comment
...我很困惑,它仍然没有说空的 inline-block 元素的高度是多少。 ...
我要说明的是,我没有找到任何关于此的官方文档,尽管通过测试我发现了常见的模式。
短版:
只需将其视为inline-block 期望内容并根据已知的line-height 保留最小行空间。
更多见解:
JsFiddle as a more clear example
如您所见,inline-block 的高度是基于 line-height,我们在第一篇文章中已确定。
现在这个line-height 来自哪里?
它是从确定line-height 的第一个元素继承而来的:<body> 元素。
您可以测试我更改的font-size、font-family 或<body> 元素的line-height。
所以它为它的内容保留了一个line-box。根据W3 specs of inline-formatting,您可以看到它完全可见,这很奇怪:
不包含文本、不保留空白、不包含非零边距、填充或边框的内联元素,以及不包含其他流入内容(例如图像、内联块或内联表格)的行框,并且不以保留的换行符结尾必须被视为零高度行框,以便确定其中任何元素的位置,并且必须被视为不存在用于任何其他目的。
它对inline-block 内的每个其他元素都这样做,但它似乎总是保留最小的行空间。