需求:

  1 不使用materil依赖内建的主题,使用自己创建的主题

  2 利用自己创建的主题实现白天模式和黑夜模式

1 自定义主题

  1.1 创建自定义主题文件 them.scss

    

  1. // 引入material自定义主题支持
  2. @import '~@angular/material/theming';
  3. // 引入material公用的主题风格
  4. @include mat-core();
  5.  
  6. // 自定义颜色
  7. $my-app-primary: mat-palette($mat-blue);
  8. $my-app-accent: mat-palette($mat-teal, A200, A100, A400);
  9. $my-app-warn: mat-palette($mat-red);
  10.  
  11. // 利用自定义颜色组装自定义主题
  12. $my-app-theme: mat-light-theme($my-app-primary, $my-app-accent, $my-app-warn);
  13.  
  14. // 设置自定义主题,使其生效
  15. @include angular-material-theme($my-app-theme);

    1.1.1 引入material主题支持和material公用的主题风格

  1. // 引入material自定义主题支持
  2. @import '~@angular/material/theming';
  3. // 引入material公用的主题风格
  4. @include mat-core();

    1.1.2 根据material公用的主题风格设定自己的主题颜色

  1. // 自定义颜色
  2. $my-app-primary: mat-palette($mat-blue); // 主色
  3. $my-app-accent: mat-palette($mat-teal, A200, A100, A400); // 副色
  4. $my-app-warn: mat-palette($mat-red); // 警告色

    代码解释01: $my-app-primary就是一个自定义的变量

    代码解释02: $mat-blue表示使用material主题风格中的blue这种颜色

    代码解释03: $my-app-primary: mat-palette($mat-blue); 表示通过material主题风格的函数将material主题风格中的blue颜色赋值给$my-app-primary变量

    技巧01:如何查看material的主题风格中提供了哪些颜色 -> 点击前往

    1.1.3 利用自己的主题颜色组成自定义主题

  1. // 利用自定义颜色组装自定义主题
  2. $my-app-theme: mat-light-theme($my-app-primary, $my-app-accent, $my-app-warn);

    1.1.4 设置主题颜色使其生效

  1. // 设置自定义主题,使其生效
  2. @include angular-material-theme($my-app-theme);

  1.2 在全局样式文件中引入自定义的主题文件them.scss

    技巧01:需要将默认引入的materi内建主题注释掉

    

  1. /* You can add global styles to this file, and also import other style files */
  2.  
  3. // @import '~@angular/material/prebuilt-themes/deeppurple-amber.css'; // 导入material的内建主体
  4. @import 'theme.scss';
  5.  
  6. html, body, app-root, md-sidenav-container, .site {
  7. width: 100%;
  8. height: 100%;
  9. margin: 0;
  10. }
  11.  
  12. .site {
  13. display: flex;
  14. flex-direction: column;
  15. }
  16. header {
  17. // background-color: skyblue;
  18. }
  19. main {
  20. flex: 1;
  21. }
  22. footer {
  23. // background-color: skyblue;
  24. }
  25.  
  26. .fill-remaining-space { // flex项目自动填充多余空间
  27. flex: 1 1 auto;
  28. }
  29.  
  30. .full-width {
  31. width: 100%;
  32. }

  1.3 效果如下

    

