【问题标题】:Overwrite Bootstrap 4 Sass variables with CSS variables?用 CSS 变量覆盖 Bootstrap 4 Sass 变量?
【发布时间】:2020-06-14 17:55:18
【问题描述】:

我正在尝试使用 Angular 应用程序中的 CSS 变量将 Bootstrap 4 中的默认 Primary Sass 变量覆盖为自定义颜色,如下所示:

styles.scss

:root {
  --primary: #00695c;
}

$myPrimary: var(--primary);

$primary: $myPrimary; // This does not work

@import '../node_modules/bootstrap/scss/bootstrap';

编译我的应用程序时出现此错误:

Failed to compile.

./src/styles.scss (./node_modules/@angular-devkit/build-angular/src/angular-cli-files/plugins/raw-css-loader.js!./node_modules/postcss-loader/src??embedded!./node_modules/sass-loader/lib/loader.js??ref--15-3!./src/styles.scss)
Module build failed (from ./node_modules/sass-loader/lib/loader.js):

undefined
                                         ^
      $color: var(--primary) is not a color.
    ╷
181 │ $link-hover-color:                        darken($link-color, 15%) !default;
    │                                           ^^^^^^^^^^^^^^^^^^^^^^^^
    ╵
  node_modules\bootstrap\scss\_variables.scss 181:43  @import
  node_modules\bootstrap\scss\bootstrap.scss 9:9      @import
  stdin 19:9                                          root stylesheet
      in C:\Work\node_modules\bootstrap\scss\_variables.scss (line 181, column 43)

有没有办法解决这个问题并使用 css 变量覆盖引导 sass 变量?

还有另一个related question,但我无法解决我的问题。

更新

实际上我已经创建了一个 Angular 组件库供内部使用。我已经使用 CSS 变量在这个库中实现了主题,因此我可以动态更改它们的值并允许用户为应用程序选择主题。

所以在我的库中,我有不同的主题文件,下面是其中之一:

theme.scss

@import './library-styles-to-be-used-in-app.scss';

:root {
  --primary: #00695c;
  --secondary: #f4f5f6;
}

现在,我将这个主题文件导入到我的 Angular 应用 styles.scss 文件中,如下所示:

@import '../dist/library/styles/theme.scss';
@import '../node_modules/bootstrap/scss/bootstrap';

请参阅下面的图像,引导 css 变量已被覆盖,但如果我使用 btn btn-primary 之类的引导类,它仍会显示旧的蓝色。

【问题讨论】:

  • 你不能这样做,因为 css 属性和 sass 变量的工作方式不同。您不能将内置的 sass 函数 darken 与 css 自定义属性一起使用。它需要一个颜色值,并为您提供更深的颜色。 CSS 属性不是这样工作的,它们是动态的并且可以改变。
  • @cloned 有什么替代方案或解决方案吗?我已经在我的应用程序中实现了主题,所以我需要 css 变量。
  • @UsmanAnwar - 我的情况完全相同。你有什么解决办法吗?
  • @Nimmi 不,我必须单独覆盖所有必需的引导类。如果您能找到解决方案,请在此处分享。
  • @UsmanAnwar 感谢您的更新,会尝试,如果我能找到一些东西,那么肯定会在这里更新。

标签: html css angular twitter-bootstrap sass


【解决方案1】:

目前 SCSS 文件中的表达式(公式)不允许使用这种技术。

有一个 github 问题将这些表达式从 SCSS 样式中移出并允许通过单独的变量 https://github.com/twbs/bootstrap/issues/31538 来设置它,例如您可以看到一个 PR,其中显示了 Bootstrap 中需要进行哪些更改以及如何为警报组件启用 CSS 变量模式https://github.com/twbs/bootstrap/pull/31753

【讨论】:

    【解决方案2】:

    这是不可能的,因为 CSS 自定义属性和 SASS 变量是两个独立的东西。

    CSS 自定义属性可以在运行时通过 Javascript 进行更改。
    另一方面,SASS 变量是静态的,它们将被生成,然后是.css-文件中的硬编码值。例如,来自 SASS 的 darken() 功能采用输入字符串(例如十六进制值)并输出此十六进制值的深色版本。

    但是 bootstrap 已经使用了 CSS 自定义属性,所以也许你只是以错误的方式使用它们。也许如果您扩展您想要实现的目标,也许我们可以为您提供更好的帮助。

    目前我们能给你的唯一答案是:这是不可能的。

    【讨论】:

    • 我刚刚更新了我的问题,你可以看看。
    • 你能更新更多吗?在您的屏幕截图中,它显示您的绿色用于变量。这在哪里被覆盖?最终组件中的值如何使用?
    • 是的,即使变量使用了绿色,但如果我使用任何引导组件,相同的默认蓝色将应用于引导组件,从中我可以得出结论,引导不使用 CSS 变量它的风格。该变量被覆盖在 theme.scss 文件中的更新问题中。
    • 这根本不能回答我的问题,如果你不想提供更多信息,我帮不了你。
    猜你喜欢
    • 1970-01-01
    • 2015-09-28
    • 2016-04-18
    • 2013-06-06
    • 2013-12-24
    • 1970-01-01
    • 2018-06-06
    • 2018-01-30
    • 1970-01-01
    相关资源
    最近更新 更多