我正在考虑制作一个计算CSS特异性的函数,这是一个相当简单的计算。基本上,#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比另一个多,则其特异性最高;return"一"。如果ID的数量相同,则比较类的数量。依此类推,直到找到差异,否则返回"相等"。