Flexbox 和 Internet Explorer 11 (<html> 中的 display:flex )?

129

我打算放弃使用“浮动布局”,转而在未来的项目中使用CSS弹性盒子。我很高兴地看到,所有主要的浏览器在它们当前版本中似乎都支持(以某种方式)弹性盒子。

我去"Solved by Flexbox"查看了一些示例。然而,“粘性底部”示例在Internet Explorer 11中似乎不起作用。我进行了一些尝试,并通过给<html>添加display:flex和给<body>添加width:100%使其正常工作。

因此,我的第一个问题是:有人能解释一下这个逻辑吗?我只是摆弄了一下,它就工作了,但我不太明白为什么它要这样工作...

然后是“媒体对象”示例,在除了Internet Explorer之外的所有浏览器中都可以工作。我也尝试了一些方法,但没有成功。

因此,我的第二个问题是:有没有“干净”的方法让“媒体对象”示例在Internet Explorer中工作?


2
这是对这个旧问题的更新:链接的演示在IE11上运行良好。自提出此问题以来,可能已经修复了一个错误。 - Daryl
5个回答

159
根据http://caniuse.com/#feat=flexbox
"根据2013年9月的草案规范,IE10和IE11中flex属性的默认值为0 0 auto而不是0 1 auto"
换句话说,如果你的CSS中有像这样的代码:flex:1,它在所有浏览器中的表现并不相同。尝试将其更改为1 0 0,您可能会发现它“差不多”起作用。
问题是这种解决方案可能会破坏Firefox,但您可以使用一些技巧来只针对Mozilla进行更改:
@-moz-document url-prefix() {
 #flexible-content{
      flex: 1;
    }
}

由于 flexbox 目前只是 W3C 候选标准,而不是官方标准,所以各个浏览器的表现可能会有所不同,但我猜这种情况在不久的将来会发生改变。

如果有更好的答案,我很想知道!


1
我认为这意味着IE10需要-ms-flex: 1 0 0;,而IE11需要flex: 1 0 0;..? - Eystein
20
在使用Google Chrome 39时,这个功能突然停止工作。我花了很长时间才找到原因,发现是第三个数字的规范问题。Chrome 39不遵循 flex: 1 0 0;。但是 flex: 1 0 0%;(注意 % 符号)或者 flex: 1 0 auto; 可以正常工作。 - Eystein
是的,这是真的,它也破坏了我的一些设计!我只需将其更改为 flex: 1; 就解决了问题。 不过,这可能取决于你想要实现什么效果... - Odisseas
2
IE11的核心问题在于它计算flex-basis的方式。Github上有一个很好的讨论,解释了为什么在某些情况下flex:1 0 100%适用于IE11,而在其他情况下flex: 1 0 0%或者flex: 1 0 auto适用。你必须提前知道内容。 - P.Brian.Mackey
这个,再加上在html,body上设置height:100%,看起来已经解决了我的问题。谢谢。 - Kenmore
显示剩余3条评论

51

使用另一个 Flex 容器来解决 IE10 和 IE11 中的 min-height 问题:

HTML

<div class="ie-fixMinHeight">
    <div id="page">
        <div id="header"></div>
        <div id="content"></div>
        <div id="footer"></div>
    </div>
</div>

CSS

.ie-fixMinHeight {
    display:flex;
}

#page {
    min-height:100vh;
    width:100%;
    display:flex;
    flex-direction:column;
}

#content {
    flex-grow:1;
}

请查看演示

  • 不要直接在 body 上使用 flexbox 布局,因为这会破坏通过 jQuery 插件(自动完成、弹出框等)插入的元素。
  • 不要在容器上使用 height:100%height:100vh,因为这会导致页脚固定在窗口底部且不适应长内容。
  • 使用 flex-grow:1 而不是 flex:1,因为 IE10 和 IE11 的默认值为 0 0 auto 而不是 0 1 auto

3
我发现我需要在.ie-fixMinHeight中添加flex-direction: column,以避免产生副作用。如果您没有IE特定的HTML,可以使用.fixMinHeight { display: -ms-flexbox; -ms-flex-direction: column; } - Mark Horgan
我知道这已经是两年前的事了,但还是谢谢!我一直在遵循这个 https://dev59.com/6XVD5IYBdhLWcg3wGXhI#24979148 ,并且花费了很长时间试图弄清楚为什么IE无法正常工作,而Edge和Chrome却完美无缺。heightmin-height之间的区别是关键。 - TyCobb

41
你只需要使用flex:1;这将解决IE11的问题。我支持Odisseas的观点。此外,请将html和body元素的高度分别设为100%
CSS更改:
html, body{
    height:100%;
}
body {
    border: red 1px solid;
    min-height: 100vh;
    display: -ms-flexbox;
    display: -webkit-flex;
    display: flex;
    -ms-flex-direction: column;
    -webkit-flex-direction: column;
    flex-direction: column;
}
header {
    background: #23bcfc;
}
main {
    background: #87ccfc;
    -ms-flex: 1;
    -webkit-flex: 1;
    flex: 1;
}
footer {
    background: #dd55dd;
}

working url: http://jsfiddle.net/3tpuryso/13/


请您能详细解释一下这个问题吗:在IE中是否有一种“清晰”的方法来让“媒体对象”示例正常工作? - Ashok Kumar Gupta
1
这对我很有效。我发现的一件事(因为它让我困惑了)是,如果你有一个包含元素,则必须将display: flex;和相关样式应用于body和容器:http://jsfiddle.net/Skateside/nezdrrkr/ - James Long
将html高度设置为100%似乎会导致main的内容无法正常增长(至少在Chrome中); 如果添加足够的内容,它将超出页脚。 http://jsfiddle.net/3tpuryso/65/ - FoolishSeth
@FoolishSeth 目前的设置是让容器增长到100%,不再多一个像素。你应该将html设置为min-height: 100%,以便根据内容自适应大小。 - Odisseas
谢谢!对我来说缺失的部分实际上不是任何弹性属性,而是包含元素上的height:100%(对我来说是一个.pusher div,因为我的网站包括一个响应式侧边栏)。 - zanther
这里设置100%高度解决了我的问题。 - Neil Morgan

0
有时候,只需要在样式前面添加“-ms-”,例如-ms-flex-flow: row wrap;,就可以让它正常工作。

0
这是一个使用flex的示例,它在Internet Explorer 11和Chrome中也可以正常工作。
HTML

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1" >
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" >
<title>Flex Test</title>
<style>
html, body {
    margin: 0px;
    padding: 0px;
    height: 100vh;
}
.main {
    display: -webkit-flex;
    display: flex;
    -ms-flex-direction: row;
    flex-direction: row;
    align-items: stretch;
    min-height: 100vh;
}

.main::after {
  content: '';
  height: 100vh;
  width: 0;
  overflow: hidden;
  visibility: hidden;
  float: left;
}

.left {
    width: 200px;
    background: #F0F0F0;
    flex-shrink: 0;
}

.right {
    flex-grow: 1;
    background: yellow;
}
</style>
</head>

<body>
<div class="main">
    <div class="left">
        <div style="height: 300px;">
        </div>
    </div>

    <div class="right">
        <div style="height: 1000px;">
            test test test
        </div>
    </div>
</div>
</body>
</html>


16
请提供更多信息,而不仅仅是粘贴您的HTML。 - Peter
8
虽然这个答案可能是正确和有用的,但最好您在其中包含一些解释来解释它如何帮助解决问题。如果将来发生了变化(可能不相关),导致它停止工作并且用户需要了解它曾经的工作原理,这将尤其有用。 - Erty Seidohl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接