位置绝对的Flexbox容器不适合IE中的内容宽度

时间:2017-09-05 07:59:03

标签: css css3 flexbox css-position internet-explorer-11

我是flexbox的新手,我的问题如下:

我的导航上有一个子菜单绝对定位并使用flexbox。

Chrome / Firefox中的一切正常,没有测试Safari。

IE11显示我的子菜单,但其子元素溢出(这打破了我的:hover)。

在IE中检查此codepen以查看问题(简化版本):

https://codepen.io/CamilleVerrier/pen/GvLojN

我在StackOverflow或CanIUse中尝试了很多建议,比如单独设置flex适当性:

ul.sub-menu li {
    flex-grow:0;
    flex-shrink:1;
    flex-basis:0px;
}

但它似乎不起作用。

在我的测试中,我发现如果我删除position:absolute,一切都会再次起作用(但我的菜单显然会中断)。

所以...是返回内联块还是浮点数的解决方案? (请不要啊)

谢谢! (对不起我的英语)

/* General styles */

body {
  background: tomato;
  font-size: 1.2rem;
  font-weight: bold
}

a {
  color: black;
  text-decoration: none;
}

li {
  list-style: none;
}

ul li {
  font-size: 1.6rem;
  display: inline-block;
  margin-left: 40px;
  text-transform: uppercase;
}

ul li.menu-metier {
  position: relative;
  padding-bottom: 25px;
}


/* SubMenu */

ul.sub-menu {
  display: -webkit-box;
  display: flex;
  display: -ms-flexbox;
  position: absolute;
  background: white;
  top: 45px;
  left: 0;
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24);
}

ul.sub-menu li {
  margin: 10px;
  flex-grow: 0;
  flex-shrink: 1;
  flex-basis: auto;
}

ul.sub-menu li a {
  display: -ms-flexbox;
  display: flex;
  flex-direction: column;
}

ul.sub-menu li a img {
  padding: 0;
  margin-bottom: 5px;
  align-self: center;
}

ul.sub-menu li a span {
  text-align: center;
  font-size: 1rem;
  align-self: center;
}
<ul>
  <li><a href="#"><span>Accueil</span></a></li>
  <li class="menu-metier"><a href="#"><span>Notre métier</span></a>
    <ul class="sub-menu">
      <li>
        <a href="#">
          <img width="170" height="102" src="http://lorempixel.com/170/102">
          <span>Séminaire et Incentive</span>
        </a>
      </li>
      <li>
        <a href="#">
          <img width="170" height="102" src="http://lorempixel.com/170/102">
          <span>Congrès et rencontres</span>
        </a>
      </li>
      <li>
        <a href="#">
          <img width="170" height="102" src="http://lorempixel.com/170/102">
          <span>Communication Design</span>
        </a>
      </li>
    </ul>
  </li>
  <li>
    <a href="#">
      <span>L’agence</span>
    </a>
  </li>
  <li>
    <a href="#">
      <span>Photos</span>
    </a>
  </li>
</ul>

2 个答案:

答案 0 :(得分:3)

问题与flexbox无关。

这是浏览器中绝对定位渲染变化的问题。

在元素上设置position: relative时,它会为position: absolute的后代设置边界框。

在Chrome中,绝对定位的后代可以溢出边界框。

在IE11中,它们不是。一旦达到边界框的限制,绝对定位的元素就会被切断。

一种解决方法是从容器中删除position: relative。现在绝对定位的子菜单有一个更大的边界框(基于最近的定位祖先,或者,如果不存在,则包含初始包含块(即视口))。

ul li.menu-metier {
   /* position: relative; */
   padding-bottom: 25px;
}

revised demo

另一种解决方法是调整right偏移量以容纳内容。

ul.sub-menu {
    right: -600px;
}

revised demo

您也可以尝试设置宽度。

这些选项都不是很漂亮。但话说回来,我们正在处理IE。

您可以通过搜索找到其他解决方法。

答案 1 :(得分:0)

删除flex-basis似乎解决了IE上的问题,但您必须设置width来修复后台问题。

https://codepen.io/anon/pen/wqZWav