IE 6 在刚发布时实际上拥有任何浏览器中最好的 CSS 支持……七年前。其 CSS 支持中的小错误至今仍困扰着我们。我仍然收到一些人的评论,他们 完全拒绝任何 不在 IE 6 中起作用的技术。虽然我通常拒绝迎合 IE 6 的局限性,但我仍然认为在可能的情况下让内容在 IE 6 中看起来正确很重要。以下是一些 IE 中的常见错误,它们会让你时常遇到麻烦
盒模型
这可能是 IE 6 及以下版本中最常见和最令人沮丧的错误。假设你声明了一个这样的盒子
div#box {
width: 100px;
border: 2px solid black;
padding: 10px;
}
IE 6 将计算盒子的宽度为 100px。
现代浏览器将计算盒子的宽度为 124px。
这种差异会导致巨大的布局问题。我甚至认为 IE 版本在逻辑上更有意义,但这并非规范的编写方式。如果处于标准兼容模式,IE 6 实际上可以正确处理它,但在今天这很少见,因为仅仅使用 HTML 4.0 过渡性文档类型就会触发怪异模式和盒模型问题。
我通常通过不使用用于布局的盒子的填充来解决此问题。如果该盒子在 <p> 元素中包含一些文本,我将直接将所需的填充应用于该 p 元素。这只是规避了问题,但它有效。
双边距错误
使用我们上面提到的盒子示例,假设我们需要将其浮动到右侧
div#box {
float: right;
margin-right: 20px;
}
IE 6 将 将 20px 变成 40px。同样,这可能导致巨大的布局错误。对此的常用“修复”方法是向 div 添加“display: inline;”。我不确定这个“修复”方法是如何获得如此广泛的关注的,但它有点不切实际。我们不能对内联元素设置静态宽度,对吧?
我也喜欢在可能的情况下规避此错误。如果你真的需要将该盒子从其父元素的右侧推开,你可以通过向父元素添加填充来实现,这更有可能保持网格的一致性。此外,不要忘记填充。此错误不影响填充,因此你通常可以通过向所需一侧添加填充来获得相同的结果。
不支持最小宽度/最小高度
在元素上设置最小宽度和最小高度是一件如此自然和合乎逻辑的事情,以至于有时想到我不能依赖它们时,我会感到难过。IE 6 并非只是处理错误,而是完全忽略了它们。最小高度对于页脚等非常有用。假设你的页脚需要至少 100px 高,因为你在那里使用背景图片,但你不想设置静态高度,因为你希望它在文本大小显著增加时能够很好地增长。最小高度非常适合这种情况,但单独使用它将导致 IE 6 完全没有高度。令人惊讶的是,IE 6 将常规高度属性视为现代浏览器处理最小高度的方式,因此你可以使用“技巧”来修复它。我称之为“技巧”,因为我不认为它是一种技巧,因为它验证良好。
阶梯下降
通常,在浮动对象时,你可以依靠它们垂直对齐,直到它们断开。也就是说,如果你没有使用 IE 6,你可以这样做。IE 6 在每个浮动块元素后附加换行效果,这将导致“阶梯下降”。这里的解决方法是确保父元素中的行高设置为零 (0),或者被浮动的元素是内联元素。更多关于 此处防止阶梯下降。
不支持悬停状态
大多数现代浏览器支持几乎所有元素的悬停状态,但 IE 6 除外。IE 6 仅支持锚 (<a>) 元素的悬停伪类,即使那样,如果你的锚没有 href 属性,你也不会获得它们。这里的解决方案是使用 专有修复,或者只是处理无法在所有你想要的地方拥有悬停状态。
不支持 Alpha 透明 PNG
有趣的是,微软自己开发了 PNG 格式,但他们自己的浏览器(直到 IE 7)并不原生支持它。我有一个关于 各种修复方法的总结。请记住,普通的非 Alpha 透明 PNG 文件在 IE 6 中无需任何修复即可正常工作,并且通常比它们的 GIF 姐妹更好。
*更新:我对微软的事情完全错了,不知道是怎么想到的。Tom Boutell 实际上开发了 PNG 格式。感谢大家!
所以……
所有这些错误都可以修复或规避,但如果你不进行测试,它们会让你遇到麻烦。我的总体理念是:使用尽可能现代的技术进行设计,然后确保它在旧版本中没有损坏。
优秀的分析,Chris。
感谢你告诉我关于阶梯下降问题,我自己也遇到过这个问题,并且不知道行高修复方法。
谢谢
谢谢,Chris。我读过关于 IE 错误的文章(喜欢标题,哈哈),并且第一次读到一篇以简单的方式处理这些讨厌错误的很好的总结。 :)
标题真是太逗了 :)
好文章,处理这些错误的方法很好。
好的列表,Chris……IE6 编码起来真是太麻烦了!
不过我有一个小修正……内联修复效果非常好。实际上,如果你查看 CSS 规范(它们是令人兴奋的翻页书),它们会说如果一个元素是浮动的,那么它应该被视为块元素,并且除了“none”之外的所有显示值都应该被忽略。所有主要浏览器似乎都忽略了它,但显然它触发了 IE6 需要修复双边距问题的任何巫术魔法。
微软与 PHP 的开发无关。它主要是 Thomas Boutell(libGD 的作者)的工作。
哎呀。打错了。PNG 不是 PHP
我认为 Tom Boutell 开发了 png 格式 http://www.libpng.org/pub/png/pnghist.html
我个人不喜欢 IE,因为我自己是 Firefox 用户,但我仍然很喜欢这篇文章!……以及“IE 错误”的图片,哈哈
我没想到微软开发了PNG格式。什么资料给了你这些信息?
“符合标准的模式……现在很少见了”——如果你没有使用严格的DOCTYPE,那么你将面临很多麻烦。除非你正在维护一个无法重写代码的旧网站,否则真的没有必要再使用过渡模式了。
IE7也没有修复alpha透明度——它不再使用愚蠢的“粉色”背景了,但它只支持图像中的1位alpha,而不是8位真alpha。在我看来,它仍然是损坏的。
float:left; display:inline; 使元素显示为块级,HTML规范定义了浮动元素始终设置为块级。
一个关于IE特定问题的优质资源是Position is Everything
http://positioniseverything.net/ie-primer.html
有史以来最好的帖子!
IE盒子模型“bug”只在IE 6及以上版本的怪异模式下发生。维基百科有一个很好的解释。
简而言之:使用正确的文档类型声明。
我们公司在一次漫长的会议(5分钟:-))后,决定不再支持这个过时的浏览器技术。我们决定,如果客户坚持要求我们使他的网站在IE6上运行,他将需要为此付费。
我们网页设计师必须推动人们停止使用这个糟糕的浏览器,并推动人们更新。我的建议:IE6网页设计师国际抵制(这将是一个很好的网站创意,不是吗?)
不错的帖子,但看在上帝的份上,学习“its”和“it’s”的区别。你每次都用错了。
感谢错误信息。
我希望每个人都迁移到IE7,并一劳永逸地摆脱IE6。然后我只需要担心一个IE浏览器的错误:p
精彩的总结,伙计。为了解决通常的问题:“我希望人们能够升级他们的浏览器”……我认为认为大多数用户了解下载和安装……更不用说其他浏览器存在了,是一种非常傲慢的态度。
我建议尝试在你的网站上教育用户为什么IE7/FF是一个好的替代方案。此外,我认为真正能够淘汰IE6的是操作系统。
所以在未来5年内,我们将只使用IE7……然后10年后将是IE8。如果我们幸运的话,苹果将在OSX及其机器方面取得更大的成功……Safari将真正看到光明。
此页面右侧的投票结果缺少1%。
而且并非每个人都可以随意升级。最近,在我们公司,我们全公司都被降级到IE6了。真是不可思议。但是,当那些认为我们“太无知”而无法升级的网站出现时,我们就无能为力了。
CSS太难了……这要归咎于IE6(和IE7……)
“仅仅使用HTML 4.0过渡DOCTYPE就会触发怪异模式和盒子模型问题。”
根据PPK[1]——“请注意,你的页面不必根据所选DOCTYPE进行验证,DOCTYPE标签的单纯存在就足以触发严格模式。”
请注意,在DOCTYPE之前放置*任何内容*都会在IE 6中触发怪异模式。也许这就是你遇到的情况?
@hiro protagonist:“IE7也没有修复alpha透明度。”——你遇到了什么问题?我经常使用带有透明度的32位PNG,到目前为止,一切正常。仅供参考,如果我想在IE 5/6中使用透明度,我会使用PNG-8。PNG-8在IE 5/6中提供二进制透明度,在其他地方提供alpha透明度。
[1] http://www.quirksmode.org/css/quirksmode.html
说得很好!!上述原因清楚地告诉我们,我们应该转向更大更好的事物,比如火狐。IE 6和php肯定彼此不友好。关于表格,还有其他一些故障。Abhishek http://www.dibugs.com
啊,我非常同意——一篇好的、有见地的文章,谈论的不仅仅是“哇,IE很糟糕”。 :)
很好的总结。我一直都在寻找这种帖子,因为我除了IE之外的所有浏览器都写过代码。这让我抓狂。
解决宽度/边距问题的另一个解决方案是使用IE特定的样式表并更改宽度(例如,在该示例中从100px更改为120px)。
我不是高级设计师(还没有),但我无法理解为什么在这篇文章中忽略了IE特定的hack(使用选择器、html>和*)和IE样式表。
是因为这篇文章都是关于不使用hack来编写IE代码的吗?哦,等等,那么PNG hack一开始就不会出现在这里了。
所以,我仍然不确定为什么不使用上述方法。
偶然发现!
我讨厌IE,浪费更多时间想办法并添加修复程序。
在以下地址为本文投票
http://www.newsdots.com/tutorials/ie-css-bugs-thatrsquoll-get-you-every-time-css-tricks/
在min-height“hack”中使用批准的CSS非常棒。与其依赖JavaScript或IE专用的
expression
属性进行计算,不如直接说“不,IE6/5.5用户,我不会因为你们的旧浏览器而让我的工作变得比现在更难。”。哦,存档/站点地图页面(/archives/)怎么了?看起来标题正在破坏行并强制广告栏位于下方。
你的盒子模型反了
———————————————————-
div#box {
width: 100px;
border: 2px solid black;
padding: 10px;
}
IE 6将计算盒子的宽度为100px。
现代浏览器将计算盒子的宽度为124px。
———————————————————-
IE 6(在怪异模式下)将padding和border包含在宽度中(124px)。
现代浏览器将计算盒子的宽度仅为内容宽度(100px)
@Magenta Placenta:这不太对。IE 6在怪异模式下确实将padding和border包含在宽度中,但它会将该padding应用在盒子内部,并且总宽度将为100px——比现代浏览器更窄。我知道维基百科页面上的图片在这一点上具有误导性。
div#box {
width: 100px;
border: 2px solid black;
padding: 10px;
}
我有时会这样做
div#box {
width: 124px;
border: 2px solid black;
padding: 10px;
max-width:100px;
}
它确实很有帮助:) IE以良好的方式呈现它:)如果它有效——那就没问题:)
并且[IF IE]注释也很重要:)
不错的文章
出于好奇,我想知道在未来我们应该预期多久才能为像这样的IE6怪异行为编写代码。例如,我认识的大多数设计师现在都忽略了Netscape 4.0的错误,但直到大约2005年左右,设计师们都预期需要修改他们的网站以在N4.0中工作。
“请记住,常规的非alpha透明PNG文件在IE 6中可以正常工作,无需任何修复,并且通常比它们的GIF同类更好。”
我同意句子的后半部分,但不同意前半部分:常规的非alpha透明PNG文件也不会被IE6正确显示。它会使它们显示得更暗。我说的不是0.00001%的值,而是你用眼睛和普通显示器可以清楚看到的。如果JPEG图像位于PNG图像旁边,它可能会破坏你的布局。
TweakPNG在这里有所帮助;)
非常有信息量的帖子,谢谢。JanB关于恼人PNG的观点也值得牢记。混合使用jpg、gif和png可能会出现问题。迫不及待地想和IE6说再见了。
试试http://browsershots.org/
当我设计网站时,我总是尝试在Linux、Mac OS和Windows上查看它,这节省了很多时间。我更喜欢Firefox而不是IE,我的网站在IE8中看起来很糟糕,不知道为什么……
你觉得browsershots.org怎么样?它准确吗?
display:inline 仅导致IE6不会使边距加倍,元素仍然呈现为块级元素 - 这是修复错误的错误。
我更喜欢Firefox而不是IE,因为Firefox总是向我展示更好的设计,并且支持png透明背景图片。
你好!!
这绝对非常有用,我非常喜欢它。
谢谢。
jitendra
很棒的文章。没有什么比设计完美且感觉很棒,然后在IE6中检查它,却发现它看起来很糟糕更糟糕的了。
我发现很多时候,我希望浏览器像IE一样渲染div,也就是说,使填充和边距等额外内容内嵌在div中,而边距是外边距。这样,作为设计师,我可以声明宽度和高度的像素尺寸,设置一个不错的填充以内嵌内容,然后我不必坐在那里手动计算div最终渲染的大小,就像1932年一样。我怎样才能让非IE浏览器做到这一点?
@seth:我实际上同意这确实感觉更正确,但这违背了现有的长期标准。它只需要稍微调整一下思维方式,真正的盒子模型也同样易于使用。
如果您决定使用损坏的IE 6模型,Firefox实际上有一个专有CSS属性可以让它以这种方式运行。Opera或Safari没有,所以我并不建议将其用于除测试之外的任何其他用途。
很棒的文章,这些IE错误有时会让我们束手无策。PNG支持是一个有趣的话题,我想深入了解一下。尝试在IE6中使用一个8位PNG,与FF2中的相同PNG放在一起。我喜欢伽马差异……可以通过删除PNG中的块来修复它(我使用TweakPNG)。不过大多数人甚至都没有注意到……
一篇优秀的文章,我已经多次用到了!很高兴将所有这些错误都列在一个地方。但是,我迫不及待地想要能够完全放弃IE6。查看http://www.atomised.coop/blog以了解我对这件事的看法。
并且,如果可以,请加入DeathMarch!
很棒的文章。我已经与IE6和双边距搏斗了2天。终于解决了我的问题。谢谢!
不错的列表,但你忘记了臭名昭著的“若隐若现”错误。
http://www.positioniseverything.net/explorer/peekaboo.html
我个人不喜欢IE,因为我使用的是firefox。
你好,
我是CSS方面的新手。我需要仅在以下语句中为IE6实现margin属性。
在上面的语句中,margin-left:-17px 用于IE,-moz-margin-start:8px 用于Mozilla.. 我想从样式中删除Mozilla属性。并且margin-left属性应该只对IE6起作用。
请帮助我。
提前感谢……
display:inline 仅导致IE6不会使边距加倍,元素仍然呈现为块级元素 - 这是修复错误的错误。
简短信息
使用 * html {} /* 适用于ie6 */
使用 *+html {} /* 适用于ie7 */
好的,它快速且简陋,但它通过了验证..最好为不同的浏览器添加不同的样式表。
问候
artd
我发现修复双边距错误和各种其他宽度/显示相关错误的简单方法是使用
display: inline-block;
我不确定这是如何工作的,但它基本上结合了内联和块级显示,这意味着元素仍然是内联的,同时允许填充、固定宽度等块级样式。
这绝对非常有用,我非常喜欢它。
谢谢。:D 伟大的工作
很棒的文章,谢谢。
我浪费了太多时间在为不同浏览器调整CSS上。他们什么时候才能同意以相同的方式显示所有内容。我更喜欢表格,因为至少我知道我的布局在每个浏览器中看起来都是一样的!
刚刚发现这篇文章。
“display: inline;” 可以消除双边距错误,因为浮动元素本质上是块级元素。“display: inline”是否应用于该元素并不重要。现代浏览器只是忽略这种无意义的操作,但IE 6可以理解它。
此外,所有浮动元素都应该声明宽度。
很棒的网站,有很多有用的提示。
嗯…我尝试过在不同的样式表中修复这里的每个问题,但我的网站的主列仍然会位于侧边栏下方,但在Firefox中可以正常工作。你知道可能发生了什么吗?
据我所知,IE 6已经死了很久了……
Alpha Centauri