【Flowbite】使用 JavaScript 和 Tailwind.css 實現Dark Mode

更新於 2023/08/24閱讀時間約 11 分鐘

今天在練習寫網頁時,剛好要來有做到Dark Mode 的功能,那順便來記錄一下做法~

首先要先知道Dark Mode的運作原理。是如何知道你現在是Light Mode還是Dark Mode呢?

raw-image

😀就是這邊拉~當你按下按鈕時,javascript 的toggle()去為<html>增加dark標籤。

在知道原理後,我們要如何去實作“在一個標籤中同時有兩個模式的CSS”,這邊以Tailwind.css做示範

<body class="bg-white text-black dark:bg-darkBlue dark:text-white"
>123</html>

先設定好原本的CSS,在額外設定dark: Dark Mode 的樣式就好拉~

那其實這也沒什麼,但有一個問題就是,怎麼製作觸發的按鈕。我一開始還以為要全部手尻(汗),但後來才發現其實Tailwind有幫我們做好了(佛心公司~佛心公司~🥰)

頁面連結

raw-image

那這邊就有明明白白地跟你說拉~

  1. Toggle dark mode by checking user preference in the <head> tag of your HTML (將下面這段代碼放在head標籤)
<script>
// On page load or when changing themes, best to add inline in `head` to avoid FOUC
if (localStorage.getItem('color-theme') === 'dark' || (!('color-theme' in localStorage) && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
document.documentElement.classList.add('dark');
} else {
document.documentElement.classList.remove('dark')
}
</script>
  1. 最棒的地方來了,他直接提供現成的button SVG,直接複製貼上就行拉~
Create a <button> element that can be interacted with to manually change the theme color:
<button id="theme-toggle" type="button" class="text-gray-500 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-700 focus:outline-none focus:ring-4 focus:ring-gray-200 dark:focus:ring-gray-700 rounded-lg text-sm p-2.5">
<svg id="theme-toggle-dark-icon" class="hidden w-5 h-5" fill="currentColor" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M17.293 13.293A8 8 0 016.707 2.707a8.001 8.001 0 1010.586 10.586z"></path></svg>
<svg id="theme-toggle-light-icon" class="hidden w-5 h-5" fill="currentColor" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M10 2a1 1 0 011 1v1a1 1 0 11-2 0V3a1 1 0 011-1zm4 8a4 4 0 11-8 0 4 4 0 018 0zm-.464 4.95l.707.707a1 1 0 001.414-1.414l-.707-.707a1 1 0 00-1.414 1.414zm2.12-10.607a1 1 0 010 1.414l-.706.707a1 1 0 11-1.414-1.414l.707-.707a1 1 0 011.414 0zM17 11a1 1 0 100-2h-1a1 1 0 100 2h1zm-7 4a1 1 0 011 1v1a1 1 0 11-2 0v-1a1 1 0 011-1zM5.05 6.464A1 1 0 106.465 5.05l-.708-.707a1 1 0 00-1.414 1.414l.707.707zm1.414 8.486l-.707.707a1 1 0 01-1.414-1.414l.707-.707a1 1 0 011.414 1.414zM4 11a1 1 0 100-2H3a1 1 0 000 2h1z" fill-rule="evenodd" clip-rule="evenodd"></path></svg>
</button>

啊就給他複製到你的網頁,他會長這樣:

raw-image
raw-image
  1. Add the following JavaScript inside your main file to handle the click events on the <button> element 再新增一個JavaScript檔,將下列內容貼近去,並將其JavaScript檔引入html
var themeToggleDarkIcon = document.getElementById('theme-toggle-dark-icon');
var themeToggleLightIcon = document.getElementById('theme-toggle-light-icon');

// Change the icons inside the button based on previous settings
if (localStorage.getItem('color-theme') === 'dark' || (!('color-theme' in localStorage) && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
themeToggleLightIcon.classList.remove('hidden');
} else {
themeToggleDarkIcon.classList.remove('hidden');
}

var themeToggleBtn = document.getElementById('theme-toggle');

themeToggleBtn.addEventListener('click', function() {

// toggle icons inside button
themeToggleDarkIcon.classList.toggle('hidden');
themeToggleLightIcon.classList.toggle('hidden');

// if set via local storage previously
if (localStorage.getItem('color-theme')) {
if (localStorage.getItem('color-theme') === 'light') {
document.documentElement.classList.add('dark');
localStorage.setItem('color-theme', 'dark');
} else {
document.documentElement.classList.remove('dark');
localStorage.setItem('color-theme', 'light');
}

// if NOT set via local storage previously
} else {
if (document.documentElement.classList.contains('dark')) {
document.documentElement.classList.remove('dark');
localStorage.setItem('color-theme', 'light');
} else {
document.documentElement.classList.add('dark');
localStorage.setItem('color-theme', 'dark');
}
}

});

這邊可以稍微留意一下,步驟一根步驟三的內容其實大同相似,差別是在於:

第一步是提供給一開始渲染網站時,是否要轉成Dark Mode 的依據,那這個依據會取決於localStorage是否有Dark Mode 的紀錄。

第三步的代碼,在更改Dark Mode的同時,也會更新localStorage,那假入筆者手殘「啪」一聲,關掉原本的網頁,再重新開啟時,就會保留原本Dark Mode的依據。




avatar-img
4會員
10內容數
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
W. C. Chen的沙龍 的其他內容
當然指令不是背的,所以第一步就是要打開Tailwind CSS的官網。 Installation - Tailwind CSS 主要的方式有CLI跟CDN,這裡使用的方式前者。 Install Tailwind CSS npm install -D tailwindcss npx tai
這篇要來談談網站部屬的方式 Netlify 提供100GB的空間給大家做使用~ 一定事先註冊登入的拉~,那我登入的方式為github。以下就是你會看的頁面。 上傳完後,就回到Netlify,選擇github,並選取剛剛建立好的專案。 接著進行部屬網站前的先置(但我自己基本是除了網站名稱,
本文將引導您使用簡單的 Header 組件,學習如何使用 render 和 screen 來渲染和查詢元素。我們將探索如何測試文字和字元計數功能,並使用 userEvent 模擬使用者操作。了解如何使用斷言來確保測試結果正確。同時,我們將處理包含 fetch 的異步測試,並介紹 waitFor 函數
當然指令不是背的,所以第一步就是要打開Tailwind CSS的官網。 Installation - Tailwind CSS 主要的方式有CLI跟CDN,這裡使用的方式前者。 Install Tailwind CSS npm install -D tailwindcss npx tai
這篇要來談談網站部屬的方式 Netlify 提供100GB的空間給大家做使用~ 一定事先註冊登入的拉~,那我登入的方式為github。以下就是你會看的頁面。 上傳完後,就回到Netlify,選擇github,並選取剛剛建立好的專案。 接著進行部屬網站前的先置(但我自己基本是除了網站名稱,
本文將引導您使用簡單的 Header 組件,學習如何使用 render 和 screen 來渲染和查詢元素。我們將探索如何測試文字和字元計數功能,並使用 userEvent 模擬使用者操作。了解如何使用斷言來確保測試結果正確。同時,我們將處理包含 fetch 的異步測試,並介紹 waitFor 函數
你可能也想看
Google News 追蹤
Thumbnail
徵的就是你 🫵 超ㄅㄧㄤˋ 獎品搭配超瞎趴的四大主題,等你踹共啦!還有機會獲得經典的「偉士牌樂高」喔!馬上來參加本次的活動吧!
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
當我們面對琳琅滿目的LED燈具色溫選項時,該如何在短時間內挑選最適合居家空間的LED燈具色溫呢?本文將在3分鐘內教你如何挑選居家空間的LED色溫,讓你的家居生活更加舒適、溫馨。 什麼是LED燈具色溫?
Thumbnail
【外掛擴充】Dark Reader 這是一個護眼的 Chrome 瀏覽器擴充套件,通過即時產生深色主題,為每一個網站啟用夜間模式。即使是 Google 信箱或表單,都能使用。透過 Dark Reader 反轉明亮的顏色,使其網頁內容具有高對比度並且易於在夜間閱讀。除了可以減少電量的消耗,也能減少用
Thumbnail
燭光......LED 燈形成的舒適感各有不同。能否正確使用「光」,則落差甚大......
Thumbnail
本章目的是為讀者提供有關如何設置JavaScript開發環境的知識,包括在瀏覽器、Node.js和各種編輯器和IDE中編寫和運行JavaScript的信息。此外,本章還介紹了如何架設本地開發伺服器以模擬實際的網頁環境。這些知識對於希望開發前端應用或後端服務的JavaScript開發者來說都是必要的。
Thumbnail
本文介紹如何使用Vite建立前端開發初始檔案,並加入Tailwindcss的教學。透過指令和配置檔,讓你能快速建立個人專案的開發環境,並學習如何加入全域的Tailwindcss樣式。還有影片教學、資源連結和更多相關教學文章等,幫助你進一步學習。
倒霉兒有了黑色思考,他把房間的燈關了,自己鎖在裏面,黑色。光是什麼顏色?為什麼沒有光就變成黑色?不上網查了,我用自己的解讀方式。光是無色的,是一種自然附加色素,在光的照亮下,所有顏色的本能就發揮了。在失去光的條件下,黑暗其實不是一種顏色,是一種沒有了自然附加色素引發的一種可能,簡稱黑暗。 倒霉兒把
※ switch用法: ​switch是 JavaScript 中的一個控制結構,是一種更結構化的方法來替代多個 if...else 語句,特別是當需要根據同一變數的多個值進行不同操作時非常有用。 ※ switch語法: switch 語句首先評估括號內的表達式 (expression)。
Thumbnail
data-* attributes 是 HTML 內建的屬性,可將網頁的狀態與元素進行綁定。而Tailwind CSS 在 3.2 版更新中推出使用 data-* attributes 自訂樣式的功能,讓樣式設定可以更動態多變。
前言 今天課程要來學習,在 .css 設計樣式後,怎麼透過選擇器,讓 .html 可以有所配對,經過這一步後,便可以開始學習,如何正式設計 .css 了。 選擇器 介紹 還記得上次課程,我們在 .css 檔案中,撰寫的程式碼嗎?讓我們來複習看看: .highlight { co
Thumbnail
商業空間中,不同色溫的燈光可以用於營造不同的氛圍和達到不同的目的。本文探討了溫暖色溫、中性色溫和冷色溫燈光的適用場景,並提出了在餐廳、辦公室、商店和珠寶店等不同商業場所中使用不同色溫燈光的建議。
Thumbnail
徵的就是你 🫵 超ㄅㄧㄤˋ 獎品搭配超瞎趴的四大主題,等你踹共啦!還有機會獲得經典的「偉士牌樂高」喔!馬上來參加本次的活動吧!
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
當我們面對琳琅滿目的LED燈具色溫選項時,該如何在短時間內挑選最適合居家空間的LED燈具色溫呢?本文將在3分鐘內教你如何挑選居家空間的LED色溫,讓你的家居生活更加舒適、溫馨。 什麼是LED燈具色溫?
Thumbnail
【外掛擴充】Dark Reader 這是一個護眼的 Chrome 瀏覽器擴充套件,通過即時產生深色主題,為每一個網站啟用夜間模式。即使是 Google 信箱或表單,都能使用。透過 Dark Reader 反轉明亮的顏色,使其網頁內容具有高對比度並且易於在夜間閱讀。除了可以減少電量的消耗,也能減少用
Thumbnail
燭光......LED 燈形成的舒適感各有不同。能否正確使用「光」,則落差甚大......
Thumbnail
本章目的是為讀者提供有關如何設置JavaScript開發環境的知識,包括在瀏覽器、Node.js和各種編輯器和IDE中編寫和運行JavaScript的信息。此外,本章還介紹了如何架設本地開發伺服器以模擬實際的網頁環境。這些知識對於希望開發前端應用或後端服務的JavaScript開發者來說都是必要的。
Thumbnail
本文介紹如何使用Vite建立前端開發初始檔案,並加入Tailwindcss的教學。透過指令和配置檔,讓你能快速建立個人專案的開發環境,並學習如何加入全域的Tailwindcss樣式。還有影片教學、資源連結和更多相關教學文章等,幫助你進一步學習。
倒霉兒有了黑色思考,他把房間的燈關了,自己鎖在裏面,黑色。光是什麼顏色?為什麼沒有光就變成黑色?不上網查了,我用自己的解讀方式。光是無色的,是一種自然附加色素,在光的照亮下,所有顏色的本能就發揮了。在失去光的條件下,黑暗其實不是一種顏色,是一種沒有了自然附加色素引發的一種可能,簡稱黑暗。 倒霉兒把
※ switch用法: ​switch是 JavaScript 中的一個控制結構,是一種更結構化的方法來替代多個 if...else 語句,特別是當需要根據同一變數的多個值進行不同操作時非常有用。 ※ switch語法: switch 語句首先評估括號內的表達式 (expression)。
Thumbnail
data-* attributes 是 HTML 內建的屬性,可將網頁的狀態與元素進行綁定。而Tailwind CSS 在 3.2 版更新中推出使用 data-* attributes 自訂樣式的功能,讓樣式設定可以更動態多變。
前言 今天課程要來學習,在 .css 設計樣式後,怎麼透過選擇器,讓 .html 可以有所配對,經過這一步後,便可以開始學習,如何正式設計 .css 了。 選擇器 介紹 還記得上次課程,我們在 .css 檔案中,撰寫的程式碼嗎?讓我們來複習看看: .highlight { co
Thumbnail
商業空間中,不同色溫的燈光可以用於營造不同的氛圍和達到不同的目的。本文探討了溫暖色溫、中性色溫和冷色溫燈光的適用場景,並提出了在餐廳、辦公室、商店和珠寶店等不同商業場所中使用不同色溫燈光的建議。