我正在考虑制作一个函数CSS specificity,这是一个相当简单的计算。基本上,每个#somestring实例都值得100,每个.somestring:somestring实例都值得10,每个somestring实例都值得1

示例:
"#mydiv p" ---> 101"ul>li>a" ---> 3"div.pull-right img"-> 12"body#homepage #home-side-box div.row.pull-left[name="thisrow"]:after"-> 232
所以功能会像

unsigned long specificity ( const std::string & slctr )
{
    // ....
}

现在,我不希望这是一个简单的实现,因为我意识到会有很多细微差别,但是我想知道是否有人可以给我一些有关我应该使用的算法和工具的提示。使东西高效清洁。例如,我假设我应该使用std::regex_iterator-是吗?

最佳答案

选择器的特异性并不是一个数字。您无法将不同类型的特异性相互比较,就好像它们是整数一样。

在您的示例中,将10分配给一个类,将1分配给一个标记名,这意味着如果一个选择器包含10个以上的标记名,则它的特异性要比仅一个类的选择器强。但这不是它的工作方式。

如果您绝对坚持要返回单个值,那么您可以做的是使用很大的差异,例如,一个类为212,一个ID为224。然后,该算法将仅在具有超过4096个标签名称的选择器上失败。

但是,正确的方法不是尝试计算单个值,而是创建一个比较两个选择器的函数。如果一个选择器包含的ID超过另一个,则其特异性最高。返回“一个”。如果ID的数量相同,则比较类的数量。依此类推,直到找到差异,否则返回“等于”。

09-16 06:12