@bramus/specificity

中文文档
2.4.3发布于 2026/10/06MITTypeScriptESM + CJS近 30 天下载 1.9亿

CSS 选择器的计算特性

中文使用文档
文档目录10 节
  1. 安装
  2. 用法/ 实例
  3. 返回格式
  4. 功用函数(稳态方法)
  5. 工具函数( 单独)
  6. 类型定义
  7. 二进制/CLI
  8. 基准
  9. 许可证
  10. 鸣谢

Calculate CSS Specificity

具体性

@bramus/specificity 是计算 CSS 选择器特性的软件包。 它还包括一些方便功能来比较,排序和过滤一系列特异性值.

支助 选择器等级 4,包括那些特殊情况 :is(), (中文(简体) ), :where(), (中文(简体) ), :not()等 (中文(简体) ).

发音: https://codepen.io/bramus/pen/WNXyoym 互联网档案馆的存檔,存档日期2013-12-02

安装

npm i @bramus/specificity

用法/ 实例

在其核心, @bramus/specificity 暴露一个 Specificity 课。 它的静态 calculate 用于计算给定 CSS 的特异性的方法 选择列表 绳子.

import Specificity from '@bramus/specificity';

const specificities = Specificity.calculate('header:where(#top) nav li:nth-child(2n), #doormat');

因为 calculate 接受一个 选择列表 ——可包含1个以上 选择器 它总是返回一个阵列,每个条目都是一个 Specificity 实例——每个找到的选择器一个.

const specificities = Specificity.calculate('header:where(#top) nav li:nth-child(2n), #doormat');
specificities.map((s) => s.toString()); // ~> ["(0,1,3)","(1,0,0)"]

如果您知道您只经过一个选择器 calculate(),您可以使用 JavaScript 的内置解结构来保持您变量名称的清洁 .

const [s] = Specificity.calculate('header:where(#top) nav li:nth-child(2n)');
s.toString(); // ~> "(0,1,3)"

在引擎盖下, @bramus/specificity 用途 CSSTree (英语) 来解析选择者的字符串。 因此 calculate 方法也接受一个 CSSTree AST (英语) 类型 Selector 财务报告和审定财务报表 SelectorList。 。 。 .

如果您拥有该类型预分的 CSSTree AST Selector 可以传入 Specificity.calculateForAST()。 表现稍好 比起来 Specificity.calculate() 因为它需要检查更少的东西。 这和 Specificity.calculate() 它不返回一系列 Specificity 实例,但只有一个值.

返回格式

计算出的特异性作为实例说明 Specificity 课。 这个 Specificity 类包括以某种格式获得特异性值的方法,以及一些将特异性值与其他实例进行比较的方便方法.

// 🚀 Thunderbirds are go!
import Specificity from '@bramus/specificity';

// ✨ Calculate specificity for each Selector in the given Selector List
const specificities = Specificity.calculate('header:where(#top) nav li:nth-child(2n), #doormat');

// 🚚 The values in the array are instances of the Specificity class
const s = specificities[0]; // Instance of Specificity

// 👀 Read the specificity value using one of its accessors
s.value; // { a: 0, b: 1, c: 3 }
s.a; // 0
s.b; // 1
s.c; // 3

// 🛠 Convert the calculated value to various formats using one of the toXXX() instance methods
s.toString(); // "(0,1,3)"
s.toArray(); // [0, 1, 3]
s.toObject(); // { a: 0, b: 1, c: 3 }

// 💡 Extract the matched selector string
s.selectorString(); // "header:where(#top) nav li:nth-child(2n)"

// 🔀 Use one of its instance comparison methods to compare it to another Specificity instance
s.isEqualTo(specificities[1]); // false
s.isGreaterThan(specificities[1]); // false
s.isLessThan(specificities[1]); // true

// 💻 Don’t worry about JSON.stringify()
JSON.stringify(s);
// {
//    "selector": 'header:where(#top) nav li:nth-child(2n)',
//    "asObject": { "a": 0, "b": 1, "c": 3 },
//    "asArray": [0, 1, 3],
//    "asString": "(0,1,3)",
// }

功用函数(稳态方法)

