我正在考虑制作一个计算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
- 是吗?
答案 0 :(得分:1)
选择器的特异性实际上并不是一个数字。你无法将不同类型的特异性相互比较,就好像它们是整数一样。
在您的示例中,您将10分配给一个类,将1分配给一个标记名称,这意味着如果一个选择器包含10个以上的标记名称,那么它的特异性将大于仅具有类的标记名称。但这不是它的工作原理。
你可以做的,如果你绝对坚持要返回一个值,就会使用非常大的差异,例如,2 12 用于一个类,2 24 用于ID。然后算法只会在标签名称超过4096的选择器上失败。
然而,正确的方法不是尝试计算单个值,而是创建一个比较两个选择器的函数。如果一个选择器包含的ID多于另一个,则其特异性最高;返回“一”。如果ID的数量相同,则比较类的数量。等等,直到找到差异,否则你会回到“平等”。