边框框不适用于行内块元素?
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>
我找到的最佳解决方案是使用 outline
和 outline-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>
我有一个包含 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>
我找到的最佳解决方案是使用 outline
和 outline-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>