【问题标题】:When using CSS Variables (CSS Custom Properties) why is the setting syntax and the getting syntax different?使用 CSS 变量(CSS 自定义属性)时,为什么设置语法和获取语法不同?
【发布时间】:2020-06-01 11:41:25
【问题描述】:

使用 CSS 变量(CSS 自定义属性)时,为什么 设置语法获取语法 不同?

如果我想为--my-custom-width 设置一个值,我将使用:

:root {
  --my-custom-width: 120px;
}

如果我希望获得--my-custom-width 的值,我将使用var() 函数来检索相同的值:

.my-div {
  width: var(--my-custom-width);
}

为什么我们不简单地写:

.my-div {
  width: --my-custom-width;
}

【问题讨论】:

  • 简单的答案:它是这样定义的。你不能给出一个合乎逻辑的理由来说明为什么它不能相反,因为它可能是这样的。
  • 我同意 Temani;答案似乎很简单,“因为规范是这样说的”。
  • @Rounin 直接等于 12px。自定义属性有一个值,--my-width 的值是 12px,就像 width 的值是 12px。来自规范:自定义属性是普通属性,因此它们可以在任何元素上声明,通过普通继承和级联规则解析 ..注意普通。跨度>
  • 您的问题只是关于围绕与含义无关的语法做出的决定。您问为什么使用语法 A 而不是语法 B,这是基于意见和工作组做出的简单决定。就像你在问为什么我们应该在每个 CSS 声明结束时使用 ; 或者为什么我们在编写媒体查询时需要 @
  • 我了解您认为这是语法问题。我在下面的回答中建议 var() 更好地理解为在真实主题上执行真实任务的真实函数。

标签: css css-variables


【解决方案1】:

自 2017 年底以来一直在使用 CSS 自定义属性,我终于正确理解了它们的真正含义以及为什么需要 var() 函数...

它们不是(因为它们经常看起来是)旨在直接表示 CSS 值的变量。

CSS 自定义属性 正是他们所说的 - 它们是新的 CSS 属性,尚未(尚未)被赋值。


在 CSS 中,一个真正近似表示的变量的例子是currentColor

我们在这里看到currentColor 代表一个值:

.my-div {
  border: 1px dashed currentColor;
}

CSS 自定义属性 不是 CSS 变量,它们代表 ,例如 currentColor, .

相反,CSS 自定义属性 是新发明的,被命名为 null-value-properties...

... 以及那些新发明的、命名的、空值属性是完全可重用的。就像widthheightcolor 等一样,它们可能在不同的上下文中设置和重置值。

例如

/* My custom property is --my-custom-width but I want this
   property to hold different values in different contexts */

.left-two-thirds-of-page {
  --my-custom-width: 120px;
}

.right-third-of-page {
  --my-custom-width: 60px;
}

.my-div {
  width: var(--my-custom-width);
}

这就是为什么var() 函数是必要的——它不是交付“自定义属性”——它是提取自定义属性当前持有的,然后交付它价值。


进一步的想法:

事后看来,我想知道如果 CSS 自定义属性 被调用,整个 名称-值关系 是否会更加清晰:

CSS Custom Property Names

并且相应的函数已被调用:

value()

所以语法会被写和读出为:

value(--my-custom-property-name)

通过扩展,我们不仅可以在自定义属性上使用value() 函数(或var() 函数),还可以在任何属性上使用。

例如:

width: value(height);

【讨论】:

  • 自定义属性是整个规范;变量只是该规范中的一个选项。也就是说,这个答案的前几行似乎试图澄清没有的混乱。此外,currentColor 不是 CSS 变量,它是 reserved keyword from the CSS Colors spec
  • 我完全不同意这一点。 var() 不需要像您解释的那样 extract 值。 var() 是必要的,因为我们有后备功能,允许我们在未定义自定义属性的情况下使用默认值。这是考虑 var() 的正当理由。如果没有这个,工作组可以简单地考虑使用带有名称的自定义属性,因为语法不应该有歧义,因为没有其他任何东西以 -- 开头。
  • 这里有完整的细节:w3.org/TR/css-variables-1/#using-variables 你会清楚地看到 var() 比你想象的要复杂。
  • @Rounin 你是说 CSS 自定义属性根本就不是 CSS 属性,它们真的应该被称为 CSS 自定义值,因为它们代表的是值而不是属性? -->我从没有说过。它们是属性。我只是评论你对var() 的描述,它的目的比你描述的更复杂,你不能证明首先使用width: --my-custom-width 是不合逻辑的。本来可能是这样,但工作组只是决定了其他事情。就这样。你试图为一个简单的决定给出一个合乎逻辑的理由
  • 然而,var() 函数从属性中提取值它被称为替换而不是提取,它是这样定义的(查看我在顶部共享的链接)并且写width: --my-custom-width 可能很有意义,因为width: --my-custom-widthwidth: var(--my-custom-width) 和可能width: (--my-custom-width) 或者width: @--my-custom-width 之间的唯一区别是语法问题。任何人都可以被使用并做出选择。正如我所说,var 具有后备功能
猜你喜欢
  • 2021-03-02
  • 2019-07-02
  • 2018-05-29
  • 1970-01-01
  • 2015-01-30
  • 2018-08-26
  • 2011-08-23
相关资源
最近更新 更多