我发现了一个非常有用的解释,关于如何将材料主题、配色方案/调色板应用于其他非材料组件这里。
在阅读这篇文章之前,我想到了一些类似的东西,但无法想象如何考虑来自主题化你的角度材料应用程序的建议,如果我不想只有全局主题的话:
您的自定义主题文件不应导入其他SCSS文件。这将复制CSS输出中的样式。如果您想在其他SCSS文件中使用您的主题定义对象(例如,$糖果-应用-主题),那么主题对象的定义应该被分解为它自己的文件,与包含垫芯和角度材质-主题混合元素分开。
我想知道这一建议是否意味着只使用全局样式表/主题?否则,我无法想象如何在不违反上述建议的情况下将scss-主题导入组件的scss-文件中。
我对Sass很陌生,可能在这里漏掉了什么。
发布于 2019-02-05 05:40:17
我遇到了同样的问题,一些讨论可以找到这里,还有一个关于这里问题的有见地的博客。
要点是--正如主题指南正确指出的--您不应该在整个项目中多次导入mixins、@include mat-core()
和@include angular-material-theme($your-theme)
。但是,当您在组件中使用SASS时,您通常希望引用主题变量和垫色调色板。将整个主题导入组件SASS中是很有诱惑力的,不小心重复了材料的混合。
我最终得到的解决方案是主题指南描述的解决方案。
主题对象的定义应该被分解成它自己的文件,与包含垫芯和角度材质主题混音的内容分开。
但由于最初我不清楚如何做到这一点,所以对于那些坚持这样做的人来说,这里是一步一步的:
assets/styles/partials
文件夹我的文件夹看起来如下:
assets/styles/partials/
_palette.scss // custom material palettes
_scaffolding.scss // general mixins
_theme.scss // <-- our theme definition
_variables.scss // global variables like fonts and colors
_theme
部分包含以下内容:
// assets/styles/partials/_theme.scss
@import '~@angular/material/theming';
@import 'variables';
@import 'scaffolding';
@import 'palette';
$my-primary: mat-palette($mat-primary);
$my-accent: mat-palette($mat-accent);
$my-warn: mat-palette($mat-warn);
$my-theme: mat-light-theme($my-primary, $my-accent);
就这样。不要在此文件中包括物料混频器mat-core
和angular-material-theme
。
assets/styles/my-theme.scss
。它只有三行:// assets/styles/my-theme.scss
@import 'partials/theme'; // our actual theme definition
@include mat-core(); // the required mat-core mixin
@include angular-material-theme($my-theme); // the declaration of our custom material theme
通过这样做,我们已经分离了我们的主题部分,包括我们所有的立方体调色板,脚手架和变量,从文件,包括垫核心和我们的定制材料主题。
"styles": [ "src/assets/styles/my-theme.scss" ]
这样,我们的应用程序始终使用我们的自定义材料主题,但是由于主题定义(在theme
部分中)与包含材料混合元素(在my-theme
中)是分开的,所以我们可以安全地将我们的theme
部分包含到任何组件中,而不会重复任何css。
可以选择地,通过将partials路径添加到stylePreprocessorOptions中的Angular.json中,可以简化主题分部的导入:
"build": {
(...)
"options": {
(...)
"stylePreprocessorOptions": {
"includePaths": [
"src/assets/styles/partials"
]
}
}
}
只需在任何组件scss文件中使用@import 'theme'
,我们就可以访问所有变量和材料主题函数,如mat-color :)
发布于 2018-10-26 03:26:43
你现在应该这么做:
@import '~@angular/material/theming';
@include mat-core();
$candy-app-primary: mat-palette($mat-indigo);
$candy-app-accent: mat-palette($mat-pink, A200, A100, A400);
$candy-app-warn: mat-palette($mat-red);
$candy-app-theme: mat-light-theme($candy-app-primary, $candy-app-accent, $candy-app-warn);
@include angular-material-theme($candy-app-theme);
但你应该这样做:
// First file variables.scss
@import '~@angular/material/theming';
@include mat-core();
$candy-app-primary: mat-palette($mat-indigo);
$candy-app-accent: mat-palette($mat-pink, A200, A100, A400);
$candy-app-warn: mat-palette($mat-red);
// Second file
@import 'src/variables';
$candy-app-theme: mat-light-theme($candy-app-primary, $candy-app-accent, $candy-app-warn);
@include angular-material-theme($candy-app-theme);
我就是这么理解的。
https://stackoverflow.com/questions/53007605
复制