这里整理一些常见的 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 有效,后面的忽略。