CSS 选择器——尤其是伪类,尤其是伪:not()
类:nth-*()
家族——不能用作“过滤器”;这里有一点解释,虽然回想起来似乎有点尴尬。这是一个更好的解释。
序列中的简单选择器不会按照它们一一写入的顺序进行处理;相反,它们是元素必须匹配的一组条件才能应用样式,并且元素必须按原样匹配所有这些条件。或者除了将它们称为条件,您还可以将它们称为描述符,但是当涉及到 CSS 选择器时,我会认为“过滤器”是用词不当。
您的选择器意味着:
当且仅当它位于#element
其中并且匹配所有这些条件时,才选择此元素:
- 它是一个
tr
元素
- 它没有类
isotope-hidden
- 它是其父级的第 (2n+1) 个子级
这并不意味着:
- 看看里面的内容
#element
- 选择所有
tr
元素
- 过滤掉这些元素中没有类
isotope-hidden
的元素
- 将样式应用于这些过滤元素中的每 (2n+1) 个子元素
即使您可以在过滤掉样式后“重新绘制”或重新应用样式,它也不会起作用。这是因为无论一个元素是否属于isotope-hidden
类(甚至它是否是一个tr
!),:not(.isotope-hidden)
选择器都不会改变这样一个事实,即一个元素是:nth-child(1)
其父元素在 DOM 中的第一个子元素,一个元素is:nth-child(2)
是其父级在 DOM 中的第二个子级,以此类推。
如果您需要顺序过滤器,您将无法使用纯 CSS 选择器执行此操作;您必须使用专为此目的而设计的jQuery 过滤器方法,将一个类添加到相应的元素中,然后您可以使用它来应用您的样式:
$('#element tr').not('.isotope-hidden').filter(':even');
顺便说一句,这也可以重写为单个 jQuery 选择器,使用它的过滤器选择器:
$('#element tr:not(.isotope-hidden):even');
但是,尽管语法相似,但真正的 CSS 选择器和 jQuery 过滤器之间存在巨大差异,此答案中对此进行了概述。