css 变量 - var 的默认值未被传递

css variable - default value on var not getting passed

下面的代码得到了 2 个不同的输出。它应该给出相同的输出,因为 css 变量应采用默认值。下面是我评论传递 span 一个值的代码,因为它在 var 声明中有一个默认值。取消注释赋值行会给出不同的输出。寻找正在发生的事情的解释。

这里是带注释代码的码笔- https://codepen.io/skandasoft/pen/MWjoMZe

这里是未注释的 - https://codepen.io/skandasoft/pen/VwKWJqd

带有 CSS 个变量的引导网格!
<body>
    <div class="grid">
        <div class="item">1</div>
        <div class="item" style="--span: 7">
            <div class="grid" style="--cols: 2">
                <div class="item">1</div>
                <div class="item">2</div>
            </div>
        </div>
        <div class="item">3</div>
        <div class="item">4</div>
    </div>

    <style>
        .grid {
            display: grid;
            gap: 10px;
            grid-template-columns: repeat(var(--cols, 10), minmax(0, 1fr));
        }
        .item {
            /* --span: 1; */
            grid-column: span var(--span, 1); /**-span has a default value of 1 **/
            background-color: yellow;
            padding:10px;
        }
    </style>
</body>

发生这种情况是因为 .item class 比提供的继承 --span: 7 具有更高的特异性。请参阅下面它被覆盖的屏幕截图。因此,如果您在这 2 个子元素(1 和 2)上设置 --span: 7,您将不再看到打开和关闭 --span: 1 值的差异。

据我所知,默认值设置正确。

自定义属性继承。

来自spec

Custom properties are ordinary properties, so they can be declared on any element, are resolved with the normal inheritance and cascade rules, ...

这意味着如果没有为给定元素的自定义设置 属性 值,则使用其父元素的值。

在本例中,父元素定义了自定义 属性: --span:

<div class="item" style="--span: 7">

因此 --span 属性 的值在所有子项上都是 7 - 除非在子项上明确定义了不同的值。

现在两个版本的代码区别就很清楚了。

在注释版本中,.item class 中的 var(--span, 1) 由于继承

的计算结果为 7

由于网格中只有 2 列,因此每个项目都占据整个网格宽度

在未注释的版本中(使用 --span: 1;在 .item class 中定义),.item class 中的 var(--span, 1) 计算为 1 - 因为它是在子项上明确定义。

注意

当给定的自定义 属性 无效/未定义时,后备值仅用作替换值

在这种情况下,外部网格中的第二项定义了值为 7 的 --span 自定义 属性,它可用于其所有子元素。

正如@Danield 所解释的,问题是继承,您可以通过使用 initial 来避免它,如下所示:

.grid {
  display: grid;
  gap: 10px;
  grid-template-columns: repeat(var(--cols, 10), minmax(0, 1fr));
  --span:initial; /* this will stop the propagation of the variable */
}

.item {
  grid-column: span var(--span, 1); /**-span has a default value of 1 **/
  background-color: yellow;
  padding: 10px;
}
<div class="grid">
  <div class="item">1</div>
  <div class="item" style="--span: 7">
    <div class="grid" style="--cols: 2">
      <div class="item">1</div>
      <div class="item">2</div>
    </div>
  </div>
  <div class="item">3</div>
  <div class="item">4</div>
</div>

相关问题: