在用户脚本中使用 'revert' CSS 关键字

Using the 'revert' CSS keyword in user scripts

我试图找出 revert 关键字的工作方式差异,具体取决于它是在用户脚本中使用还是在网站本身中使用。

An article on MDN 描述这种差异如下:

This keyword removes from the cascade all of the styles that have been overridden until the style being rolled back to is reached.

  • If used by a site's own styles (the author origin), revert rolls back the property's cascaded value to the user's custom style, if one exists; otherwise, it rolls the style back to the user agent's default style.
  • If used in a user's custom stylesheet, or if the style was applied by the user (the user origin), revert rolls back the cascaded value to the user agent's default style.

但是,我自己看不出有什么不同。有人可以举个例子吗?

Prereq #1:我们需要了解规范定义的 3 个主要 cascading origins,然后很容易理解该值的作用:

  1. 作者来源 - 这意味着网站、CDN、外部来源,甚至 http://127.0.0.1。就所有意图和目的而言,它是从互联网上提取的网站 CSS 文件。任何网站无处不在的样式表
  2. 用户来源 - 这意味着 C:\Users\yourself\AppData\Local\Google\Chrome\User Data\Default\User StyleSheets\Custom.css - 大多数桌面平台上的浏览器允许您指定默认应用的“用户”样式表。不确定有多少人使用此功能,但它就在那里,可以让你做一些疯狂的事情,比如 font-family: "Comic Sans MS" !important;.
  3. User-agent origin - 浏览器需要提供默认样式,以便文本区域使用 fixed-width 字体,或 <u>text</u>有下划线。以下是默认 UA 样式如何应用于正文并被作者来源样式覆盖的示例:

Prereq #2:我们需要了解此规范是 WD 状态(工作草案)- 这意味着它尚未投放市场供浏览器采用,因此可能还没有制定出微小的细节。如果某件事看起来有点不寻常,那是因为它仍在等待反馈。那边的世界就是这样,完全正常。


现在我们已经正式理解了这些位,让我们看看使用 font-family: revert 时会发生什么。好吧,这取决于它的设置位置:

  • 如果在作者上下文中 -> 将回滚以使用来自用户来源
  • 的值
  • 如果在 User origin -> 将回滚以使用来自 User-agent origin
  • 的值
  • 如果在 User-agent origin -> 将表现得像 font-family: unset。现在,一些 CSS 属性将 inherit 值,而有些则不会。取决于属性。 font-family 在我们的示例中显然继承自 body 和 parents,padding 则没有。 property table 中有完整的列表
    • 如果属性本质上是继承的,revert 值将表现得像 inherit,这意味着它将转到指定的或计算的值级联。
    • 如果属性不继承,它将应用initial value(见同列property table

我将尝试解决其他一些我可以预见的问题:

  1. 你不必在每件事上都加上 !important 来说明某人做了 * { all: revert }
  2. 浏览器在外观上有很大的余地,相当多,这就是为什么我们在过去几十年里一直在做 css resets
  3. 对于面向 public 的网站,不太可能有人需要使用它。
  4. 对于不常见的 Intranet 应用程序之类的东西,假设一家公司想要下拉菜单和其他表单控件来承载公司品牌、颜色、字体等,并且在这样的情况下将它们设置在 OS 级别它们通过浏览器的外观向下渗透的方式 - 即使在这里我们也更有可能使用 initial 而不是通过应用程序的样式表,因为我们希望控件保留在项目的 repo 中。