是否有根据特异性对 CSS 选择器文本进行排序的 JS 库
Is there an JS library that orders CSS selector texts according to specificity?
可能的重复项:
根据特异性对一组 CSS 选择器进行排序
我需要一个JS库,它将CSS选择器文本从最具体的选择器文本排序到不太具体的选择器文本,其中根据W3C指定特异性
如果没有任何库,我可以简单地使用 JS 或 jQuery 编写它吗?
CSS 选择器文本可以div#body .text
。
在对您的问题的评论中,josh3736 链接了用于确定特异性的 W3C 规范。 如果你倾向于自己编写这样一个库(我鼓励这样做,如果没有其他原因,只是为了更多地了解它),他们的方法似乎是一个很好的参考。
选择器的特异性计算如下:
- 如果声明来自,则计数 1 是"style"属性而不是带有选择器的规则,否则为 0 (= a)(在 HTML 中,元素的"style"属性的值是样式表规则。这些规则没有选择器,因此 a=1、b=0、c=0 和 d=0。
- 计算选择器中的 ID 属性数 (= b)
- 计算选择器中其他属性和伪类的数量 (= c)
- 计算选择器中元素名称和伪元素的数量 (= d)
特异性仅基于选择器的形式。特别是,形式为"[id=p33]"的选择器被视为属性选择器(a=0、b=0、c=1、d=0),即使 id 属性在源文档的 DTD 中定义为"ID"。
连接四个数字a-b-c-d(在具有大基数的数字系统中)给出了特异性。
我想
我会试一试。 随意使用、修改(或修复)您认为合适的代码。我不能保证这是正确的,但他们在 w3c 规范中给出的示例都产生了相同的结果。
function specificity(selector, isStyleAttribute) {
selector = selector || "";
function numMatches(regex) {
return (selector.match(regex)||[]).length;
}
var numClasses = numMatches(/'.['w-_]+'b/g);
var numIds = numMatches(/#['w-_]+'b/g);
var numNamesInBraces = 0;
var namesInBraces = selector.match(/'[[^']]*'b['w-_]+'b[^']]*']/g) || [];
for (var idx = 0; idx < namesInBraces.length; ++idx) {
numNamesInBraces += (namesInBraces[idx].match(/'b['w-_]+'b/g)||[]).length;
}
var results = [0,0,0,0];
results[0] = isStyleAttribute ? 1 : 0;
results[1] = numIds;
results[2] = numMatches(/'[[^']]+']/g) + numClasses;
results[3] = numMatches(/'b['w-_]+'b/g) - numIds - numClasses - numNamesInBraces;
return results.join(',');
}
如果你想用它对数组进行排序,它可以像这样使用:
selectors.sort(function(a,b) { return specificity(a) > specificity(b); });
相关文章:
- Selectize.js:如何对整数值的选项进行排序
- 当属性不一致时,如何根据属性对JS对象列表进行排序
- 2个backbone.js集合,具有相同的模型,但排序顺序不同
- 在d3.js中对x轴上的日期进行排序
- Sencha Ext JS排序标准以字符串而不是JSON的形式发送
- 使用JS或新查询对列表进行排序
- 如何使d3.js树布局按字母顺序对节点进行排序
- 如何在角度js的自动完成下拉列表中对项目列表(按字母顺序)进行排序
- 酒窝 JS 多个 y 轴 - 更改默认排序
- 按类别排序;元素有多个类别(同位素.js)
- 转到其他 URL 后,如何保持排序的骨干.js集合
- 骨干.js具有多种排序的集合
- 如何在节点中进行 Json 对象排序.js
- 可排序.js不起作用:列表项不可拖动
- 嵌套可排序.js toarray 不起作用
- 按特定字母排序JS字符串数组
- 排序JS数组按日期DD/MM/YY格式
- 在HTML页面中排序js文件的最佳方式
- 长XML - 优化排序(js - google adwords)
- 使用时刻和排序插件在数据表中按日期(dd.mm.YYYY)排序.js