IE7中的盒子大小支持

low*_*llk 47 css css3 internet-explorer-7

我刚刚发现了box-sizing: border-boxCSS属性,它为我解决了一堆跨浏览器布局问题.

我现在唯一的问题是IE7似乎不支持它.有没有让IE7支持它的黑客攻击?

sup*_*ary 103

有几种方法可以做到这一点,没有一个是完美的.

正如你指出的那样:

  • Firefox/Opera/Safari/Chrome/IE8 +将识别盒子大小属性,允许您使用边框.
  • IE6默认使用旧学校(正确的?)边框模型.
  • 但是IE7在标准模式下使用W3C填充框模型,并且无法识别CSS box-sizing属性,因此无法恢复到边框模型.如果你需要支持IE7(你可能仍然这样做),你会遇到以下四种选择之一:

1.条件评论:

<!--[if IE 7]>
  Special instructions for IE 7 here
<![endif]-->
Run Code Online (Sandbox Code Playgroud)

使用IE8和9的box-sizing,然后为IE7进行特定的覆盖.这个选项会很痛苦.

2. Schepp Box Sizing Polyfill:

https://github.com/Schepp/box-sizing-polyfill

这个优秀的Polyfill是一个HTC文件,它修改了IE6和7中的默认浏览器行为,因此他们使用W3C盒子模型.它适用于轻度使用,但如果广泛使用,可能会导致问题.谨慎使用和测试.

3.旧式嵌套Div:

旧式嵌套div方法仍然是一个很好的方法:

<div style="width:100px; border:1px solid black">
  <div style="margin:10px">
    Content
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

非语义嵌套div间接提供填充,缺点是标记变得不整齐.显然不要使用内联样式,我在这里使用它们是为了说明.

旧格言永远不要在固定宽度元素上使用填充仍然是正确的.

4.我的首选解决方案 - 直接子选择器:

另一种方法是使用直接子选择器.假设你有一个包含一些内容的固定宽度div:

<div class="content">
  <h1>Hi</h1>
  <p>hello <em>there</em></p>
</div>
Run Code Online (Sandbox Code Playgroud)

然后,您可以编写规则,将左右边距添加到div的所有直接子节点:

.content {
  width:500px;
  padding:20px 0;
}
.content > * {
  margin:0 20px;
}
Run Code Online (Sandbox Code Playgroud)

这将为h1和p增加一点余量,但不会给嵌套的em增加一点余地,在内容div上给出20px填充的外观,但不会触发盒子模型错误.

5.考虑删除IE7支持

IE7是最后一个不识别box-sizing属性的浏览器.如果您从IE7获得的流量很少,您可能会考虑放弃支持.你的CSS会更好.

截至2013年底,这是我的首选.


2017编辑:现在可能已经很久没有放弃对IE7的支持了,只是使用了border-box.

  • 再一次,IE6支持W3C盒子模型,而不是像`border-box`那样! (5认同)
  • IE6支持边框模型,但不支持W3C盒模型.IE7支持W3C盒型号,但不支持边框盒型号.IE8 +支持两者,您可以在它们之间进行选择.要支持IE7,请使用上述解决方案之一.如果您乐意放弃IE7,请使用box-sizing:border-box. (3认同)
  • +1这确实是支持ie6/7/8和世界其他地方的最佳方式.每个人都可以获得与您无需担心的利润相同的利润.如果你必须支持ie6/7/8(并且还有很多),那么最好习惯于永远不要添加填充和嵌套你的div.在一个完美的世界中,我们可以论证语义,但在一个完美的世界中,每个浏览器都会白板化它们将要支持的内容以及它们不支持的内容.但他们没有.他们不在乎. (2认同)

neo*_*ojp 17

您可以使用polyfill使其适用于某些项目,但它不适用于我的输入字段.

https://github.com/Schepp/box-sizing-polyfill

box-sizing: border-box;
*behavior: url(/css/boxsizing.htc);
Run Code Online (Sandbox Code Playgroud)

请注意,行为url是相对于页面而不是css文件.使用站点根目录的相对路径(使用斜杠启动URL,然后从那里开始).

  • 我会说URL相对于站点根目录,绝对URL可能看起来像这样http://mydomain.com/css/micss.css (2认同)

wsa*_*lle -7

我假设您正在使用它来绕过 IE6 盒子模型。不幸的是,确实没有通用的方法可以欺骗早期版本的 IE 支持任意 CSS 属性。

我建议不要使用该box-sizing属性,因为除 IE6 之外的每个浏览器都会正确实现盒模型。维基百科文章很好地解释了 IE6 的不同之处。

为了解决这个问题,我建议为 IE6 使用单独的样式表,并使用IE 条件注释将其包含在内。在 IE6 样式表中,您可以指定不同的宽度/高度/填充/边距,以使布局看起来一致。您只能包含 IE6 的样式表,如下所示:

<!--[if IE 6]>
  <link href="ie6sucks.css" rel="stylesheet" type="text/css" />
<![endif]-->
Run Code Online (Sandbox Code Playgroud)

  • 但如果您使用“box-sizing: border-box”,则除 IE7 外,所有浏览器的行为都类似于 IE6。坦率地说,当您进行 CSS 布局时,w3c 盒子模型是一场噩梦,因为您无法在不破坏整个布局的情况下向区域添加填充/边框。有点糟糕。 (7认同)
  • 谢谢(你的)信息。不幸的是,一旦 ie7 转向以标准方式做事,就无法恢复旧的行为。我想我更喜欢 ie6 盒子模型而不是 w3c 模型,但我想我们现在只能使用 w3c 模型了。 (5认同)
  • 各位,你们对 IE6 的看法都错了。IE6 实现了标准的 W3C 框模型,IE5/5.5 是具有类似“边框框”行为的最后一个版本... (5认同)
  • 我同意,w3c 盒子模型是一场噩梦,盒子大小是一个非常受欢迎的属性。当一个元素与其他浏览器显示不同的大小时,我对 ie7 所做的就是使用 ie7 only css hack *width: 200px; 这允许我为 ie7 设置一组不同的参数 (3认同)