边框框不适用于行内块元素?

border-box not working on inline-block elements?

我有一个包含 inline-block 个元素的列表,我想为悬停在其上的元素添加边框。但是,请注意边框如何偏移元素,即使我使用 box-sizing: border-box 并明确定义元素的宽度和高度也是如此。我说明了以下行为:

* { box-sizing: border-box }

ul { font-size: 0 }

li {
  display: inline-block;
  width: 100px; height: 40px; margin: 10px;
  font-size: 20px; text-align: center;
  background-color: #FFF176;
}

li:hover { border: 5px dashed grey }
<ul>
  <li>hover</li>
  <li>over</li>
  <li>me!</li>
</ul>

我找到的最佳解决方案是使用 outlineoutline-offset 而不是 border,但我真的很想知道为什么我原来的方法不起作用:/

UPDATE:虽然 BoltClock 给出了非常好的解释和建议(这是我所要求的),但我只想说我完全忘记了 flexbox, which solved pretty much all the problems I was having with inline elements. I combined it with BoltClock's transparent border trick for my final JSFiddle solution

我现在明白问题所在了。发生的事情是 box-sizing: border-box 导致每个元素的内容框在添加边框后水平和垂直收缩。因为您的元素是行内块,所以垂直收缩会影响悬停元素的基线,因此会影响它所在行的基线,从而导致同一行上的其他元素发生偏移。如果仔细观察,您会注意到文本实际上保持对齐,这是偏移元素的目标。

将边框更改为轮廓是可行的,因为轮廓设计为对布局没有影响(还因为您随后将边框完全从图片中删除)。

但是,正是由于这个原因,以这种方式使用轮廓会产生与带边框的原始效果截然不同的效果。设置初始透明边框而不是轮廓将确保您的内容保持正确的偏移量,无论边框是否在背景中可见(这在之前的答案中显示,但可能因为被否决而被删除):

* { box-sizing: border-box }

ul { font-size: 0 }

li {
  display: inline-block;
  width: 100px; height: 40px; margin: 10px;
  font-size: 20px; text-align: center;
  background-color: #FFF176;
  border: 5px dashed transparent;
}

li:hover { border-color: grey }
<ul>
  <li>hover</li>
  <li>over</li>
  <li>me!</li>
</ul>