2

我有一个项目,它被拆分为父应用程序,以及几个可重用的子组件在单独的存储库中。我想在这些子组件中定义默认的 CSS 变量,它可以被父应用程序覆盖,但是我找不到正确的语法。这是我尝试过的:

/* parent */
:root {
  --color: blue;
}

/* child */
:root {
  --color: var(--color, green);
}

.test {
  width: 200px;
  height: 200px;
  background: var(--color, red);
}

https://codepen.io/daviestar/pen/brModx

颜色应该是蓝色的,但是当:root定义孩子时,颜色实际上是红色的,至少在 Chrome 中是这样。

对此有正确的方法吗?在 SASS 中,您可以!default为子变量添加一个标志,这基本上意味着“声明它是否尚未声明”。

4

3 回答 3

2

CSS 代表cascading style sheets,所以你不能覆盖任何父母...

唯一的办法就是创造更强的规则

.c1.p1

.parent {
  --background: red;
}

.child {
  --size: 30px;
  --background: green; /* this wins */

  background-color: var(--background);
  width: var(--size);
  height: var(--size);
}

.p1 .c1 {
  --background: red; /* this wins */
}

.c1 {
  --size: 30px;
  --background: green;

  background-color: var(--background);
  width: var(--size);
  height: var(--size);
}
<div class="parent">
  <div class="child"></div>  
</div>

<hr />

<div class="p1">
  <div class="c1"></div>  
</div>  

于 2017-08-22T08:50:47.210 回答
1

我会建议一种方法,通过给组件中的变量起别名并使用“父”或根变量作为主值,而本地值是 by !default

.parent {
  --background: red;
}

.child {
  --child_size: var(--size, 30px); /* !default with alias */
  --child_background: var(--background, green); /* !default with alias */

  background-color: var(--child_background);
  width: var(--child_size);
  height: var(--child_size);
}
<div class="parent">
  <div class="child"></div>  
</div>
<hr>
<div class="child"></div>  

于 2022-02-08T10:55:40.363 回答
1

感谢@Hitmands的提示,我有一个巧妙的解决方案:

/* parent */
html:root { /* <--- be more specific than :root in your parent app */
  --color: blue;
}

/* child */
:root {
  --color: green;
}

.test {
  width: 200px;
  height: 200px;
  background: var(--color);
}
于 2017-08-22T08:56:03.453 回答