Angular 组件的全局 scss 变量,无需每次都导入它们

Posted

技术标签:

【中文标题】Angular 组件的全局 scss 变量,无需每次都导入它们【英文标题】:Global scss variables for Angular components without importing them everytime 【发布时间】:2019-08-03 12:13:25 【问题描述】:

我已经在 src/styles/settings/_variables.scss 中定义了 SCSS 变量,并且我正在将它们导入到 src/styles.scss,但这些变量仍然不适用于每个组件。

有没有办法创建一个全局文件来保存我其余组件的所有 SCSS 变量?因为在每个组件 .scss 文件中写入 @import 非常令人沮丧,特别是如果我有许多嵌套组件。

我知道,有很多类似的问题,但似乎它们都已经过时并且与 Angular 的最新版本无关。

我使用带有 CLI 的 Angular 7.3。

【问题讨论】:

【参考方案1】:

有什么方法可以使带有 scss 变量的全局文件可用于所有组件?

如果不每次在每个组件中导入全局文件,您希望那些 sass 变量可用,这是不可能的。

它在SASS中的工作方式,如果使用partials来更好地组织代码,您可以应用@import指令进行引用。所以如果shared/_variables.scss中有一些sass变量:

$lightslategray: #778899;
$darkgray: #A9A9A9;

并且这些变量需要在另一个样式表中使用,带有它们的样式表必须先@import-ed到它:

// Shared
@import "shared/variables";

.content 
  background: $lightslategray;

在 Angular 中,它以类似的方式工作(相关引用外部样式表)。因此,如果您需要某些sass variables, mixins or functions 供特定component.scss 使用,则没有其他干净的方法,只能使用@import 指令在component.scss 中引用它们。为了简化任务,您可以创建一个文件 src/_variables.scss 并在 component.scss 中使用类似这样的语法:

@import “~variables.scss”;

【讨论】:

【参考方案2】:

您只需要添加一些配置,因此在声明全局变量的地方,您需要将其包装在:root 中。所以在src/styles/settings/_variables.scss.

:root 

--blue: #00b; // or any global you wish to share with components 

然后,当您在 SCSS 中使用它们时,您将需要像这样访问它们。

.example-class 
  background-color: var(--blue)

补充一点关于cmets,这个方法可以使用mixins@mediakeyframes,并且不仅限于颜色/字体。这是一个例子。

据我了解,您需要一个全局文件 src/assets/style/global,然后将每个 scss 文件导入到您定义它们的位置。

@import 'filename';

如果您不想在组件中使用全局变量,请在全局变量工作时查看。查看ViewEncapsulation,因为这可以用来忽略它们。

【讨论】:

我用的是同样的方法,但你知道如何在 css 中使用定义的变量,比如 box-shadow 吗? 是的,原生 css 变量已经很不错了,但这不仅仅是颜色和字体大小,还有一些 mixins 和函数。 如果您对上述编辑不满意,请尝试删除根目录:。 哇这工作。这在 sass 文档中在哪里?想知道它的含义是什么...... 所以如果我要在我的@mixin 中使用这个变量,它包含在 :root 中的同一个全局 scss 文件中,那将如何工作?这会被所有其他组件识别,就像它识别变量一样?【参考方案3】:

在 Angular 8 中为我工作。

您必须在 _variable.scss 文件中添加:

:root--my-var:#fabada

然后进入你的 angular.json 并将其添加到 "styles":

"input":"yourPath/_variables.scss"

【讨论】:

【参考方案4】:

第一步:进入自定义scss文件(shared/css/_variable.scss)并编写这部分

:root
  --color-text: red;
  --color-btn-success: green;

转到 style.scss(这是主文件)并导入此文件后:

@import './shared/css/Variables';

现在您可以使用此语法在所有组件中使用变量:

.sample
  color : var(--color-text);

【讨论】:

【参考方案5】:

通过两个步骤轻松访问全局文件中的 sass 样式

    将样式文件的文件夹路径添加到angular.json文件中的includePaths数组中。
    在任何组件中按文件名导入样式文件。

angular.json

"architect": 
  "build": 
    ...
    "options": 
      "stylePreprocessorOptions": 
        "includePaths": [
          "src/styles/var" // add path only, do not include file name
        ]
      ,
      "styles": [
        ...
      ]
    
    ...
  

some-component.scss

@import "var";

mat-toolbar 
  height: $toolbar-height;

【讨论】:

以上是关于Angular 组件的全局 scss 变量,无需每次都导入它们的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Angular 组件中访问 SCSS/SASS 变量

Angular 6 库组件和 SCSS

使用 Angular 12 的 Storybook 中不再加载全局 SCSS 样式

全局导入 scss 变量,可用于所有角度组件

什么时候应该在 Angular 中使用 styles.scss,什么时候应该使用组件的 scss

Angular:如何动态更改 scss 变量?