如何用 Angular 實現深色模式

最近,我發佈了一個很小的項目。雖然這個項目很小,但我還是想在項目中加入黑暗模式和明亮模式,這是我從未挑戰過的事情。

我使用的技術棧是 React 和 Gatsby,這樣的組合有很多選項供我選擇。正當我準備大展身手的時候,偶然間發現了一個極簡且強大的庫:use-dark-mode。十分鐘後,我成功地將黑暗模式集成到了我的項目中。

而我作爲一名 Angular 開發人員,突然想到若是 Angular 的生態系統中也存在這種庫該有多好。於是,我創建了 angular-dark-mode。

我在 stackblitz 中提供了最終代碼和演示。

首先,創建一個可以運行的 Angular 項目:

npx @angular/cli new dark-mode-playground --minimal

接下來,添加 angular-dark-mode:

npm i angular-dark-mode 

或者,如果你更喜歡 yarn 的話:

yarn add angular-dark-mode

最後,將 angular-dark-mode.js 文件添加到 angular.json 腳本部分:

{
  "scripts": [
    "./node_modules/angular-dark-mode/angular-dark-mode.js"
  ]
}

更多關於 angular-dark-mode.js 的信息,請各位看官往下滑。

Show Me the Code

angular-dark-mode 附帶一些可配置選項:

我們需要添加一些樣式來實現黑暗模式和明亮模式:

body {
  margin: 0;
}
body:not(.dark-mode-preloading) {
  transition: all 0.3s linear;
}
body.dark-mode {
  background-color: #2f3542;
  color: #f1f2f6;
}
body.light-mode {
  background-color: #f1f2f6;
  color: #2f3542;
}

我們希望基於上面的默認配置來設置樣式,因此我們設置了黑暗和明亮兩種模式的 CSS 類的樣式。
另外,我們希望能在兩種模式之間有一個很好的過渡,但又想跳過初始過渡,所以我們決定在預加載階段之後設置。

轉到 app.component.ts,插入 DarkModeService 並添加一些文本以及切換模式的按鈕:

import { Component } from "@angular/core";
import { DarkModeService } from "angular-dark-mode";
import { Observable } from "rxjs";
@Component({
  selector: "app-root",
  template: `
    <h1>angular-dark-mode is Awesome!</h1>
    <p>Toggle the checkbox to see magic happens!</p>
    <div>
      <input
        type="checkbox"
        [checked]="darkMode$ | async"
        (change)="onToggle()"
      />
    </div>
  `,
  styles: [
    `
      :host {
        min-height: 100vh;
        display: flex;
        flex-direction: column;
        justify-content: center;
        align-items: center;
      }
    `,
  ],
})
export class AppComponent {
  darkMode$: Observable<boolean> = this.darkModeService.darkMode$;
  constructor(private darkModeService: DarkModeService) {}
  onToggle(): void {
    this.darkModeService.toggle();
  }
}

這樣就 OK 了,運行該應用程序時,它會根據你的設備的模式自動打開相應的模式。此外,還可以通過按鈕進行黑暗模式/明亮模式兩種模式的切換。來看看效果:

angular-dark-mode.js

該文件有兩個用途:

1、持久化:持久化是將程序數據在持久狀態和瞬時狀態間轉換的機制。通俗的講,就是瞬時數據(比如內存中的數據)持久化爲持久數據(比如持久化至數據庫中,能夠長久保存)。angular-dark-mode 可以將你的偏好保存在 localStorage 中。當應用程序加載時,angular-dark-mode 可以從 localStorage 中檢索最新的值,或返回到其首選項。

2、預加載:如上文所見,當我們想跳過初始過渡時,preloadingClass 選項可以說非常方便了,我在這個文件中設置了 preloadingClass,並在應用程序初始化後刪除它。

注意:庫中附帶的 angular-dark-mode.js 文件假定你使用的是默認選項。如果你在使用時覆蓋了該文件,一定要把 angular-dark-mode.js 文件複製到本地,修改完成後,在 angular.json 中加載本地文件而不是庫文件。

原文鏈接

https://medium.com/better-programming/turn-off-the-lights-with-angular-dark-mode-194241f491ae

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章