如何使用angular5和angular材质创建自定义颜色主题

时间:2017-11-26 15:28:32

标签: angular material-design angular-material

我一直在关注如何创建自定义主题的角度/材质文档,跟随其他博客,并检查了各种堆栈溢出类似的问题,但似乎无法使其工作。我有以下styles.css,angular-cli.json,theme.scss和另一个sass文件,其中我的主题颜色来自super-styles.sass。

styles.css的

...
@import 'assets/styles/theme.scss';
...

角cli.json

...
"styles": [
   "styles.css",
    "src/assets/styles/theme.scss"
],
...

theme.scss

@import '~@angular/material/theming';
@import "super-styles";

// Plus imports for other components in your app.

// Include the common styles for Angular Material. We include this here so that you only
// have to load a single css file for Angular Material in your app.
// Be sure that you only ever include this mixin once!
@include mat-core()

// Define the palettes for your theme using the Material Design palettes available in palette.scss
// (imported above). For each palette, you can optionally specify a default, lighter, and darker
// hue.
$candy-app-primary: mat-palette($darkblue, A400);
$candy-app-accent:  mat-palette($orange, A400);

// The warn palette is optional (defaults to red).
$candy-app-warn:    mat-palette($alert);

// Create the theme object (a Sass map containing all of the palettes).
$candy-app-theme: mat-light-theme($candy-app-primary, $candy-app-accent, $candy-app-warn);

// Include theme styles for core and each component used in your app.
// Alternatively, you can import and @include the theme mixins for each component
// that you are using.
@include angular-material-theme($candy-app-theme);

超styles.sass

...
$darkblue: #7faedd
$mediumblue: #85ceef
$lightblue: #c5e8f1
$yellow: #f4ef5f
$alert: #f37652
$orange: #fbb03c
...

根据教程,我觉得这应该可行,但角度没有编译,我收到错误。

  

错误   ./node_modules/css-loader?{"sourceMap":false,"importLoaders":1}!./node_modules/postcss-loader?{"ident" ;: " postcss"} ./ SRC /资产/风格/ theme.scss   模块构建失败:未知单词(23:1)

     

21 | $ candy-app-theme:mat-light-theme($ candy-app-primary,   $ candy-app-accent,$ candy-app-warn); 22 |

     
    

23 | //包括核心的主题样式以及应用中使用的每个组件。          | ^ 24 | //或者,您可以为每个组件导入和@include主题mixins 25 | //你正在使用。

  

有关如何构建自定义主题并在我的角度应用程序中使用它的任何帮助将非常有帮助。谢谢!

3 个答案:

答案 0 :(得分:26)

为了使用Angular - Material的自定义十六进制调色板,您需要为调色板定义不同的阴影和对比色,即使您只需要一种颜色。我建议使用至少3种颜色(浅色,普通,深色),以便使用Material的内置动画完美无瑕:

// below defines your custom color to build a theme palette from
$my-blue: (
  50: #7fdddd,
  100: #7faedd,
  200: #7f7fdd,
  300: #7faedd,
  400: #7faedd,
  500: #7faedd,
  600: #7faedd,
  700: #7faedd,
  800: #7faedd,
  900: #7faedd,
  A100: #7faedd,
  A200: #7faedd,
  A400: #7faedd,
  A700: #7faedd,
  contrast: (
    50: white,
    100: white,
    200: white,
    300: white,
    400: white,
    500: white,
    600: white,
    700: white,
    800: white,
    900: white,
    A100: white,
    A200: white,
    A400: white,
    A700: white,
  )
);
// below creates a primary palette with three shades of blue
$my-primary: mat-palette($my-blue, 100, 50, 200);

答案 1 :(得分:2)

为了将来参考,有一些工具(例如 http://mcg.mbitson.com/#!?mcgpalette0=%233f51b5)可以根据起始颜色为您创建主题。

  • 给它起个名字
  • 选择基色
  • 点击剪贴板图标
  • 选择框架
  • 将粘贴复制到您的 .scss 中
  • 向下传递变量

答案 2 :(得分:0)

正如Z. Bagley建议的那样制作自己的调色板,但我认为您无需将所有这些颜色都制成调色板。例如,这很好用。

$custom-collection: (
    warning :  #FFC116,
    success :  #0a630f,
    danger:    #c00000,
    contrast: (
        warning :  #000000,
        success :  #FFFFFF,
        danger:    #FFFFFF,
    )
);

然后按照建议制作调色板

$my-app-custom: mat-palette($custom-collection, custom);

然后将其合并到主题行之后,像这样

$my-app-theme: mat-light-theme($my-app-primary, $my-app-accent, $my-app-warn);
$my-app-theme: map_merge($my-app-theme, (custom: $my-app-custom));

在此之后,每个颜色都位于一个对象上。

我是否可以建议您为此创建通用的自定义对象

$custom: map-get($my-app-theme, custom);

然后您可以像这样在组件中使用它

background-color: mat-color($custom, validation-invalid);
color: mat-color($custom, validation-invalid-contrast);

还有一个建议。您可以将mat-success添加到全局样式文件中

.mat-success {
  background-color: mat-color($custom, success);
  color: mat-color($custom, success-contrast);
}

现在您可以像使用原色和强调色一样使用颜色属性。

<button mat-flat-button color="success" >Success</button>

之所以可行,是因为color指令将mat-*-class添加到元素中,其中*是color的值。因此color =“ foo”会为相应的元素生成class =“ mat-foo”。