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

需求:

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

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

1 自定义主题

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

    

// 引入material自定义主题支持
@import ‘[email protected]/material/theming‘;
// 引入material公用的主题风格
@include mat-core();

// 自定义颜色
$my-app-primary: mat-palette($mat-blue);
$my-app-accent: mat-palette($mat-teal, A200, A100, A400);
$my-app-warn: mat-palette($mat-red);

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

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

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

// 引入material自定义主题支持
@import ‘[email protected]/material/theming‘;
// 引入material公用的主题风格
@include mat-core();

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

// 自定义颜色
$my-app-primary: mat-palette($mat-blue); // 主色
$my-app-accent: mat-palette($mat-teal, A200, A100, A400); // 副色
$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 利用自己的主题颜色组成自定义主题

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

    1.1.4 设置主题颜色使其生效

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

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

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

    

/* You can add global styles to this file, and also import other style files */

// @import ‘[email protected]/material/prebuilt-themes/deeppurple-amber.css‘; // 导入material的内建主体
@import ‘theme.scss‘;

html, body, app-root, md-sidenav-container, .site {
    width: 100%;
    height: 100%;
    margin: 0;
}

.site {
    display: flex;
    flex-direction: column;
}
header {
    // background-color: skyblue;
}
main {
    flex: 1;
}
footer {
    // background-color: skyblue;
}

.fill-remaining-space { // flex项目自动填充多余空间
    flex: 1 1 auto;
}

.full-width {
    width: 100%;
}

  1.3 效果如下

    

2 利用多主题实现多模式

  2.1 添加黑夜主题

    

// 引入material自定义主题支持
@import ‘[email protected]/material/theming‘;
// 引入material公用的主题风格
@include mat-core();

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

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

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

// 自定义颜色
$my-dark-primary: mat-palette($mat-blue-grey); // 主色
$my-dark-accent: mat-palette($mat-amber, A200, A100, A400); // 副色
$my-dark-warn: mat-palette($mat-deep-orange); // 警告色

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

// 设置自定义主题,使其生效
.myapp-dark-theme {
    @include angular-material-theme($my-dark-theme);
}

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

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

    2.2.1 在共享模块中引入MdSlideToggleModule

      

import { NgModule } from ‘@angular/core‘;
import { CommonModule } from ‘@angular/common‘;
import {
  MdSidenavModule,
  MdToolbarModule,
  MdIconModule,
  MdButtonModule,
  MdIconRegistry,
  MdCardModule,
  MdInputModule,
  MdListModule,
  MdSlideToggleModule
 } from ‘@angular/material‘;
 import { HttpModule } from ‘@angular/http‘;

@NgModule({
  imports: [
    CommonModule,
    HttpModule,
    MdSidenavModule,
    MdToolbarModule,
    MdIconModule,
    MdButtonModule,
    MdCardModule,
    MdInputModule,
    MdListModule,
    MdSlideToggleModule
  ],
  declarations: [],
  exports: [
    CommonModule,
    MdSidenavModule,
    MdToolbarModule,
    MdIconModule,
    MdButtonModule,
    HttpModule,
    MdCardModule,
    MdInputModule,
    MdListModule,
    MdSlideToggleModule
  ]
})
export class SharedModule { }

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

      

<md-toolbar color="primary">
    <button md-icon-button (click)="openSidebar()">
        <md-icon>menu</md-icon>
    </button>
    &nbsp;
    <span>企业协作平台</span>
    <!-- &nbsp;
    <md-icon>accessibility</md-icon>
    <md-icon svgIcon="header"></md-icon> -->
    <span class=‘fill-remaining-space‘></span>
    <md-slide-toggle (change)=‘onChange($event.checked)‘>黑夜模式</md-slide-toggle>
</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这个组件的父组件

      

import { Component, OnInit, Output, EventEmitter } from ‘@angular/core‘;

@Component({
  selector: ‘app-header‘,
  templateUrl: ‘./header.component.html‘,
  styleUrls: [‘./header.component.scss‘]
})
export class HeaderComponent implements OnInit {
  @Output()
  toggle = new EventEmitter<void>();

  @Output()
  toggleDarkTheme = new EventEmitter<boolean>();

  constructor() { }

  ngOnInit() {
  }

  openSidebar() {
    this.toggle.emit();
  }

  onChange(eventValue: boolean) {
    // console.log(‘是否黑夜模式:‘ + eventValue);
    this.toggleDarkTheme.emit(eventValue);
  }

}

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

      

<md-sidenav-container [class.myapp-dark-theme]="darkTheme">
  <md-sidenav #sidenav mode="push">
    <app-sidenav></app-sidenav>
  </md-sidenav>
  <div class="site">
    <header>
      <app-header (toggle)="sidenav.toggle()" (toggleDarkTheme)="switchTheme($event)"></app-header>
    </header>
    <main>
      <router-outlet></router-outlet>
    </main>
    <footer>
      <app-footer></app-footer>
    </footer>
  </div>
</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类

      

      

import { Component } from ‘@angular/core‘;

