这里整理一些常见的 IE CSS bugs。有错误或补充的地方,欢迎反馈。
下面列表按 IE 版本从高到低排列。没有指明版本号的,表示到目前的 IE 版本都有这种问题。
<th> 不能继承 text-align<img> 在 <a> 内时有边框:focus 与其它选择符组成的复合选择符无效:first-line 规则内 !important 被忽略float:right 时换行position: relative 溢出<li> 不浮动而其子元素浮动,则列表呈阶梯状排列<input> <textarea> margin 双倍<iframe> overflow-y: scroll 时出现与滚动条等宽的空白dashed<img> 等在一起时不能用 line-height 垂直居中font-size)高,即使是空元素IE 下打开 <select> 时,位于其它元素之上的选项 <option>,它的光标被改成下面元素的。
在 CSS 文件中指定自定义光标的路径,相对路径在 IE 下是相对于文档的路径,而不是 CSS 文件的路径。
解决方案:在 CSS 中指定绝对路径。若不方便使用绝对路径,则只能在页面指定。
<th> 不能继承 text-align解决方案:th {text-align: inherit}
<img> 在 <a> 内时有边框解决方案:img {border: none}
我现在用的 IE 版本是 11.0.17,已修复。
解决方案: a:active {background-color: transparent;}:
:focus 与其它选择符组成的复合选择符无效比如 :focus span,在 IE11 的 IE8 模式下有效,在 IE8 下无效。至于 IE6-7 本来就不支持 :focus。
:first-line 规则内 !important 被忽略解决方案: 可考虑用父元素的 padding-bottom
float:right 时换行非浮动元素之后的元素 float:right 时换行。
解决方案:或者使用定位,或者将浮动元素放到前面,演示。
定位元素不指定 z-index 时它的默认值是 auto, 但是 IE6-7 下表现为 z-index: 0, 即产生新的层叠上下文,从而让层叠错误。
解决方案:给相关元素指定 z-index。
注意规划网页上的 z-index,不要使用太大的值。
position: relative 溢出尽管父元素 overflow: auto|scroll|hidden, 子元素 position: relative 时仍然溢出。
解决方案:父元素 position: relative,演示
<li> 不浮动而其子元素浮动,则列表呈阶梯状排列解决方案:
无解决方案,不过一般都是自定义标记。
按钮(input:submit, input:reset, input:button, <button>)随着文字的增多(或者水平 padding 增大)导致按钮两侧的空白越来越大,这实际上不是真实的 padding。
解决方案: 按钮 overflow:visible
另外随着宽度的加大,按钮圆角出现锯齿。
<input> <textarea> margin 双倍当 <input> <textarea> 父元素有 hasLayout 与 margin 时,它们会有双倍 margin。
解决方案,使用负 margin
<iframe> overflow-y: scroll 时出现与滚动条等宽的空白解决方案,只能去掉 overflow-y: scroll
dashed实际上各浏览器 border-style 有些差异。
元素浮动时,水平 margin 双倍,竖直 margin 不会。
修复方案:元素 display: inline
修复方案:
IE6 这种表现类似于其它浏览器的 min-width/height 属性,可以利用这个特点来实现 min-width/height。但是有时会破坏布局,需要用 overflow: hidden 控制。
解决方案比较多。比如:
当绝对定位的包含块的宽高为奇数时,它的 right bottom 会出现 1px 误差。
解决方案,只能让包含块宽高为偶数。
<img> 等在一起时不能用 line-height 垂直居中实现单行垂直居中,常用的办法是让容器 height 与 line-height 相等。但是容器内有 <img> <input> <textarea> <select> <object> 等,这个办法失效。
解决方案,对于 <img> 可以让后面的文本 span {display: inline-block}。
font-size)高,即使是空元素解决方案: 元素 overflow: hidden,演示
在同一个声明块内,同一个属性,无 !important 的值优先于前面有 !important 的值。
比如 .one.two,表示同时有 class 值 one, two 的元素,IE6 只识别最后一个值 two,即相当于 .two。
比如:
#id.class1 {}
#id.class2 {}
#id.class3 {}
只有第一个 #id.class1 有效,后面的忽略。