【发布时间】:2019-07-02 21:22:04
【问题描述】:
我正在开发一个需要在运行时进行主题化的项目。所以我创建了一个将 SCSS 变量与 CSS 变量结合起来的主题系统。 这就是它的外观。
:root {
--primary-color: 196;
}
// Primary
$primary-100: hsl(var(--primary-color), 90%, 98%);
$primary-400: hsl(var(--primary-color), 90%, 65%);
$primary-main: hsl(var(--primary-color), 90%, 50%);
$primary-700: hsl(var(--primary-color), 90%, 30%);
$primary-900: hsl(var(--primary-color), 90%, 10%);
虽然这对我的自定义组件非常有效,但我很难让它与 Material design 主题系统一起使用。
我的想法是,我将按照 Angular 材质文档中的说明创建主题,而不是使用静态颜色,而是使用我的 SCSS 变量。这就是我的 theme.scss 文件的样子。
@import '~@angular/material/theming';
@import 'var.scss';
@include mat-core();
$shop-primary: (
50: $primary-100,
100: $primary-100,
200: $primary-200,
300: $primary-300,
400: $primary-400,
// ..... all other colors
contrast: (
50: $black-87-opacity,
100: $black-87-opacity,
200: $black-87-opacity,
// ..... all other colors
)
);
$shop-app-primary: mat-palette($shop-primary);
$shop-app-accent: mat-palette($shop-primary);
$shop-app-warn: mat-palette($shop-primary);
$shop-app-theme: mat-light-theme($shop-app-primary, $shop-app-accent, $shop-app-warn);
@include angular-material-theme($shop-app-theme);
我得到一个错误:
Argument `$color` of `rgba($color, $alpha)` must be a color
可能是因为 Angular Material mixin 需要 color 而不是 hsl() 值。
所以我的问题是如何使用运行时 CSS 变量创建自定义材质主题?
【问题讨论】:
-
我刚刚使用 hsl() scss 函数测试了我的项目,它工作正常。您的 angular.json 中是否有 "stylePreprocessorOptions": { "includePaths": [ "src","src/assets/scss" ] } 属性,以便您的 var.scss 可以在全球范围内获取?
-
您确定您使用的
mat-palette正确吗?我找不到将数组传递给它的示例 -
@Budhead2004 我的 var.scss 包含得非常好。我到处都在使用它。
-
@Budhead2004 您是否将 CSS 变量传递给 hsl 函数?
-
你能告诉我你传递给 hsl() 函数的 $var 的内容吗? @Dirk 他正确使用了 mat-palette 功能,这正是我的自定义主题的设置方式。
标签: css angular sass angular-material