我一直在为导航栏采用flexbox布局,并且我注意到Internet Explorer 11中有一种奇怪的行为。在Chrome,FF或Edge中不会发生。我做了一个小提琴证明:IE11 flexbox:影响布局的不透明度
https://jsfiddle.net/6L06251k/
以下是小提琴的代码的进一步精简版:
HTML
<form>
<ul>
<li>
<button>Menu item</button>
<ul id="submenu"><li><button>Submenu item</button></li></ul>
</li>
</ul>
</form>
CSS
form {
display: flex;
flex-flow: column;
}
button {
display: inline-block;
}
#submenu {
display: inline-block;
position: absolute;
opacity: 0.5;
}
li:hover #submenu {
opacity: 1; /* RULE A */
}
button:focus + #submenu {
opacity: 1; /* RULE B */
}
问题是,当我将鼠标悬停在外部菜单<ul>
上,触发规则A并将子菜单的opacity
从0.5更改为1时,外部菜单的高度增加了几个像素。如果悬停规则将不透明度设置为0.999,则不会发生这种情况。我不明白为什么元素的不透明度会影响其布局,也不知道为什么只有在不透明度变为1时才会发生,而不是0.999!另外,如果我使用规则B改变子菜单的不透明度,通过标签将焦点集中在外部<button>
上,即使应用完全相同的样式,外部菜单中的高度更改也不会发生。
对于小提琴,我可以通过使用0.999的opacity
来解决此问题,但此解决方案对于我遇到此问题的实际项目不起作用。要说明原因并不容易,所以我希望通过理解这个怪癖的基本机制,我可以找出其他的东西。
很好,谢谢 - 这是在[小提琴](https://jsfiddle.net/9roq5yj7工作/),并在我的主要项目。你有任何关于为什么发生这种情况的信息或资源?我猜这不是在现代浏览器中不会发生的事情?对我来说,这只是一种非常奇怪的混浊行为,它受到_which_ selector触发CSS变化的影响的方式特别奇怪。 –
@ JosephO'Donnell很棒,没问题。很高兴可以帮助。内联块的问题是你的div之间的空白在屏幕上变得可见。因为这是内联块的行为方式,所以它实际上并不关乎你的浏览器的现代化程度。其他浏览器正确显示它真的很有趣。有时你甚至不会注意到空白,但在你的情况下,你注意到了它,因为悬停时导航高度的变化。后来,如果你不想处理这些空白问题,你可以简单地用flex做所有事情。 – SvenL
David Walsh写了一篇关于这个话题的文章(https://davidwalsh.name/remove-whitespace-inline-block),甚至指出了更多解决空白问题的方法,但我认为在你的情况下字体大小的方法是最好的。 – SvenL