2 利用多主题实现多模式

  2.1 添加黑夜主题

    

  1. // 引入material自定义主题支持
  2. @import '~@angular/material/theming';
  3. // 引入material公用的主题风格
  4. @include mat-core();
  5.  
  6. // 自定义颜色
  7. $my-app-primary: mat-palette($mat-green);
  8. $my-app-accent: mat-palette($mat-amber, A200, A100, A400);
  9. $my-app-warn: mat-palette($mat-red);
  10.  
  11. // 利用自定义颜色组装自定义主题
  12. $my-app-theme: mat-light-theme($my-app-primary, $my-app-accent, $my-app-warn);
  13.  
  14. // 设置自定义主题,使其生效
  15. @include angular-material-theme($my-app-theme);
  16.  
  17. // 自定义颜色
  18. $my-dark-primary: mat-palette($mat-blue-grey); // 主色
  19. $my-dark-accent: mat-palette($mat-amber, A200, A100, A400); // 副色
  20. $my-dark-warn: mat-palette($mat-deep-orange); // 警告色
  21.  
  22. // 利用自定义颜色组装自定义主题
  23. $my-dark-theme: mat-dark-theme($my-dark-primary, $my-dark-accent, $my-dark-warn);
  24.  
  25. // 设置自定义主题,使其生效
  26. .myapp-dark-theme {
  27. @include angular-material-theme($my-dark-theme);
  28. }

    技巧01:将黑夜主题放在一个class类中进行引入,当这个类被激活时就表示开启黑夜模式

    技巧02:主题只能对material相关的组件生效,其余的组件不会生效;我们可以将最外层组件生效myapp-dark-theme样式时添加最外层组件的背景颜色

      

  1. <md-sidenav-container [class.myapp-dark-theme]="darkTheme">
  2. <md-sidenav #sidebar>
  3. <app-sidebar></app-sidebar>
  4. </md-sidenav>
  5.  
  6. <div class="site">
  7. <header>
  8. <app-header (toggle)="sidebar.toggle()" (taggleDarkTheme)="switchTheme($event)"></app-header>
  9. </header>
  10. <main>
  11. <router-outlet></router-outlet>
  12. </main>
  13. <footer>
  14. <app-footer></app-footer>
  15. </footer>
  16. </div>
  17. </md-sidenav-container>

      

  1. md-sidenav-container.myapp-dark-theme {
  2. background-color: black;
  3. }
  4.  
  5. md-sidenav {
  6. width: 200px;
  7. }

  2.2 在页眉组件添加一个按钮用于开启或者关闭黑夜模式

    2.2.1 在共享模块中引入MdSlideToggleModule

      

  1. import { NgModule } from '@angular/core';
  2. import { CommonModule } from '@angular/common';
  3. import {
  4. MdSidenavModule,
  5. MdToolbarModule,
  6. MdIconModule,
  7. MdButtonModule,
  8. MdIconRegistry,
  9. MdCardModule,
  10. MdInputModule,
  11. MdListModule,
  12. MdSlideToggleModule
  13. } from '@angular/material';
  14. import { HttpModule } from '@angular/http';
  15.  
  16. @NgModule({
  17. imports: [
  18. CommonModule,
  19. HttpModule,
  20. MdSidenavModule,
  21. MdToolbarModule,
  22. MdIconModule,
  23. MdButtonModule,
  24. MdCardModule,
  25. MdInputModule,
  26. MdListModule,
  27. MdSlideToggleModule
  28. ],
  29. declarations: [],
  30. exports: [
  31. CommonModule,
  32. MdSidenavModule,
  33. MdToolbarModule,
  34. MdIconModule,
  35. MdButtonModule,
  36. HttpModule,
  37. MdCardModule,
  38. MdInputModule,
  39. MdListModule,
  40. MdSlideToggleModule
  41. ]
  42. })
  43. export class SharedModule { }

    2.2.2 在组件中使用MdSlideToggleModule提供的md-slide-toggle组件

      

  1. <md-toolbar color="primary">
  2. <button md-icon-button (click)="openSidebar()">
  3. <md-icon>menu</md-icon>
  4. </button>
  5. &nbsp;
  6. <span>企业协作平台</span>
  7. <!-- &nbsp;
  8. <md-icon>accessibility</md-icon>
  9. <md-icon svgIcon="header"></md-icon> -->
  10. <span class='fill-remaining-space'></span>
  11. <md-slide-toggle (change)='onChange($event.checked)'>黑夜模式</md-slide-toggle>
  12. </md-toolbar>

      代码解释01:<span class='fill-remaining-space'></span>的主要作用是撑满剩余的空间

      代码解释02:(change)='onChange($event.checked)' 的作用是当md-slide-toggle组件发生变化时执行相应的方法,参数md-slide-toggle的当前值

      技巧01:md-slide-toggle官方文档 -> 点击前往

    2.2.3 在使用md-slide-toggle的组件编写一个输出变量

      当md-slide-toggle组件的值发生变化时就将变化后的值发送给使用md-slide-toggle这个组件的父组件

      

  1. import { Component, OnInit, Output, EventEmitter } from '@angular/core';
  2.  
  3. @Component({
  4. selector: 'app-header',
  5. templateUrl: './header.component.html',
  6. styleUrls: ['./header.component.scss']
  7. })
  8. export class HeaderComponent implements OnInit {
  9. @Output()
  10. toggle = new EventEmitter<void>();
  11.  
  12. @Output()
  13. toggleDarkTheme = new EventEmitter<boolean>();
  14.  
  15. constructor() { }
  16.  
  17. ngOnInit() {
  18. }
  19.  
  20. openSidebar() {
  21. this.toggle.emit();
  22. }
  23.  
  24. onChange(eventValue: boolean) {
  25. // console.log('是否黑夜模式:' + eventValue);
  26. this.toggleDarkTheme.emit(eventValue);
  27. }
  28.  
  29. }

    2.2.4 在父组件中监听使用md-slide-toggle的那个组件触发的事件

      

  1. <md-sidenav-container [class.myapp-dark-theme]="darkTheme">
  2. <md-sidenav #sidenav mode="push">
  3. <app-sidenav></app-sidenav>
  4. </md-sidenav>
  5. <div class="site">
  6. <header>
  7. <app-header (toggle)="sidenav.toggle()" (toggleDarkTheme)="switchTheme($event)"></app-header>
  8. </header>
  9. <main>
  10. <router-outlet></router-outlet>
  11. </main>
  12. <footer>
  13. <app-footer></app-footer>
  14. </footer>
  15. </div>
  16. </md-sidenav-container>

      代码解释01:<app-header (toggle)="sidenav.toggle()" (toggleDarkTheme)="switchTheme($event)"></app-header> 当app-header组件触发toggleDarkTheme会引发使用app-haeder组件的父组件触发switchTheme方法,并将app-header组件发出的参数接收到作为switchTheme方法的参数

    2.2.5 在父组件中编写switchTheme方法

      该方法根据接收到的参数真假来判断是否开启黑夜模式对应的class类

      

      

  1. import { Component } from '@angular/core';
  2.  
  3. @Component({
  4. selector: 'app-root',
  5. templateUrl: './app.component.html',
  6. styleUrls: ['./app.component.scss']
  7. })
  8. export class AppComponent {
  9. darkTheme = false;
  10.  
  11. switchTheme(dark) {
  12. this.darkTheme = dark;
  13. // alert(this.darkTheme);
  14. }
  15. }

  2.3 效果图如下

    2.3.1 白天模式

      

    2.3.2 黑夜模式

      

