【问题标题】:Applying nth-child pseudo selector to a specific row class将 nth-child 伪选择器应用于特定的行类
【发布时间】:2012-10-10 09:17:01
【问题描述】:

我有一个问题,我不确定是浏览器问题还是 CSS3 问题。

我有一个使用标准 HTML 表格的数据网格:

<table>
    <thead>
        ...
    </thead>
    <tbody>
        <tr class="found">
            <td>...</td>
            <td>...</td>
            <td>...</td>
        </tr>
        <tr class="found">
            <td>...</td>
            <td>...</td>
            <td>...</td>
        </tr>
        <tr class="found">
            <td>...</td>
            <td>...</td>
            <td>...</td>
        </tr>
    </tbody>
</table>

我有一个搜索 TD 元素内容的 jQuery 函数。如果找到,它会维护找到的类。如果未找到,则删除找到的类并添加未找到的类。当然,not-found 只是设置 display: none

所以搜索功能按我想要的方式工作。班级被适当分配。但是,我使用 CSS 伪选择器将样式应用于交替行。

tr.found:nth-child(even) {
    background: #fff;
}
tr.found:nth-child(odd) {
    background: #000;
}

这在搜索发生之前效果很好。但是,在搜索和应用未找到的类之后,伪选择器似乎只适用于元素而不是元素和类。要么,要么在页面加载期间应用伪选择器并在此时保持静态。

我可以通过我的 jQuery 搜索并重新分配特定的偶数和奇数类,但这会变得混乱。这没什么大不了的,但我的列标题是可排序的,所以我必须在该事件上重新应用类,同时创建一种低效的方法来做我正在做的事情。如果数据样本太大,您可能会看到类的迭代变化,这是我试图避免的。

有什么解决办法吗?

编辑

根据要求,我设置了一个 JSFiddle,以便天才们可以玩弄它:http://jsfiddle.net/bDePR/

搜索总裁或秘书将产生该行为。

【问题讨论】:

  • 一个好问题 - 我可能会建议创建一个 jsFiddle 示例,以便每个人都有一个合理的起点来工作......
  • @KP。 - 我已按要求添加了 JSFiddle。
  • tr.found:nth-child(even) 正在计算每个 tr 元素,而不仅仅是具有“找到”类的 tr 元素,这是你的问题。不过,我想不出一个像样的解决方案..您可以从 DOM 中删除元素并将它们放回原处。这会起作用,但.. 并不理想。唔。好问题。
  • @mdk 是正确的,作为文档 matches an element that has an+b-1 siblings before it in the document tree 中的第 n 个孩子,即使是实际上与 css 选择器不匹配的兄弟姐妹也是如此。跨度>
  • nth-childnth-of-type 仅限于元素,而不是类。所以.found:nth-of-type(odd) 在逻辑上似乎会选择每个奇数的.found,但不会。但是,tr:nth-of-type(odd) 会起作用,因为它是一个元素选择器,而不是类。所以不幸的是,这里不可能使用纯 CSS 选择器方法。就效率而言,如果您的表不是太大并且您的选择器合适,那么更新类不会很快。我个人不会做这个服务器端,所以你不要将你的样式混入你的逻辑——这最终可能会变得混乱。绝对留在客户端。

标签: css css-selectors


【解决方案1】:

这是我能想到的最简单的方法,使用 jQuery :visible 选择器查找所有可见的 tr 元素(在它们被排序之后),然后简单地将 CSS 应用于交替的元素!

// reset the background
$j('tr').css('background', '#ccc');
$j('tr:visible').each(function(i){
    if((i % 2) == 0) {
        // apply background to every other one
        $j(this).css('background', 'yellow');
    }
});

例如http://jsfiddle.net/bDePR/1/

编辑:

@amustill 的做法相同,但更高效/简洁

// reset the background
$j('tr').css('background', '#ccc');
$j('.found').filter(':odd').css({ background: 'yellow' });

【讨论】:

  • 这可能是最有效的解决方案......比替换 DOM 元素要好得多。谢谢!
  • 确实,对于本应如此基本的任务来说,这太过分了。
  • 两件事。首先,:visible 选择器不是必需的,因为所有.found 都是可见的,而且如果没有上下文,它的效率非常低。另外,我认为使用$j('.found').filter(':odd').css({ background: 'yellow'); 设置背景颜色更有效。
  • @amustill 完全同意,很好。你的更简洁。
猜你喜欢
  • 1970-01-01
  • 2013-04-04
  • 2018-07-30
  • 1970-01-01
  • 1970-01-01
  • 2011-03-13
  • 2013-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多