Flex自动边距在IE10 / 11中不起作用

时间:2016-05-30 22:16:21

标签: css internet-explorer flexbox internet-explorer-11 internet-explorer-10

我有一个复杂的布局,我使用flexbox将各种元素垂直和水平居中。

然后最后一个元素应用margin-right:auto;来推动元素向左移动(并否定它们居中)。

除IE10 / 11外,其他地方都能正常使用,并让我发疯。

HTML / CSS示例:



#container {
  display: -ms-flexbox;
  display: -webkit-flex;
  display: flex;
  
  -ms-flex-flow: row wrap;
  -webkit-flex-flow: row wrap;
  flex-flow: row wrap;
  
  -ms-flex-pack: center;
  -webkit-justify-content: center;
  justify-content: center;
  
  -ms-flex-align: center;
  -webkit-align-items: center;
  align-items: center;
  
  -ms-flex-line-pack: center;
  -webkit-align-content: center;
  align-content: center;
}

#second-item {
  margin-right: auto;
}

/* just some colors - not important */
#container {
  height: 200px;
  width: 100%;
  background: red;
}
#container > div {
  background: blue;
  padding: 10px;
  outline: 1px solid yellow;
}

<div id='container'>
  <div id='first-item'>first item</div>
  <div id='second-item'>second item</div>
</div>
&#13;
&#13;
&#13;

http://codepen.io/anon/pen/NrWVbR

您会在屏幕上看到两个应该在红色父母一侧左对齐的项目(即它们都应居中,但最后一个项目已应用margin-right:auto;并且正在填写整条线,将另一个项目和其自身推到一边) - 这是正确的行为。除了在IE10 / 11中,两个项目都不正确居中,即第二项margin-right:auto;被忽略。

那里的IE / flexbox专家之前遇到过类似的事情吗?

1 个答案:

答案 0 :(得分:54)

这似乎是一个IE错误。

根据flexbox规范:

  

8.1. Aligning with auto margins

     

在通过justify-contentalign-self进行对齐之前,任何正的可用空间都会分配到该维度中的自动边距。

     

注意:如果可用空间分配到自动边距,则对齐属性在该维度中不起作用,因为边距将在弯曲后窃取剩余的所有可用空间。

换句话说,自动边距优先于justify-content

实际上,如果元素应用了自动边距,则justify-contentalign-self等关键字对齐属性不起作用(因为自动边距占用了所有空间)。

您的代码在Chrome和Firefox中按预期工作,因为这些浏览器符合规范。

IE10和IE11似乎不符合规定。他们没有应用规范中定义的自动保证金。

(请注意,IE10构建于previous version of the spec。)

<强>解决方案

方法#1:仅使用自动边距

如果删除justify-content,则自动边距在IE10 / 11中正常工作。 所以不要使用justify-content。一直使用自动边距。 (See examples of alignment with auto margins)。

方法#2:使用不可见的spacer div

使用visibility: hiddenflex-grow:1创建第三个div。这自然会将#first-item#second-item转移到左边缘,而不需要自动边距。

&#13;
&#13;
#container {
  display: flex;
  flex-flow: row wrap;
  justify-content: center;
  align-items: center;
  align-content: center;
}
#third-item {
  flex-grow: 1;
  visibility: hidden;
}
/* just some colors - not important */
#container {
  height: 200px;
  width: 100%;
  background: pink;
}
#container > div {
  background: cornflowerblue;
  padding: 10px;
  outline: 1px solid yellow;
}
&#13;
<div id='container'>
  <div id='first-item'>first item</div>
  <div id='second-item'>second item</div>
  <div id='third-item'>third item</div>
</div>
&#13;
&#13;
&#13;