IE CSS bugs

这里整理一些常见的 IE CSS bugs。有错误或补充的地方,欢迎反馈

下面列表按 IE 版本从高到低排列。没有指明版本号的,表示到目前的 IE 版本都有这种问题。

IE 下拉框选项的光标被改变

IE 下打开 <select> 时,位于其它元素之上的选项 <option>,它的光标被改成下面元素的。

演示

IE 自定义光标相对路径错误

在 CSS 文件中指定自定义光标的路径,相对路径在 IE 下是相对于文档的路径,而不是 CSS 文件的路径。

演示

解决方案:在 CSS 中指定绝对路径。若不方便使用绝对路径,则只能在页面指定。

IE8+ 下 <th> 不能继承 text-align

演示

解决方案:th {text-align: inherit}

IE6-10 下 <img><a> 内时有边框

演示

解决方案:img {border: none}

IE11 输入框不能改变光标

我现在用的 IE 版本是 11.0.17,已修复。

解决方案: a:active {background-color: transparent;}

IE8 下由 :focus 与其它选择符组成的复合选择符无效

比如 :focus span,在 IE11 的 IE8 模式下有效,在 IE8 下无效。至于 IE6-7 本来就不支持 :focus

演示

IE8 下 :first-line 规则内 !important 被忽略

演示

IE7 下浮动元素的 margin-bottom 被忽略

演示

解决方案: 可考虑用父元素的 padding-bottom

IE6-7 下元素 float:right 时换行

非浮动元素之后的元素 float:right 时换行。

演示

解决方案:或者使用定位,或者将浮动元素放到前面,演示

IE6-7 下定位元素层叠错误

定位元素不指定 z-index 时它的默认值是 auto, 但是 IE6-7 下表现为 z-index: 0, 即产生新的层叠上下文,从而让层叠错误。

演示

解决方案:给相关元素指定 z-index。

注意规划网页上的 z-index,不要使用太大的值。

IE6-7 元素 position: relative 溢出

尽管父元素 overflow: auto|scroll|hidden, 子元素 position: relative 时仍然溢出。

演示

解决方案:父元素 position: relative演示

IE6-7 下 <li> 不浮动而其子元素浮动,则列表呈阶梯状排列

演示

解决方案:

IE6-7 下列表(ul, ol)指定宽度后列表项标记消失

演示

无解决方案,不过一般都是自定义标记。

IE6-7 下按钮两侧有莫名空白

按钮(input:submit, input:reset, input:button, <button>)随着文字的增多(或者水平 padding 增大)导致按钮两侧的空白越来越大,这实际上不是真实的 padding。

演示

解决方案: 按钮 overflow:visible

另外随着宽度的加大,按钮圆角出现锯齿。

IE6-7 下 <input> <textarea> margin 双倍

<input> <textarea> 父元素有 hasLayout 与 margin 时,它们会有双倍 margin。

演示

解决方案,使用负 margin

IE6-7 下 <iframe> overflow-y: scroll 时出现与滚动条等宽的空白

演示

解决方案,只能去掉 overflow-y: scroll

IE6-7 下 1px dotted border 表现同 dashed

演示

实际上各浏览器 border-style 有些差异。

IE6 下浮动元素水平 margin 双倍

元素浮动时,水平 margin 双倍,竖直 margin 不会。

演示

修复方案:元素 display: inline

IE6 下非浮动块内的文字与相邻的浮动块之间有 3px 的间隙

演示

修复方案:

IE6 下元素会扩展它的高宽以包含它的内容

IE6 这种表现类似于其它浏览器的 min-width/height 属性,可以利用这个特点来实现 min-width/height。但是有时会破坏布局,需要用 overflow: hidden 控制。

演示

IE6 下列表项包含块级子元素时下方出现空白

演示

解决方案比较多。比如:

IE6 下绝对定位 1px 误差

当绝对定位的包含块的宽高为奇数时,它的 right bottom 会出现 1px 误差。

演示

解决方案,只能让包含块宽高为偶数。

IE6 下 文本与 <img> 等在一起时不能用 line-height 垂直居中

实现单行垂直居中,常用的办法是让容器 height 与 line-height 相等。但是容器内有 <img> <input> <textarea> <select> <object> 等,这个办法失效。

演示

解决方案,对于 <img> 可以让后面的文本 span {display: inline-block}

IE6 认为元素至少一个字符(font-size)高,即使是空元素

演示

解决方案: 元素 overflow: hidden演示

IE6 !important 失效

在同一个声明块内,同一个属性,无 !important 的值优先于前面有 !important 的值。

演示

IE6 multiple class bug

比如 .one.two,表示同时有 class 值 one, two 的元素,IE6 只识别最后一个值 two,即相当于 .two

演示

IE6 id-class bug

比如:

#id.class1 {}
  #id.class2 {}
  #id.class3 {}

只有第一个 #id.class1 有效,后面的忽略。

演示

Fork me on GitHub