更改变量值scss

时间:2018-01-25 14:43:10

标签: angular sass themes

我在scss文件中定义了不同的变量,我在一些scss文件中使用了这些变量。

_variables.scss

$light-theme: rgba(94,161,215,0.3);
$dark-theme: #5EA1D7;
$darker-theme: #57647A;
$very-dark-theme: #455061;

如何定义3组主题?类似的东西:

default-theme {
    $light-theme: rgba(94,161,215,0.3);
    $dark-theme: #5EA1D7;
    $darker-theme: #57647A;
    $very-dark-theme: #455061;
}

dark-theme {
    $light-theme: black;
    $dark-theme: brown;
    $darker-theme: black;
    $very-dark-theme: black;
}

light-theme {
    $light-theme: black;
    $dark-theme: brown;
    $darker-theme: black;
    $very-dark-theme: black;
}

我想根据所选主题更改值。 例如,我有3个按钮,选择它们,将改变变量颜色。

app.component.html

 <button mat-raised-button (click)="onSetTheme('default-theme')">Default</button>
  <button mat-raised-button (click)="onSetTheme('dark-theme')">Dark</button>
  <button mat-raised-button (click)="onSetTheme('light-theme')">Light</button>

app.component.ts

  onSetTheme(theme) {
    //TODO here I want to change the theme
  }

如何更改onSetTheme()函数内的主题。

谢谢!

2 个答案:

答案 0 :(得分:0)

为什么我们不能在浏览器中动态更改sass变量?

Sass是CSS的预处理器,可以让您在开发过程中更轻松地编写样式规则。浏览器不会加载.scss / .sass文件;它将加载CSS - 因此必须将.scss / .sass转换为浏览器的CSS。

您的Sass变量只是Sass文件中的变量。转换为CSS后,变量将替换为编译时表示的值。

.scss正在开发中:

body {
    background: $dark-theme;
}

浏览器加载的编译CSS:

body {
    background: black;
}

您的onSetTheme函数是一个javascript函数,它将在浏览器中运行,无法更改sass变量,因为它们此时不存在。浏览器只加载编译的CSS(它不会加载原始的Sass文件和变量)。

如何在浏览器中动态更改网站主题?

切换CSS类

CSS变量(mdn

答案 1 :(得分:0)

您可以将SASS变量和其他SASS物料以及CSS变量一起使用。

SASS

$body-margin: 0 10px;

:root {
    --bg-color: #000;
    --text-color: #FFF;
}


body {
    background: var(--bg-color);
    color: var(--text-color;
    margin: $margin;
}

JS

onSetTheme(theme) {
    let bgColor, textColor;
    switch(theme) {
      case light:
          bgColor = #FFF;
          textColor = #000;
          break;
      case dark:
          bgColor = #000;
          textColor = #FFF;
          break;
    }
    document.querySelector('body').style.setProperty('--bg-color', bgColor);
    document.querySelector('body').style.setProperty('--text-color', textColor);
}