【发布时间】:2015-09-28 12:26:51
【问题描述】:
编辑:此问题被标记为与this one 重复,但请参阅此答案末尾附近的附录,以了解该问题没有问什么,以及答案没有'不回答。
我正在开发一个使用 Bootstrap 3 的网络应用程序。我有一个基本的 3 层覆盖架构,其中 1) Bootstrap 的 _variables.scss 包含核心变量,2) _app-variables.scss 包含基本应用程序变量覆盖 Bootstrap 的 _variables.scss,以及 3) _client-variables.scss 包含覆盖 _app-variables.scss 的特定于客户端的自定义。 #2 或 #3(或两者)都可以是空白文件。所以这是覆盖顺序:
_variables.scss // Bootstrap's core
_app-variables.scss // App base
_client-variables.scss // Client-specific
理论上很简单,但是由于我称之为“变量依赖项”的问题出现了——其中变量被定义为其他变量。例如:
$brand: blue;
$text: $brand;
现在,假设上述变量在_variables.scss 中定义。然后假设在 _app-variables.scss 中,我仅覆盖 $brand 变量以使其变为红色:$brand: red。由于 SASS 是按顺序逐行解释代码的,它首先将 $brand 设置为蓝色,然后将 $text 设置为蓝色(因为此时 $brand 为蓝色),最后将 $brand 设置为红色。所以最终结果是之后更改 $brand 不会影响任何基于 $brand 旧值的变量:
_variables.scss
---------------------
$brand: blue;
$text: $brand; // $text = blue
.
.
.
_app-variables.scss
---------------------
$brand: red; // this does not affect $text, b/c $text was already set to blue above.
但显然这不是我想要的——我希望我对 $brand 的更改能够影响依赖它的一切。为了正确覆盖变量,我目前只是将 _variables.scss 的完整副本复制到 _app-variables.scss 中,然后从那时起在 _app-variables 中进行修改。同样,我将 _app-variables.scss 的完整副本复制到 _client-variables.scss 中,然后在 _client-variables.scss 中进行修改。显然,从维护的角度来看,这不太理想(轻描淡写) - 每次我对 _variables.scss(在 Bootstrap 升级的情况下)或 _app-variables.scss 进行修改时,我都必须手动将更改向下传递文件覆盖堆栈。而且我不得不重新声明大量我什至可能不会覆盖的变量。
我发现 LESS 有他们所谓的“延迟加载”(http://lesscss.org/features/#variables-feature-lazy-loading),其中变量的最后一个定义在任何地方都使用,甚至在最后一个定义之前。我相信这会解决我的问题。但是有谁知道使用 SASS 的合适的变量覆盖解决方案吗?
附录:
这是我已经考虑过的一种技术:以相反的顺序包含文件,对所有变量使用!default(this question 的答案中也建议使用此技术)。所以这就是结果:
_app-variables.scss
---------------------
$brand: red !default; // $brand is set to red here, overriding _variables.scss's blue.
.
.
.
_variables.scss
---------------------
$brand: blue !default; // brand already set in _app-variables.scss, so not overridden here.
$text: $brand !default; // $text = red (desired behavior)
所以这个解决方案几乎是完美的。 然而,现在在我的覆盖文件中,我无法访问在 Bootstrap 的 _variables.scss 中定义的变量,如果我想定义我的变量覆盖(或我自己的其他自定义变量)使用其他引导变量。例如,我可能想做:$custom-var: $grid-gutter-width / 2;
【问题讨论】:
-
我不知道你现在希望得到什么样的答案,因为这是“不是重复的”。如果不使用多个包含,您的要求是不可能的。
-
多重包含(导入)到底是什么意思?在我的附录中描述的方法中,我使用了多个导入:
@import "_variables";(Boostrap's),然后是@import "_app-variables.scss",然后是@import "_client-variables"。提前致谢。 -
我认为我不需要把它拼出来。如果你想引用一个变量,它必须首先存在(这就是你得到的“未定义变量”错误的意思)。如果要覆盖默认变量并将其传播到所有其他默认变量,则必须提前声明。
-
我知道,我明白这一点。您说“如果不使用多个包含,您所要求的是不可能的”,这意味着可以使用多个包含 - 我要问的是如何使用多个包含?或者不是吗?这可能只是 SASS 的“限制”; LESS 允许的东西。
-
我遇到了您在附录中概述的确切问题,即无法访问我的覆盖中的默认变量。你找到解决办法了吗?
标签: css variables twitter-bootstrap-3 sass overriding