Material使用06 自定义主题、黑夜模式\白天模式切换的更多相关文章

  1. Material使用05 自定义主题、黑夜模式\白天模式切换

    需求: 1 不使用materil依赖内建的主题,使用自己创建的主题 2 利用自己创建的主题实现白天模式和黑夜模式 1 自定义主题 1.1 创建自定义主题文件 them.scss // 引入materi ...

  2. Angular Material 白天模式和黑夜模式

    Material design调色板 https://www.materialpalette.com/ 明暗:虽然颜色不变,但是针对白天黑夜有做不同处理. 叠加:对话框,弹出菜单,事先是没有加载的.是 ...

  3. ExtJS4.2.1自定义主题(theme)样式详解

    (基于Ext JS 4.2.1版本) UI组件 学习ExtJS就是学习组件的使用.ExtJS4对框架进行了重构,其中最重要的就是形成了一个结构及层次分明的组件体系,由这些组件形成了Ext的控件. Ex ...

  4. element 如何自定义主题

    自定义主题 在我学习element的时候,就直接忽略了.现在返回来学习一下 ,原来 通过自定义主题可以改变elemnt中默认的一些样式.这样,对于一些不想用elment自带但是用到比较多的样式,可以进 ...

  5. QtQuick自定义主题以及控件样式指引

    自定义控件样式 请在Qt帮助索引中输入Customizing a Control进行查看 不过实际用下来感觉除非你想自己实现一套效果复杂的UI或是创造一个全新控件,比如:给UI添加模糊.虚化等Shad ...

  6. 【Android】8.3 自定义主题

    分类:C#.Android.VS2015: 创建日期:2016-02-17 一.简介 在Android系统中,除了内置的主题外,开发人员还可以自定义主题.一般通过在Resources/value文件夹 ...

  7. Element-UI自定义主题

    Element-UI自定义主题 1.介绍:我们可以自定义样式去覆盖element-ui的默认样式 // 在项目目录中新建 element-variables.scss 文件 // 上面为修改的变量 $ ...

  8. ModernUI教程:创建自定义主题

            Modern UI WPF包括两个内置主题(dark与light).在1.0.3版本,您可以构建自定义的主题.Modern UI应用程序通常有在全局资源字典App.xaml中有如下定义 ...

  9. 如何优雅使用Sublime Text3(Sublime设置豆沙绿背景色和自定义主题)

    ♣Sublime Text3软件的下载 ♣设置字体的大小 ♣设置背景色和关键字颜色(Color Scheme 生成器) ♣快速生成html头文件 1.Sublime Text3软件的下载地址和包含的文 ...

