css - 如何使使用另一个变量定义的 CSS 变量反射(reflect)对依赖项的更改?

标签 css css-variables

<分区>

我想使用 CSS 变量来定义一些复合属性。在这个例子中,我定义了一个 --border-width变量以及 --border使用 --border-width 的变量多变的。然后我覆盖某些元素的边框宽度值:

:root {
  --border-width: 1px;
  --border: var(--border-width) solid #000;
}

.demo {
  border: var(--border);
  margin: 1em;
}

.demo.active {
  --border-width: 10px; 
}
<div class="demo">
  Should have thin border
</div>

<div class="demo active">
  Should have thick border
</div>

我知道新变量正在应用于元素;我可以在检查器中看到它,如果我添加一个明确的 border-width: var(--border-width)属性(property).demo , 它应用预期的宽度值。然而,似乎 --border尚未重新计算以反射(reflect)对 --border-width 的更改.

我不希望我的每个元素在每次使用速记时都必须指定所有速记属性,但似乎我遗漏了一些关于 CSS 变量的基本知识。

例如,我宁愿不必这样做:

:root {
  --border-width: 1px;
  --border-style: solid;
  --border-color: #000;
}

.demo {
  border: var(--border-width) var(--border-style) var(--border-color);
  
  /*
  Or this
  
  border-width: var(--border-width);
  border-style: var(--border-style);
  border-color: var(--border-color);
  */
  
  margin: 1em;
}

.demo.active {
  --border-width: 10px; 
}
<div class="demo">
  Should have thin border
</div>

<div class="demo active">
  Should have thick border
</div>

最佳答案

您是正确的,因为您的 .demo 元素应用了您在 :root 中设置的 border。但是,在您的 .demo.active 中,您只是重新定义 CSS 变量 --border-width(而不是利用现有的).您需要明确使用属性 border-width

为了在 .demo.active 中重用 --border-width 变量,您需要再次使用 var() border-width: var(--border-width):

:root {
  --border-width: 1px;
  --border: var(--border-width) solid #000;
}

.demo {
  border: var(--border);
  margin: 1em;
}

.demo.active {
  border-width: var(--border-width);
}
<div class="demo">
  Should have thin border
</div>

<div class="demo active">
  Should have thick border
</div>

请注意,这将复制在 :root --border-width 中设置的内容。 但是,鉴于您还提到您希望有一个更厚的边框,我怀疑您实际上可能正在寻找的是覆盖此设置(使用 border-width: 10px), 或扩展它以包含一个附加项,使用
border-width: var(--border-width) + 10px:

:root {
  --border-width: 1px;
  --border: var(--border-width) solid #000;
}

.demo {
  border: var(--border);
  margin: 1em;
}

.demo.active {
  border-width: var(--border-width) + 10px;
}
<div class="demo">
  Should have thin border
</div>

<div class="demo active">
  Should have thick border
</div>

关于css - 如何使使用另一个变量定义的 CSS 变量反射(reflect)对依赖项的更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57666786/

相关文章:

html - CSS 变量 : input:focus doesn't set variable

css网格计算变量的分数

html - 如何垂直居中 Bootstrap 类按钮?

javascript - Bootstrap 中是否有类似于弹出窗口的内容,即使弹出窗口被阻止,它仍会播放?

jQuery .append() 仅在第一个元素上

html - CSS从图像条中提取图像

javascript - Vue JS : How can I access and change Css root variables from vue component to toggle CSS Variables Site Theming?

html - CSS div 元素容器参数未相应显示

css - 为什么我的 CSS 变量添加注释标记?