【发布时间】:2012-05-21 14:29:05
【问题描述】:
我想给表格行添加斑马条纹效果。在所有其他浏览器中,它可以使用 CSS nth 子元素来完成。但我也想做IE 8。那么我该怎么做呢?
【问题讨论】:
标签: css internet-explorer-8 compatibility css-selectors ie8-compatibility-mode
我想给表格行添加斑马条纹效果。在所有其他浏览器中,它可以使用 CSS nth 子元素来完成。但我也想做IE 8。那么我该怎么做呢?
【问题讨论】:
标签: css internet-explorer-8 compatibility css-selectors ie8-compatibility-mode
'first-child' 和 '+' 选择器在 IE7 中都可用,并且 '+' 是相加的。
因此可以通过连续添加'+'选择器来模拟'nth-child',所以:
tr:nth-child(4)
变成:
tr:first-child + tr + tr + tr
如果所有同级元素都相同,则“*”通配符就足够了,如下所示:
tr:first-child + * + * + *
如果指定很多行,这将减少 css 文件的大小。
请注意,选择器之间的空格不是必需的,因此可以通过省略它们来进一步减小文件大小,因此选择第 1、第 3 和第 5 行:
tr:first-child,tr:first-child+*+*,tr:first-child+*+*+*+*
当然不会想迎合非常大的桌子!
如果使用 * 作为填充符,请确保 :first-child 元素和最后一个元素具有显式标记名,因为该规则将针对 DOM 中的每个元素进行测试,并明确指定这两个元素强制特定浏览器首先将其规则应用到任何一端都会失败,而不是在必须在每个序列中跨过几个元素以最终使每个元素的规则失败之后失败。不要无缘无故地让你的浏览器工作!
【讨论】:
tr:nth-child(4) 将等同于 *:first-child + * + * + tr。
tr?
* 而不是 tr,以及最终 tr 而不是 *,更好,尤其是当条件是它们都是 trs 时?
tr 即可确保规则适用,因此任何至少包含一个tr 的版本都是等效的。基本上,第一个最好明确指定,因为规则引擎可以有机会在早期拒绝应用于任何特定实例的规则。
作为 Selectivizr 的替代方案,您可以使用一点 jQuery:
$('.your-list li:nth-child(3n+1)').addClass('nth-child-3np1');
然后在你的 CSS 中添加第二个选择器:
:nth-child(3n+1)
{
clear: both;
}
.nth-child-3np1
{
clear: both;
}
【讨论】:
使用 polyfill:Selectivizr 就足够了。
没有 polyfill:由于 IE8 支持第一个孩子,你可以欺骗它来支持 iE8 中的第 n 个孩子,即
/*li:nth-child(2)*/
li:first-child + li {}/*Works for IE8*/
虽然我们无法模拟复杂的选择器,即 IE8 的 nth-child(2n+1) 或 nth-child(odd)。
【讨论】:
您可以使用http://selectivizr.com/ JS,它支持 IE 的 css3 选择器。
【讨论】:
:nth-child() support,但它在实践中不起作用。