当前位置: 首页 > 知识库问答 >
问题:

Firefox 34忽略flexbox的最大宽度[重复]

关昊天
2023-03-14

我在Firefox 34及以上版本中发现了一个与显示行为有关的错误: flex。

我可以确认代码在所有现代浏览器中都一直有效,现在仍然有效,但是Firefox34和最近的Firefox35测试版的行为完全不一致。

我制作了一把小提琴,展示了不同的行为:http://jsfiddle.net/ntkawu63/

在Firefox34中启动它,它将忽略图像上的最大宽度:100%。在任何其他浏览器中,包括Firefox33,它都会将最大宽度应用于图像并正常显示。

<style>
.mediaContainer
{
    zoom: 1;
    overflow: visible;
    position: relative;
}

.mediaCenterContainer
{
    display: flex;
    justify-content: center;
    align-items: center;
}

.imageContainer
{
    margin: 0 auto;
}

.imageContainer img
{
    margin-bottom: 10px;
    max-width: 100%;
}
</style>

<div class="mediaContainer mediaCenterContainer">
    <div class="imageContainer">
        <img src="http://dummyimage.com/1920x1080/000/fff.png&text=This+is+a+flex+box+test+for+Firefox+340x2B.+In+Chrome,+the+image+will+be+max-width:+1000x25.+In+Firefox+the+image+will+be+centered,+but+not+have+a+constrained+width." class="Image Tag Crop" alt="My Dog" data-realwidth="1000" data-realheight="670" data-scalewidth="944" data-scaleheight="633" />
    </div>
</div>

这段代码是否有问题,或者这是Mozilla应该引起的bug?

共有1个答案

卜昂熙
2023-03-14

这里的重要方面是

  1. flex项目div.imageContainer需要一个正的flex收缩
  2. flex项的(show: inlineimg子项需要自己的约束来确保它不会溢出flex项
  3. 根据W3C flexbox规范*,flex项需要某种明确的大小约束,我们可以通过在上删除min-ware: 1pxmax-ware: 100%来满足。ImageContainer;否则,根据规范,. ImageContainer必须采用其内容的大小,即PNG图像的完整1000px固有大小

OP的问题已经满足了第2点,但不是第1点和第3点。以下是我使用的CSS:

.mediaContainer
{
    overflow: visible;
    width:100%;
}

.mediaCenterContainer
{
    display: flex;
}

.imageContainer
{
    flex-shrink:1;
    min-width:1px;
}
.imageContainer img {
    max-width:100%;
}

...这里有一把小提琴来演示它。

非常感谢@dma_k指出我原来答案中的错误。

*我通常讨厌链接到W3C规范,但这一部分实际上很可读;我会鼓励人们阅读它。

如果您约束div而不是img,那么firefox36(当前为dev预览版)将提供您期望的行为。您可以使用flex shrink来执行此操作:

.imageContainer {
  flex-shrink:1;
}

...或短手flex属性:

.imageContainer {
  flex: 0 1 auto;
}

…或使用您在img上以及div上的max width声明:

.imageContainer, .imageContainer img {
  max-width:100%;
}

因此Firefox允许flex元素溢出其容器。我不太了解flexbox规范,但这种情况似乎很自然;这就是flex-shrink属性存在的原因。

 类似资料:
  • 问题内容: 我有这个设置: HTML : CSS : 通过此设置,它可以在iPhone上运行,但不能在浏览器中运行。 是因为我已经在meta中,也许已经在? 问题答案: 我发现最好的方法是为较旧的浏览器编写默认CSS,因为较旧的浏览器包括5.5、6、7和8。无法读取@media。当我使用@media时,我会这样使用: 但是,您可以使用@media进行任何操作,这只是为所有浏览器构建样式时最适合我的

  • 问题内容: 以下代码在Chrome或IE中正确显示(图像为200px宽)。在Firefox和Opera中,样式被完全忽略。为什么会发生这种情况,并且周围有很好的解决方法?另外,最符合标准的方法是什么? 注意 针对这种特殊情况的一种可能的解决方法是将设置为。但是,这是一个非常人为的示例。我正在寻找可变宽度容器的策略。 [更新] 如下面的mVChr所述,w3.org规范声明不适用于元素。我尝试使用,但

  • 抱歉,如果以前有人问过这个问题,但我花了很长时间搜索都没有成功。 我有一个面板,我试图使用GridBagLayout添加一些组件。 问题是,出于某种原因,我无法理解-我试图添加的JTextArea似乎忽略了分配给它的宽度-它似乎接受高度没有问题。 除了文本区域之外,所有组件都添加得很好——文本区域的宽度应该为3,但显示宽度为1。 我不明白为什么会这样,有人能帮忙吗? 提前感谢您的帮助。 代码:(编

  • 我想在flexbox中保持5/3宽高比。我想要的框是33%的屏幕高度,我想堆叠其中两个在对方的顶部与flexbox与flex方向设置为列。这似乎打破了宽高比。如果我设置宽度,它再次工作。有没有一种方法可以在不使用JavaScript计算宽度的情况下做到这一点?我应该做些别的吗? 这里有一个代码笔来演示这个问题。https://codepen.io/voxlz/pen/WNjPoqY html: c

  • 我这里有这个代码: 如您所见,第二列和第三列前面有一些空白。 有没有办法摆脱这个问题?

  • 问题内容: 我正在尝试编写一个分为三部分的搜索菜单。如果没有足够的垂直空间显示结果,则每个部分都会有一个滚动条。 在Chrome和Firefox中,每个菜单都显示其滚动条,但是在IE11上,菜单与包装器重叠。 我已经编写了一个可在Chrome和Firefox上运行的示例(Firefox很棘手,我需要添加多个菜单级别)。 我在IE 11上缺少什么吗? 问题答案: 要在Chrome,Safari,Fi