这个软件包还暴露出一些根据具体情况开展工作的实用功能. 这些公用功能都作为静态方法在 Specificity 课.

  • 比较:

    • Specificity.compare(s1, s2): 将 s1 与 s2. 返回一个值,可以是:
      • > 0 = 在 s1 之前排序 s2 (即s1比s2更具体)
      • 0 = 保持S1和S2的原始顺序 (即s1和s2同样具体)
      • < 0 = 在 s2 之前排序 s1 (即 s1 不如 s2 )
    • Specificity.equals(s1, s2): 回归 true 如果S1和S2具有相同的特性。 如果没有, false 已返回.
    • Specificity.greaterThan(s1, s2): 回归 true 如果 s1 的特异性高于 s2 。 如果没有, false 已返回.
    • Specificity.lessThan(s1, s2): 回归 true 如果 s1 的特异性低于 s2. 如果没有, false 已返回.
  • 排序 :

    • Specificity.sortAsc(s1, s2, …, sN): 按升序排序给定的特性 (低特异性到高特异性)
    • Specificity.sortDesc(s1, s2, …, sN): 将给定的特性按下行顺序排序 (高度特异性与低特异性)
  • 过滤 :

    • Specificity.min(s1, s2, …, sN): 筛选出特性最低的值
    • Specificity.max(s1, s2, …, sN): 以最特殊性过滤出值

在其中任何一种公用事业职能中,可以采用以下任何一种特性:

  • 包括的事例 Specificity 类
  • 简单对象, 如 {'a': 1, 'b': 0, 'c': 2}

工具函数( 单独)

所有静态方法 Specificity 类曝光也被导出为独立函数 子路径导出。 。 。 .

如果你只有兴趣将这些功能纳入您的项目, 你可以从他们的子路径导入它们。 因此,你的捆绑尺寸会大大缩小 (不包括单独的 calculate,当它返回一系列 Specificity 依赖整个批量的示例)

import { calculate, calculateForAST } from '@bramus/specificity/core';
import { compare, equals, greaterThan, lessThan } from '@bramus/specificity/compare';
import { min, max } from '@bramus/specificity/filter';
import { sortAsc, sortDesc } from '@bramus/specificity/sort';

类型定义

虽然 @bramus/specificity 以 Vanilla JavaScript 写成,它确实包括 类型定义 暴露于其 package.json。 。 。 .

二进制/CLI

@bramus/specificity 曝光二进制名称 specificity 用于计算CLI中特定选择器列表的特异性。 对于每一个它找到的选取者,它将打印出计算出来的特异性,作为新行上的字符串.

$ specificity "header:where(#top) nav li:nth-child(2n), #doormat"
(0,1,3)
(1,0,0)

基准

包含一个基准,您可以引用 npm run benchmark。 。 。 .

样本结果(在MacBook Air M3上测试):

Specificity.calculate(string) x 420,682 ops/sec ±0.34% (98 runs sampled)
Specificity.calculate(ast) - using SelectorList x 8,994,080 ops/sec ±0.25% (98 runs sampled)
Specificity.calculate(ast) - using Selector x 11,054,856 ops/sec ±0.39% (91 runs sampled)
Specificity.calculateForAST(ast) x 12,652,322 ops/sec ±0.35% (96 runs sampled)

许可证

@bramus/specificity 以麻省理工学院公共许可证发放。 见附件 LICENSE 详细情况.

鸣谢

创建此软件包的想法是由 由 Kilian Valkhof / Polypane 创建的美妙特性计算器,一个高度教育性的工具,它不仅计算特异性,还解释了哪些部分对此负责.

对选择者进行实际分析的举重方式是: CSSTree (英语)。 。 。 .

版本与发布记录

@bramus/specificity 共发布 26 个版本,首次发布于 2022/02/23;过去 12 个月发布了 1 个版本。

版本发布日期距今
2.4.3latest2026/10/061 个月前
2.4.22025/06/031.4 年前
2.4.12025/02/191.7 年前
2.4.02025/02/191.7 年前
2.3.02023/04/083 年前
2.2.02022/12/153 年前

其他发布通道:next → 2.0.0-beta.11。

关于 @bramus/specificity 的常见问题

@bramus/specificity 是什么?

CSS 选择器的计算特性

如何安装 @bramus/specificity?

在项目目录运行 npm install @bramus/specificity,或使用 pnpm add / yarn add / bun add。它还提供命令行工具 specificity,可以用 npx specificity 直接运行。

@bramus/specificity 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@bramus/specificity 支持 ESM 还是 CommonJS?

同时提供 ES Module 与 CommonJS 入口,import 和 require() 都可以使用,打包工具会自动选择合适的版本。

@bramus/specificity 可以商用吗?

@bramus/specificity 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@bramus/specificity 的下载量有多少?

根据 npm 官方下载统计,@bramus/specificity 在 2026/10/09 – 2026/11/07 这 30 天内被下载 191,698,498 次,日均约 6,389,950 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@bramus/specificity 还在维护吗?

最新版本 2.4.3 发布于 2026/10/06(1 个月前);至今共发布 26 个版本,其中过去 12 个月发布了 1 个;首次发布于 2022/02/23。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。