DAY10 - 切换不同的布景主题

在前几篇,挑选一套自己喜欢的UI框架中提到,挑选Nebular的其中一个重要的原因是:可以很方便快速切换主题。这一篇就要来示范,如何做到一件切换主题!

什麽是切换布景主题

自从暗黑模式流行起来之後,越来越多的网站与应用程序加入了即时切换不同布景主题的模式。一般来说,都是光亮模式与暗黑模式之间的切换。

而Nebular 提供六套不同的预设主题,供开发者直接套用。我们就来挑战,切换 Light 与 Dark 两种不同的主题吧!

https://ithelp.ithome.com.tw/upload/images/20210925/20120107Ks1znV467v.png

切换布景主题的原理也很简单,也就是切换不同主题的CSS档案,读取CSS布景主题的变数之後,套用上去,达到切换布景主题的效果

在执行时,即时切换主题

在Nebular的文件 Change Current Theme 的章节介绍到,如何在执行的时候切换布景主题:

// ...
  constructor(private themeService: NbThemeService) {
    this.themeService.changeTheme('corporate');
  }

就这样,没了!就是这麽简单!

只要引入Nebular 的 NbThemeService ,并且呼叫 changeTheme 的方法,就可以即时切换主题。

这个就是Nebular吸引我的地方,相较其他的UI 框架切换主题麻烦的设定,Nebular 简洁俐落多了。

在此同时也要反思自己,有没有办法写出这麽简洁又好用的程序码呢?

制做切换主题的按钮

了解如何切换主题後,要制做一个按钮,让使用者点击切换布景主题。

在页面的右上角,有一个切换的按钮让使用者切换布景主题

https://ithelp.ithome.com.tw/upload/images/20210925/20120107evF0M9ANcy.png

暗黑模式

https://ithelp.ithome.com.tw/upload/images/20210925/20120107fwVc7wmwBQ.png

亮白模式

https://ithelp.ithome.com.tw/upload/images/20210925/20120107NfGbhAcXmu.png

制做按钮

按钮和 icon 是利用 nebular 内建的元件制做的,使用方法很简单,只要引入相关模组,就可以使用,另外还要汇入 FormsModule 使用双向绑定来记录元件的状态

@NgModule({
  imports: [
    NbToggleModule,
    NbIconModule,
		FormsModule
  ]
})

再来写下html

<nb-toggle
  status="basic"
  [(ngModel)]="themeToggle"
  (ngModelChange)="changeThemeMode(themeToggle)"
>
  <nb-icon [icon]="themeToggle ? 'moon' : 'sun-outline'"></nb-icon>
</nb-toggle>

利用 ngModel 去纪录目前按钮的状态,再来用 ngModelChange 去监听,当绑定的值出现变化,便触发 changeThemeMode 的方法去切换布景主题。

另外icon也利用 themeToggle 的变数去控制目前要显示太阳或月亮表示当前的布景主题

最後来写逻辑 typescript

  themeToggle = true;
  constructor(private themeService: NbThemeService) {
    this.detectTheme();
  }

  changeThemeMode(themeToggle: boolean): void {
    const theme = themeToggle ? 'dark' : 'default';
    this.themeService.changeTheme(theme);
  }

  detectTheme(): void {
    const isDarkMode =
      window.matchMedia &&
      window.matchMedia('(prefers-color-scheme: dark)').matches;
    this.themeToggle = isDarkMode;
    this.changeThemeMode(this.themeToggle);
  }

也就是依照官网的写法,来切换主题。

但是在这里有一个特别的是,笔者写了一个 detectTheme 的方法去侦测使用者装置系统预设主题,如果使用者装置设定暗黑模式,那麽网站打开预设就会是暗黑模式,让使用者可以有更一致的使用者体验。

window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches; 就是一个很好的判断方法

如此一来就大功告成罗,最後来看看成果吧!
Imgur


<<:  Day12.进入 ARM 世界: ARM Cortex-M Exception Behavior

>>:  每日挑战,从Javascript面试题目了解一些你可能忽略的概念 - Day10

Day 30 : 妈!我完赛了!

没错各位!今天是最後一天!很突然的就完赛了,我跟同学们说的时候,大家都相当错愕,前阵子才听我说要参加...

Day 11-制作购物车系统之安装及资料夹结构(一)

今天要开始制作购物车系统所需的VScode环境。 GO GO ~ 以下内容有参考教学影片,底下有附网...

Day-25 PyTorch 的 CNN Model

我们昨天提过 CNN 的结构就是两层 卷积层 + 池化层 的结构,并在後面接一个简单的 NN 那就...

【Day3】 环境建置 - 安装 Dev C++

今天要介绍的编译器是以简单轻便着称的 Dev-C++! STEP 1. 到Dev-C++官网 点选「...

【2022】忘记 Apple ID 密码?教你四个超实用破解技巧!

Apple ID 对於使用者来説非常重要,无论是更换新手机如 iPhone13/12/11/XR/X...