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

更新於 發佈於 閱讀時間約 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
留言分享你的想法!
avatar-img
W. C. Chen的沙龍
4會員
10內容數
W. C. Chen的沙龍的其他內容
2024/03/27
先來名詞解釋jython跟JES: jython是一種實現了Python語言的Java平台版本的解釋器。它允許開發人員在Java虛擬機(JVM)上運行Python代碼,從而實現了Python語言與Java平台的無縫集成。 JES(Jython Environment for Students)是
Thumbnail
2024/03/27
先來名詞解釋jython跟JES: jython是一種實現了Python語言的Java平台版本的解釋器。它允許開發人員在Java虛擬機(JVM)上運行Python代碼,從而實現了Python語言與Java平台的無縫集成。 JES(Jython Environment for Students)是
Thumbnail
2024/03/25
ETL是資料倉儲領域中一個重要的概念,全稱為Extract-Transform-Load,中文可譯為"抽取-轉換-載入"。ETL的作用是將來自不同來源的資料抽取出來,經過清理、轉換、整合等處理後,最終將處理好的資料載入到資料倉儲或其他單一的資料存放區
Thumbnail
2024/03/25
ETL是資料倉儲領域中一個重要的概念,全稱為Extract-Transform-Load,中文可譯為"抽取-轉換-載入"。ETL的作用是將來自不同來源的資料抽取出來,經過清理、轉換、整合等處理後,最終將處理好的資料載入到資料倉儲或其他單一的資料存放區
Thumbnail
2023/08/29
這篇想來寫,剛碰到js得時候,為了讓程式可以運作而安裝Node.js 。Node.js 是能夠在伺服器上面運行 JavaScript 的應用平台環境,透過 Node.js 提供的函式庫與執行環境能完成伺服器端服務。此篇幅就直接從純後端的角度切入摟(對不起拉我寫來寫去還是不知道怎麼順順的寫好文章開頭Q
Thumbnail
2023/08/29
這篇想來寫,剛碰到js得時候,為了讓程式可以運作而安裝Node.js 。Node.js 是能夠在伺服器上面運行 JavaScript 的應用平台環境,透過 Node.js 提供的函式庫與執行環境能完成伺服器端服務。此篇幅就直接從純後端的角度切入摟(對不起拉我寫來寫去還是不知道怎麼順順的寫好文章開頭Q
Thumbnail
看更多
你可能也想看
Thumbnail
大家好,我是一名眼科醫師,也是一位孩子的媽 身為眼科醫師的我,我知道視力發展對孩子來說有多關鍵。 每到開學季時,診間便充斥著許多憂心忡忡的家屬。近年來看診中,兒童提早近視、眼睛疲勞的案例明顯增加,除了3C使用過度,最常被忽略的,就是照明品質。 然而作為一位媽媽,孩子能在安全、舒適的環境
Thumbnail
大家好,我是一名眼科醫師,也是一位孩子的媽 身為眼科醫師的我,我知道視力發展對孩子來說有多關鍵。 每到開學季時,診間便充斥著許多憂心忡忡的家屬。近年來看診中,兒童提早近視、眼睛疲勞的案例明顯增加,除了3C使用過度,最常被忽略的,就是照明品質。 然而作為一位媽媽,孩子能在安全、舒適的環境
Thumbnail
提供一條簡單公式、一套盤點思路,幫助你快速算出去日本自助旅遊需要準備多少日幣現金!
Thumbnail
提供一條簡單公式、一套盤點思路,幫助你快速算出去日本自助旅遊需要準備多少日幣現金!
Thumbnail
data-* attributes 是 HTML 內建的屬性,可將網頁的狀態與元素進行綁定。而Tailwind CSS 在 3.2 版更新中推出使用 data-* attributes 自訂樣式的功能,讓樣式設定可以更動態多變。
Thumbnail
data-* attributes 是 HTML 內建的屬性,可將網頁的狀態與元素進行綁定。而Tailwind CSS 在 3.2 版更新中推出使用 data-* attributes 自訂樣式的功能,讓樣式設定可以更動態多變。
Thumbnail
要改變表單元素的樣式其實相當麻煩,有些樣式還不能更改,這篇就來探討如何把它們改成喜歡的模樣吧。
Thumbnail
要改變表單元素的樣式其實相當麻煩,有些樣式還不能更改,這篇就來探討如何把它們改成喜歡的模樣吧。
Thumbnail
今天在練習寫網頁時,剛好要來有做到Dark Mode 的功能,那順便來記錄一下做法~ 首先要先知道Dark Mode的運作原理。是如何知道你現在是Light Mode還是Dark Mode呢? 😀就是這邊拉~當你按下按鈕時,javascript 的toggle()去為<html>增加dark標
Thumbnail
今天在練習寫網頁時,剛好要來有做到Dark Mode 的功能,那順便來記錄一下做法~ 首先要先知道Dark Mode的運作原理。是如何知道你現在是Light Mode還是Dark Mode呢? 😀就是這邊拉~當你按下按鈕時,javascript 的toggle()去為<html>增加dark標
Thumbnail
當然指令不是背的,所以第一步就是要打開Tailwind CSS的官網。 Installation - Tailwind CSS 主要的方式有CLI跟CDN,這裡使用的方式前者。 Install Tailwind CSS npm install -D tailwindcss npx tai
Thumbnail
當然指令不是背的,所以第一步就是要打開Tailwind CSS的官網。 Installation - Tailwind CSS 主要的方式有CLI跟CDN,這裡使用的方式前者。 Install Tailwind CSS npm install -D tailwindcss npx tai
Thumbnail
介紹有關於一些小修改的方便插件。
Thumbnail
介紹有關於一些小修改的方便插件。
Thumbnail
教到了JS event,非常實用的一堂課程,開始進入監聽階段,可以跟使用者互動,也慢慢建立UX的概念,讓我可以開始自行設計動態網頁,並且優化了第二個靜態網頁,加入了滾動變化的效果。
Thumbnail
教到了JS event,非常實用的一堂課程,開始進入監聽階段,可以跟使用者互動,也慢慢建立UX的概念,讓我可以開始自行設計動態網頁,並且優化了第二個靜態網頁,加入了滾動變化的效果。
Thumbnail
此版本的目標畫面成果是: *金色名字。 *金色社交按鈕圖示,點擊按鈕另開對應的網頁或著顯示comming soon。 *名字和按鈕在網頁中央,如果網頁寬度不夠會換行,夠就不換行。
Thumbnail
此版本的目標畫面成果是: *金色名字。 *金色社交按鈕圖示,點擊按鈕另開對應的網頁或著顯示comming soon。 *名字和按鈕在網頁中央,如果網頁寬度不夠會換行,夠就不換行。
Thumbnail
與HTML不同,CSS是專門修改網頁內容「樣式」的程式語言,也就是說你沒有辦法透過CSS去新增網頁的文字或是圖片等相關的內容,但你可以透過HTML新增網頁內容後,再使用CSS去修改他的樣式,例如⋯⋯
Thumbnail
與HTML不同,CSS是專門修改網頁內容「樣式」的程式語言,也就是說你沒有辦法透過CSS去新增網頁的文字或是圖片等相關的內容,但你可以透過HTML新增網頁內容後,再使用CSS去修改他的樣式,例如⋯⋯
Thumbnail
01-選擇器寫法 圖片來源:自己擷取電腦螢幕 1.可以下.main .img .hot span   控制到a 下面的兩個span 也可以省略成下 .hot span  只要整個html不容易相撞到相同的class就可以 2.也可以下.hot .title  就單純控制span class="t
Thumbnail
01-選擇器寫法 圖片來源:自己擷取電腦螢幕 1.可以下.main .img .hot span   控制到a 下面的兩個span 也可以省略成下 .hot span  只要整個html不容易相撞到相同的class就可以 2.也可以下.hot .title  就單純控制span class="t
Thumbnail
在youtube上找尋前端的小專案來練習,就發現了這個不是很難,又可以讓我練習怎麼把javascript用在網頁裡的專案,於是就跟者影片做了一遍。當然,比起前一個寫遊戲的影片來說,可以說是輕鬆很多。
Thumbnail
在youtube上找尋前端的小專案來練習,就發現了這個不是很難,又可以讓我練習怎麼把javascript用在網頁裡的專案,於是就跟者影片做了一遍。當然,比起前一個寫遊戲的影片來說,可以說是輕鬆很多。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News