Skip to content

真暗黑模式 util

真的很黑 (◐‿◑)

此作品啟發

技術關鍵字

名稱 描述
Babylon.js3D 引擎
Canvas Shader使用 GLSL 開發,直接在 GPU 上執行,比 Canvas 2D API 更快,但也更難

使用範例

基本用法

光線隨著游標移動

甚麼是暗黑模式?

暗黑模式(Dark Mode)一種把介面背景變暗、文字變亮的顯示方式。

主要目的是為了在低光源環境下減少螢幕刺眼的亮度、降低視覺疲勞,在部分裝置上還能稍微省點電。

另外的好處是當你半夜睡不著覺,想把心情哼成歌,在黑暗中滑開手機時,避免手機變成閃光彈。

開啟暗黑模式之後,你會發現:

  • 看起來比較專業,但依然無法提早下班
  • 滑社群時比較不會眼睛痠,但還是會被閃照閃瞎鈦合金狗眼

以上,現在你知道我們說的黑是甚麼黑了吧?(⌐■_■)✧

路人:我很確定你這個黑不是暗黑模式的黑 Σ(ˊДˋ;)

查看範例原始碼
vue
<template>
  <div class="w-full border border-gray-200 rounded-xl p-4">
    <div class="w-full border border-gray-200 rounded-xl">
      <base-checkbox
        v-model="enable"
        label="啟用真暗黑模式"
        class="p-4"
      />
    </div>

    <div class="w-full py-4">
      <div class="mb-3 text-2xl font-bold">
        甚麼是暗黑模式?
      </div>

      <div class="text-base leading-relaxed space-y-3">
        <p>
          暗黑模式(Dark Mode)一種把<b>介面背景變暗、文字變亮</b>的顯示方式。
        </p>

        <p>
          主要目的是為了在低光源環境下減少螢幕刺眼的亮度、降低視覺疲勞,在部分裝置上還能稍微省點電。
        </p>

        <p>
          另外的好處是當你半夜睡不著覺,想把心情哼成歌,在黑暗中滑開手機時,避免手機變成閃光彈。
        </p>

        <p>
          開啟暗黑模式之後,你會發現:
        </p>

        <ul class="list-disc list-inside space-y-1">
          <li>看起來比較專業,但依然無法提早下班</li>
          <li>滑社群時比較不會眼睛痠,但還是會被閃照閃瞎鈦合金狗眼</li>
        </ul>

        <p>
          以上,現在你知道我們說的黑是甚麼黑了吧?(⌐■_■)✧
        </p>
      </div>
    </div>

    <util-real-dark
      class="fixed left-0 top-0 z-[100] h-full w-full"
      :disabled="!enable"
    />
  </div>
</template>

<script setup lang="ts">
import { useData } from 'vitepress'
import { onBeforeUnmount, ref, watch } from 'vue'
import BaseCheckbox from '../../base-checkbox.vue'
import UtilRealDark from '../util-real-dark.vue'

const { isDark } = useData()
const oriValue = isDark.value

const enable = ref(false)

watch(enable, (value) => {
  if (value) {
    isDark.value = false
  }
  else {
    isDark.value = oriValue
  }
})

onBeforeUnmount(() => {
  isDark.value = oriValue
})
</script>

原理

原本使用 p5.js 等等繪圖相關套件實作,但重現光線投影、暈光等等效果實在太難惹,以至於這個元件就這麼擱置了好一陣子...(›´ω`‹ )

某天忽然靈光一閃:「3D 套件不是本來就有光源了嗎?」,於是就改用 Babylon.js 實作。

關鍵點在於使用 Shader 根據灰度值設定 alpha,讓亮的地方變透明,完成光線效果。

最後在加上移動光源的效果,終於成功了!( •̀ ω •́ )✧

原始碼

API

Props

interface Props {
  disabled?: boolean;
  /** 平滑係數。越小越慢,延遲越明顯 */
  ease?: number;
  /** 甩尾強度。越大越明顯 */
  offsetStrength?: number;
  /** 燈光尺寸 @default 2 */
  size?: number;
  lightColor?: string;
  /** 透明度 @default 0.9 */
  opacity?: number;
}

v0.55.0