IE8原生不支持:nth-child(),必须用document.documentMode===8检测后启用jQuery加class或:first-child+链式选择器;+法仅适用于固定位置,无法表达3n+1等公式;DOM含非li节点时两者均会错位,清理结构最治本。

IE8 原生不支持 :nth-child(),任何纯 CSS 写法都无效——这不是写法问题,是解析器根本没实现这个特性。
只在 IE8 下启用 jQuery 选择器
不能无条件执行 $('li:nth-child(2n)'),否则现代浏览器会多一次无意义 DOM 遍历。必须先做环境判断:
- 用
document.documentMode === 8比navigator.userAgent更可靠(避免 UA 伪造或 Edge 兼容模式干扰) - 匹配后统一加 class,而不是链式调用
.css()——后者性能差、难维护、无法继承 - 示例:
if (document.documentMode === 8) { $('ul li:nth-child(odd)').addClass('odd'); $('ul li:nth-child(even)').addClass('even'); }再配 CSS:.odd { background: #f0f0f0; }
用 + 链式选择器模拟固定位置
+ 是 IE6+ 全兼容的相邻兄弟选择器,但只能精确匹配“第 N 个”,不能表达“3n+1”这类公式:
-
li:first-child→ 第 1 个(IE8 支持) -
li:first-child + li→ 第 2 个 -
li:first-child + li + li→ 第 3 个 - 注意:
li + li + li会匹配从第 3 个开始的所有li,不是仅第 3 个;必须以:first-child开头才能精确定位 - 结构含非
li节点(如注释、div)时,+链仍按实际 DOM 顺序计数,和:nth-child()行为一致
DOM 结构不干净时 jQuery 也救不了
$('li:nth-child(2)') 在 IE8 下能跑,但它仍遵循原生 :nth-child 的计数逻辑:统计父元素下所有子节点(包括文本、注释、其他标签),不是只看 li。
立即学习“前端免费学习笔记(深入)”;
- 如果
ul里有注释节点或空格文本节点,li:nth-child(2)可能选不到第二个li - 此时 jQuery 无法绕过这个限制,
:nth-of-type()同样不被 IE8 支持,换伪类没用 - 真要动态处理,得改用
$('li').filter(function(i) { return i % 2 === 1; })手动索引——但要注意 jQuery 的i是 0 起始,和 CSS 的 1 起始不同
最易被忽略的是:哪怕用了 jQuery 或 + 选择器,只要 HTML 里混着注释或空白文本节点,定位就可能偏移。清理结构比硬套兼容方案更治本。


















