为什么Firefox和Opera会忽略display:table-cell内部的最大宽度?


67

以下代码在Chrome或IE中正确显示(图像为200px宽)。在Firefox和Opera中,max-width样式被完全忽略。为什么会发生这种情况,并且周围有很好的解决方法?另外,最符合标准的方法是什么?

注意

针对这种特殊情况的一种可能的解决方法是将设置max-width200px。但是,这是一个非常人为的示例。我正在寻找可变宽度容器的策略。

<!doctype html>
<html>
<head>
    <style>
        div { display: table-cell; padding: 15px; width: 200px; }
        div img { max-width: 100%; }
    </style>
</head>
<body>
    <div>
        <img src="http://farm4.static.flickr.com/3352/4644534211_b9c887b979.jpg" />
        <p>
            Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec facilisis
            ante, facilisis posuere ligula feugiat ut. Fusce hendrerit vehicula congue.
            at ligula dolor. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
            leo metus, aliquam eget convallis eget, molestie at massa.
        </p>
    </div>
</body>
</html>

[更新]

如下面的mVChr所述,w3.org规范声明max-width不适用于inline元素。我尝试使用div img { max-width: 100%; display: block; },但似乎无法解决问题。

[更新]

对于这个问题,我仍然没有解决方案。但是,我正在使用以下JavaScript hack来解决我的问题。从本质上讲,它重新创建浏览器是否支持上述情况,并检查max-widthdisplay: table-cell。(使用数据uri可以防止额外的http请求。下面的请求是3x3 bmp。)

jQuery( function ( $ ) {

    var img = $( "<img style='max-width:100%' src='" +
    "data:image/bmp;base64,Qk1KAAAAAAAAAD4AAAAoAAAAAwAAA" +
    "AMAAAABAAEAAAAAAAwAAADEDgAAxA4AAAAAAAAAAAAAAAAAAP//" +
    "/wAAAAAAwAAAAKAAAAA%3D" +
    "'>" )
    .appendTo(
        $( "<div style='display:table-cell;width:1px;'></div>" )
        .appendTo( "body" )
    );
    $.support.tableCellMaxWidth = img.width() == 1;
    img.parent().remove();

});

不太确定您要实现什么目标?您要缩放图像吗?
edl

1
+1不,他的榜样很好。图片有... 400px。如果告诉它得到width: 100px;它将缩小。但是它不尊重最大宽度。
ANeves认为SE是邪恶的

好的我明白了。而且您不想设置div的最大宽度吗?
edl

@edl不,div可以是可变宽度。
布拉德(Brad)2010年

Answers:


31

w3.org规范指出,最大宽度并不适用于内联元素,所以你会得到跨浏览器的行为不一致。我不确定您的预期结果,但是如果您设置div img { display:block }和然后将imgp标记与浮点数而不是标准内联对齐,就可以实现。


好发现!似乎该规范不适用于内联元素。不幸的是,它似乎无法解决问题。
布拉德(Brad)2010年

显示屏必须是表格单元吗?删除该标签将使您获得更一致的结果。
edl

好吧,我没有编写使用的代码,table-cell说实话,我不太了解。是的,它必须是表格单元。
布拉德(Brad)2010年

您是否可以重写页面,以便所有divdisplay:table-cell;实际上都是表格单元格。我看不到使用div的好处,如果您将它们显示为table-cell
Brook Julias 2010年


120

您需要做的是将包装器div(带有的display: table-cell那个)放在另一个具有display: table 和的 div中table-layout: fixed。这使得Firefox和Opera都遵守max-width规则。

请参阅jsFiddle上的示例


我尝试过表格布局:固定在FF(19)和IE(9)上,即使没有最大宽度也可以使用。
civilu

对我来说,表格布局:固定规则解决了图像问题,但即使我有宽度,也使整个表格变窄了:带有显示元素的元素为:table
Evgeny

表布局developer.mozilla.org/zh-CN/docs/Web/CSS/table-layout的MDN参考。谢谢亚历克斯!
Vestride

在我的情况下,我无法为父容器设置像素宽度,
而是

谢谢!我在普通的Android浏览器中遇到了一个可能相关的问题(试图在具有display:table-cell的元素内的图像上使用max-width百分比),并table-layout: fixed为我解决了这个问题。
Yumecosmos 2014年

0

我使用width: 100%代替使其工作max-width: 100%


10
这是一个非常糟糕的答案。width和之间的差异max-width在处理图像时非常重要。width强制将图像设置为该宽度,无论该宽度是否大于其分辨率(大多数情况下看起来都很讨厌)。但是max-width定义了图片不能大于指定的大小,这意味着如果图片大于容器,图片将被缩放到100%
idmean 2014年

@idmean,虽然我同意您的观点,但我认为这不一定是“非常糟糕的答案”,因为在某些情况下,最好先强制awidth然后使图像溢出单元格。或者,也可以根据情况width与结合使用max-width
bassplayer7'1

0

设置宽度:100%确实可以解决该问题,但它又引入了一个问题。在WordPress中,您不想设置宽度:图像的100%。如果图片是中等大小且宽度为300px的图片,该怎么办?我一直在使用类将中等尺寸的宽度设置为50%,但是如果图像较小,该怎么办?然后它将被拉伸。在webkit浏览器中,它的宽度为:auto; 最大宽度:100%;但由于Firefox,Opera和IE忽略了这一点,所以这是一个很大的问题。


0

这已经成为一个非常令人困惑的话题。

表格单元元素中的内联元素都不能使用最大宽度。如果将其显示设置为遮挡,它可以在图像上工作,但是100%是什么?在表格布局中,单元格的内容会推动列宽以尽可能容纳所有内容。因此,在大多数情况下,表格单元格内部的max-width:100%最终是内容的自然宽度。

这就是为什么以像素为单位设置图像的最大宽度属性的原因:

<style>
    div { display: table-cell; padding: 15px; width: 200px; }
    div img { max-width: 200px; display:block;}
</style>

table-layout: fixed如Alex所建议的,如果图像不在表格的第一行中,则可能会起作用,因为第一行的内容决定了列的宽度。


0

对于特定情况,我在网上偶然发现了另一种解决方法:如果您使用display: table;+display: table-cell;模仿响应型网站中的两个(或多个)列布局,请改用此方法:将边栏的宽度设置为350px,网站内容部分的宽度像width: calc(100% - 360px);。那对我来说很成功,而好处是我需要一个固定宽度的侧边栏。我也可以与em一起使用。

当然,这是依赖于js的,但是如今应该已经可以了。




-3

我有同样的问题。我这样做解决了:

经过Opera和Fi测试

.classname {
    max-width: 100%;
    width: 100%;
    display: table-cell !important;}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.