@Component({
  selector: ‘app-root‘,
  templateUrl: ‘./app.component.html‘,
  styleUrls: [‘./app.component.scss‘]
})
export class AppComponent {
  darkTheme = false;

  switchTheme(dark) {
    this.darkTheme = dark;
    // alert(this.darkTheme);
  }
}

  2.3 效果图如下

    2.3.1 白天模式

      

    2.3.2 黑夜模式

      

  2.4 待解决问题

    2017年12月24日22:04:30

    md-card组件的主题失效

    md-side-nav组件的主题失效

时间: 2024-11-10 10:47:17

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

element 如何自定义主题

自定义主题 在我学习element的时候,就直接忽略了.现在返回来学习一下 ,原来 通过自定义主题可以改变elemnt中默认的一些样式.这样,对于一些不想用elment自带但是用到比较多的样式,可以进行修改. 看了很多关于自定义主题的文章,其实都是 差不多的, 我想自己写一遍,加深一下印象,也希望能给别人带来帮助. 这篇博客的思路,总结性比较强,指的大家j借鉴:https://blog.csdn.net/young_emily/article/details/78591261 改变原有的elem

Extjs自定义主题

每一个ExtJS程序都是从一个Application类的实例开始的.它包含了你程序的全局设置. 自定义主题的例子:新建一个工作空间:windows控制台窗口下进入有sdk所在的目录输入命令:sencha –sdk  ~/ generateworkspace my-workspace,而后会发现在sdk所在的目录下会出现myworkspace文件夹.其中有连个目录分别为:ext,packages (1)建立一个应用程序测试项目: 在myworkspace目录下输入命令:sencha –sdk ex

百度echarts自定义主题使用

1.百度echarts官网主题构建,自定义主题 主题在线构建  http://echarts.baidu.com/theme-builder/ 构建完成后下载并保存js文件 2.html导入保存的js文件 <!-- 引入 ECharts 文件 --> <script src="echarts.js"></script> <!-- 引入 自定义主题customed --> <script src="customed.js&q

vue2.0-基于elementui换肤[自定义主题]

0. 直接上 预览链接 vue2.0-基于elementui换肤[自定义主题] 1. 项目增加主题组件 在项目的src/components下添加skin文件夹 skin文件获取地址 2. 项目增加自定义主题 自定义添加主题下载地址 https://elementui.github.io/theme-chalk-preview/#/zh-CN 3. 项目引入和使用 选择你想要随主题改变的element元素在src/global/themeArray里面,不希望随主题改变的可以注释掉 选择皮肤之后

Flutter自定义主题并切换保存

现在越来越多的应用程序支持黑/白主题切换了,在Flutter中更是简单,Flutter库中提供了ThemeData.dark和Theme.light两个默认主题.在main.dart初始化MaterialApp的时候直接设置进去即可 MaterialApp( title: 'Flutter Demo', theme: ThemeData.light(), home: MyHomePage(title: 'Flutter Demo Home Page'), ); 一.自定义主题 知道怎么设定主题了

[技术干货] Zabbix创建自定义主题(theme)

前提:zabbix系统已部署好. 1.在你的zabbix系统找到assets/styles目录,创建css后缀的文件: cp blue-theme.css custom-theme.css 2.修改custom-theme.css的内容,由于是测试,我修改了导航栏的背景颜色:注释掉原来的css代码,然后把background-color修改成:aqua 3.在你的zabbix系统找到include/classes/core目录,在Z.php文件中添加以下php代码: vim Z.php publ

Vue的elementUI实现自定义主题

使用vue开发项目,用到elementUI,根据官网的写法,我们可以自定义主题来适应我们的项目要求,下面来介绍一下两种方法实现的具体步骤,(可以参考官方文档自定义主题官方文档),先说项目中没有使用scss编写,用主题工具的方法(使用的较多) 第一种方法:使用命令行主题工具使用vue-cli安装完项目并引入element-ui(具体可参考第二种方法中的介绍) 一.安装工具1,安装主题工具 npm i element-theme -g 2,安装chalk主题,可以从 npm 安装或者从 GitHub

Android主题切换—夜间/白天模式探究

现在市面上众多阅读类App都提供了两种主题:白天or夜间. 上述两幅图片,正是两款App的夜间模式效果,所以,依据这个功能,来看看切换主题到底是怎么实现的(当然现在github有好多PluginTheme开源插件,很多时候可以使用这些插件,不过我并不想讲怎么用那些插件,正所谓会用轮子还不如会造轮子). 关于更换主题和换肤 这里提到是做换主题功能,当然与之类似的就是换肤,换肤现在比较流行的是采用插件化动态加载技术来实现的,这样可以起到热插拔作用,需要皮肤时候用户自主的在网上下载便是了,不用皮肤时便

Android(Lollipop/5.0) Material Design(六) 自定义动画

官网地址:https://developer.android.com/intl/zh-tw/training/material/animations.html 动画在Material设计中,为用户与app交互反馈他们的动作行为和提供了视觉上的连贯性.Material主题为Buttons和Activity的过渡提供了一些默认的动画,在android5.0(api21)及以上,允许自定义这些动画: · Touch feedback  触摸反馈 · Circular Reveal  循环显示 · Ac