【问题标题】:Firefox, Flexbox & overflowFirefox、Flexbox 和溢出
【发布时间】:2015-02-10 01:17:26
【问题描述】:

在上次 firefox-update 之后,一些 css3 代码被破坏了...Example (jsfiddle)。

  • 铬:
  • 在 Firefox 34 中:

这是错误吗?还是正常上班?我需要改变什么来修复它?为什么#flex 没有正确调整大小?

HTML:

<div id="outer">
    <div id="flex">
        <label>123</label>
        <input type="text" value="some text" />
    </div>
</div>  

CSS:

#outer { display: flex; }

#flex {
    display: flex;
    border: 1px solid green;
    outline: 1px solid red;
}

label { flex: 0 0 80px; }

【问题讨论】:

  • input { min-width: 1px; } 修复问题。 -moz-min-content...
  • 感谢您提出这个问题。我在我们的系统中看到这种行为可能是从版本 33 或 32 开始。请提及您使用的 box-sizing 模型,因为我认为问题与它有关。
  • @AshrafSabry,内容框
  • jsfiddle.net/944tL115/20 不能工作有什么原因吗?直接设置width属性就行了?

标签: css flexbox


【解决方案1】:

修复:

input { min-width: 1px; }

垂直方向 - min-height;

【讨论】:

【解决方案2】:

Firefox 34 中存在一个错误。其中一个元素作为 flex child 不能很好地发挥作用,并且输入似乎太宽了。弹性容器的绿色边框没有考虑这个额外的宽度。


这可以确认为错误,因为在 Firefox 33.1(和 Chrome / IE)中,您的示例没有问题:

您的示例 Firefox 33.1

您的示例 Firefox 34.0.5 — 输入宽度被 flex 容器计算错误,输入本身不能被赋予更小的宽度。


作为一种解决方法,我们可以在标签上设置宽度;这个宽度被容器识别,并且在 Firefox 34 中防止了该错误。为了仅在 Firefox 中使用,我们可以使用带有 calc 的 -moz- 前缀来设置宽度:

label {
    width: -moz-calc(80px);
}

(显然以前版本的 Firefox 也会识别这个宽度)

Bug 解决方法示例

使用 inline-flex

从您的示例中,您似乎想使用inline-flex 来将表单的宽度包含在其子项的宽度中。我已经使用了它并删除了不再需要的额外 div。 每个浏览器的输入宽度存在很大差异(这与您问题中的示例一致)。

火狐 33

火狐 34

IE11

form {
  display: inline-flex;
  border: solid 1px green;
  outline: 1px solid red;
}
label {
  flex: 0 0 80px;
  width: -moz-calc(80px);
}
<form>
  <label>123</label>
  <input type="text" value="some text" />
</form>

【讨论】:

  • Mozilla 是否承认这是一个错误?他们的错误跟踪器上提到过吗?在 32 或 33 或 34 版本之前,我的 flexbox UI 在 Firefox 上运行良好(不确定,因为我使用的是比发布版本早两个版本的开发人员版本)
  • 也对@AshrafSabry 的上述问题感兴趣;谁能确认这确实是一个错误?
  • @AshrafSabry 由于规格变更:developer.mozilla.org/en-US/Firefox/Releases/34/…
  • @sergio91pt - 很好的发现。所以根本不是错误,我认为我的答案不再有用了。您能否在已接受的答案下方添加您的评论?我稍后会将其编辑为该答案并删除此帖子。
【解决方案3】:

变体

min-width: 0

也可以

【讨论】:

    【解决方案4】:

    您可以做的是,从100% 中减去80px,并将width 设置为input。此外,添加box-sizing: border-box 以防止溢出。

    form {
      display: flex;
    }
    #flex {
      display: flex;
      border: 1px solid green;
      outline: 1px solid red;
    }
    label {
      display: flex;
      flex: 0 0 80px;
    }
    input {
      width: calc(100% - 80px);
      box-sizing: border-box;
    }
    <form>
      <div id="flex">
        <label>123</label>
        <input type="text" value="some text" />
      </div>
    </form>

    【讨论】:

    • 添加到评论(下面的答案)奇怪的“解决方案”:input { min-width: 1px; }... 工作。错误还是没有错误? :)
    • @faiwer - 太棒了!是的,奇怪的解决方案。我不会说它是一个错误,它只是不同的浏览器如何呈现元素。
    【解决方案5】:

    Display: flex; only 需要在需要灵活的容器上,而不是内部元素。这是更新后的 CSS,如果您需要特定宽度,可以在 form {} 上设置。

    CSS

    form {}
    
    #flex {
        display: flex;
        border: 1px solid green;
        outline: 1px solid red;
    }
    
    #flex > * {
        flex: 1;
    }
    
    label {}
    
    input {}
    

    【讨论】:

    • 你丢失了问题:) label 没有flex-basisform 没有display: flex。我最小的 jsfiddle 代码有它。当前版本没有 display: flex 标签(错误) - jsfiddle.net/944tL115/4
    猜你喜欢
    • 2014-05-28
    • 2020-10-12
    • 2017-12-10
    • 2017-08-25
    • 1970-01-01
    • 2017-02-21
    • 2018-03-03
    • 1970-01-01
    • 2012-03-04
    相关资源
    最近更新 更多