随机推荐

  1. HackerRank - camelcase 【字符串】

    思路 找单词 第一个 单词 是小写 然后 后面的单词 第一位 都是大写 刚开始 初始化 ans = 1 然后 往后遍历 碰到 大写的 更新答案 AC代码 #include <cstdio> ...

  2. FHQ_treap

    上个月还在舔\(splay\):\(FHQ-treap\)太好打了吧真香 前言 还是建议先把\(splay\)学好再看,讲得会比较粗略(但该有的不会少),或者左转其他文章 \(FHQ-treap\)是 ...

  3. ios 微信发送位置

    @interface GroupReportViewController () <BMKMapViewDelegate,BMKLocationServiceDelegate,BMKGeoCode ...

  4. BZOJ2034 [2009国家集训队]最大收益

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  5. codeforces 460D:Little Victor and Set

    Description Little Victor adores the sets theory. Let us remind you that a set is a group of numbers ...

  6. JAVA- 数据库连接池原理

    第一次Java程序要在MySQL中执行一条语句,那么就必须建立一个Connection对象,代表了与MySQL数据库的连接通过直接发送你要执行的SQL语句之后,就会调用Connection.close ...

  7. CommonJS、AMD与CMD

    自从有了模块,我们可以更方便地使用别人的代码,想要什么功能,就加载什么模块.但是,这样做有一个前提,那就是大家必须以同样的方式编写模块,否则你有你的写法,我有我的写法,岂不是乱了套! 于是下面三个模块 ...

  8. 仿联想商城laravel实战---4、验证(lavarel的表单验证如何使用)

    仿联想商城laravel实战---4.验证(lavarel的表单验证如何使用) 一.总结 一句话总结: 验证规则和验证信息的数组:在控制器的方法中 1.注册页面中的用户名正确(比如是否重名,字段长度是 ...

  9. IBatis笔记

    dynamic可以去除第一个prepend="and"中的字符(这里为and),从而可以帮助你实现一些很实用的功能 ibatis的remapResults属性在查询列发生变化,直接 ...

  10. PHP基础陷阱题(变量赋值)

    PHP基础陷阱题代码,需要的朋友可以参考下   复制代码 代码如下: <?php $a=3; $b=6; if($a=5||$b=7){ $a++; $b++; } var_dump($a, $ ...