【问题标题】:Overriding CSS property all: unset覆盖所有 CSS 属性:未设置
【发布时间】:2016-07-29 12:30:00
【问题描述】:

对于我正在开发的 CSS 框架,我使用的是 all: unset,它本身就可以正常工作:

#foo { all: unset; }

但是,在某些情况下,我想“撤消”此规则的效果,如

#foo:hover { all: auto; }

但是,这显然不起作用,因为all 没有auto 的值。相反,我们有值inheritinitial,而不是“取消”all 属性,具有不同的效果:将所有值恢复为其父值或初始值(我假设这意味着系统级默认值)。

为了完成我想要的,我目前正在做的事情

#foo:not(:hover) { all: unset; }

如果我想为多个伪类执行此操作,但它不是太可扩展,我更愿意覆盖all: unset 属性?有什么办法吗?

【问题讨论】:

    标签: css css-cascade


    【解决方案1】:

    你试过了吗

    all: revert
    

    更多信息在这里MDN

    【讨论】:

    • 这会将值恢复为其浏览器默认值,这是 OP 试图避免的事情之一。
    • 是的,我知道,但我不知道他们是如何处理样式的,所以他们可能有允许使用 revert 的起源。
    • 是的,我看到了revert,但除了没有做我想做的事情之外,它几乎不受支持。
    【解决方案2】:

    一旦指定all 属性,似乎就无法撤消它的效果。这可能是因为 all 是一个速记属性(恰好只接受 CSS 范围的关键字作为值)。

    您不能像 css-cascade-4 引​​入 revert 关键字允许您删除作者级别声明一样,从级联中删除速记声明,这是因为速记属性不存在在级联中它自己的实体;相反,它只是表示其所有组件属性。与更传统的速记属性(例如backgroundfont)一样,覆盖已应用的速记声明的唯一方法是重新指定被覆盖的速记的值,无论是通过普通声明还是通过另一个速记声明。但是你不能用 all 属性来做后者,因为它只接受 CSS 范围的关键字。

    由于前者显然不适用于 all 简写,因为您无法预测从一开始会覆盖哪些作者级别的声明,因此您唯一的其他选择是通过选择器限制它,从而防止它从一开始就在特定情况下申请。希望我们能在不久的将来看到更多级别 4 :not() 的实现,这将使编写选择器更容易一些。

    【讨论】:

      【解决方案3】:

      除了 BoltClock 解释的内容之外,即使对于非速记属性,您现在也无法实现您想要的。

      * { color: red; }
      #foo { color: unset; }
      #foo:hover { color: /* How to revert to red? */ }
      

      一旦你添加了一个赢得级联的值,就没有办法告诉级联“返回”并获得前一个获胜者。您必须明确设置它,但只有在您知道它的情况下才有可能。

      最接近的是revert keyword,由 CSS Cascade 4 引入,它将级联回滚到之前的原始级别。但目前不可能将级联回滚到同源级别的上一个获胜者。

      然后,解决方案是限制您的选择器仅在您需要它们时应用。这样就不需要撤消了。

      【讨论】:

      • "但是目前不可能将级联回滚到同源级别的上一个获胜者。"而这样做的原因是因为级联首先无法分辨出“先前的赢家”是什么。如果它只是假设声明的顺序,尽管有特殊性,那将非常容易出错。
      猜你喜欢
      • 2020-07-17
      • 1970-01-01
      • 2019-07-28
      • 1970-01-01
      • 2015-02-03
      • 2013-12-16
      • 1970-01-01
      • 1970-01-01
      • 2017-08-29
      相关资源
      最近更新 更多