ในบทความนี้ เราจะมาดูวิธีการสร้างธีมแบบ Dark Mode อย่างง่ายโดยใช้ Tailwind CSS ร่วมกับ React เพื่อให้สามารถนำไปประยุกต์ใช้กับโปรเจกต์ของตัวเองได้ โดยเทคโนโลยีที่เราจะใช้ในบทความนี้คือ React และ Tailwind CSS v4 ซึ่งช่วยให้เราจัดการ Style ได้อย่างเป็นระบบและมีประสิทธิภาพมากขึ้น
เริ่มต้นติดตั้งโปรเจกต์ด้วย Vite
เราจะใช้ Vite ในการสร้างโปรเจกต์ React โดยใช้ npm เป็นตัวจัดการแพ็กเกจ สามารถเลือกเป็น yarn หรือ pnpm ตามความถนัดได้เลยครับ
npm create vite
o Project name:
| Tailwind-Dark-React
|
o Package name:
| tailwind-dark-react
|
o Select a framework:
| React
|
o Select a variant:
| JavaScript
|
o Scaffolding project in C
|
— Done. Now run:
cd Tailwind-Dark-React
npm install
npm run dev
JavaScriptถ้าไม่อะไรผิดพลาด สามารถเปิดเบราว์เซอร์ไปที่ localhost:5173 เพื่อดูผลลัพธ์ได้เลย

ติดตั้ง Tailwind CSS
npm install tailwindcss @tailwindcss/vite
JavaScriptจากนั้นแก้ไขไฟล์ vite.config.js ดังนี้
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
import tailwindcss from '@tailwindcss/vite'
// <https://vite.dev/config/>
export default defineConfig({
plugins: [react(),tailwindcss()],
})
JavaScriptในไฟล์ src/index.css ให้ลบ Style เดิมออก แล้วเพิ่มโค้ด
@import "tailwindcss";
{
font-family: monospace;
}
JavaScriptสำหรับเพื่อน ๆ ที่อยากได้ Auto Complete ของ Tailwind ให้ทำการโหลด Extension ชื่อ Tailwind CSS IntelliSense จากนั้นไปสร้างไฟล์ที่ Root Directory ชื่อ tailwind.config.js จากนั้นใส่ config ตามนี้ได้เลยเป็นการทำให้ IDE ของเราขึ้น Auto Complete ได้โดยที่ไม่เจอปัญหาอะไร
// tailwind.config.js (ใช้ ES Module)
export default {
content: ['./index.html', './src/**/*.{js,ts,jsx,tsx}'],
theme: {
extend: {},
},
plugins: [],
}
JavaScriptตัวอย่างการใช้งาน Tailwind ใน React Component
เราจะทดสอบว่า Tailwind ใช้งานได้หรือยัง โดยแก้ไขไฟล์ src/App.jsx
ดังนี้:
import React from 'react'
const App = () => {
return (
<div class="bg-black text-white p-4 justify-center items-center flex h-screen">
Hello tailwind
</div>
)
}
export default App
JavaScriptจากนั้นก็ทำการ npm run dev ใหม่ อย่าลืม kill terminal ตัวเดิมทึ้งก่อน run dev ใหม่ด้วยนะถ้าทำถูกเราได้ออกมาเป็นพื้นหลังสีดำกับ Hello tailwind อยู่ตรงกลางจอ

อธิบายการทำงานของ Tailwind กันสักหน่อย สำหรับใครที่ยังไม่เคยใช้หรือไม่เคยเขียน Tailwind มาก่อน อาจสงสัยว่าทำไมเราถึงสามารถแต่ง Style ของเว็บได้ ทั้ง ๆ ที่แทบไม่ได้ไปยุ่งอะไรกับไฟล์ index.css
เลย นั่นก็เพราะว่า Tailwind เป็น Utility-first CSS ซึ่งหมายความว่าเราสามารถใส่ Style ผ่าน class name ที่แปะไว้ใน tag HTML ได้โดยตรง โดยไม่ต้องเขียน CSS แยกต่างหาก โดยที่เบื้องหลัง Tailwind จะรวมคำสั่ง CSS พื้นฐานต่าง ๆ ไว้ในรูปแบบของ utility class เช่น p-4
, text-center
, bg-blue-500
เป็นต้น ข้อดีของ Tailwind สามารถนำไปใช้ร่วมกับ Framework ไหนก็ได้ ขอแค่รองรับ CSS ก็สามารถติดตั้งและใช้งาน Tailwind ได้ทันที
แล้วทำไมถึงเลือกใช้ React มาช่วยในการทำธีมขาว / ดำ กับเจ้า Tailwind เพราะ React เป็นตัวที่จัดการให้เราสามารถเขียน JavaScript ใน HTML ได้ง่าย ๆ ไม่ต้องมา get element by id
เหมือนใน JavaScript Dom ข้อดีคือเป็นระบบมากกว่ามีการจัดการแบบ Component ด้วยทำให้ใช้ของซ้ำ ๆ ได้ทันที และ React จะมีฟีเจอร์ที่เล่นกับการโหลดหน้าเว็บใหม่หรือปรับแต่งหน้าเว็บได้เยอะมาก ๆ
หลังจากเราฟังแนวคิดแล้วทฤษฎีไปหมดแล้วเรามาเขียนโค้ดต่อกันเลยโดยผมจะสร้างหน้าง่าย ๆ ขึ้นมาโดนจะมาปุ่มไว้เปลี่ยนธีมสลับไปมาระหว่าง ขาวกับดำ ละมีตัวหนังสือหัวข้อละก็คำอธิบายที่ mock ขึ้นมาจาก lorem กันโดยโค้ดจะเป็นแบบนี้
import React, { useState } from 'react'
const App = () => {
const [darkMode, setDarkMode] = useState(false)
const turnOnDarkMode = () => {
setDarkMode(!darkMode)
}
return (
<div className="bg-white text-black p-4 justify-center items-center flex h-screen flex-col ">
<button onClick={setDarkMode} className=" fixed top-4 right-4 z-50 p-2 rounded-full bg-white text-white shadow hover:scale-105 transition ">{darkMode ? "☀️" : "🌕"}</button>
<h1 className="text-3xl font-bold mb-4">Hello Tailwind</h1>
<p className="text-lg text-lowercase">Lorem ipsum dolor, sit amet consectetur adipisicing elit. Corrupti impedit accusamus asperiores sequi numquam dignissimos molestiae. Perferendis, sunt placeat? Esse facere error molestias amet quae inventore perspiciatis asperiores recusandae. Aspernatur at deleniti ratione reiciendis quae, accusamus suscipit repudiandae corporis sequi debitis sapiente odit quas? Repudiandae, labore nobis modi odit nemo cumque recusandae saepe omnis reiciendis tempore, illum ipsam tempora corrupti necessitatibus ratione provident hic rem excepturi repellendus! Voluptate quasi dolore doloribus labore incidunt veniam officia magnam quisquam, quod earum beatae consequatur necessitatibus similique exercitationem error iure rem dolor ullam nisi et! Neque, suscipit! Unde odit quae dolore optio excepturi nobis reiciendis repellat neque necessitatibus consequatur fugit laudantium vero, quidem non!</p>
</div>
)
}
export default App
JavaScriptจากนั้นผมจะมาใช้ plugin อันหนึ่งของเจ้า tailwind กันคือ เจ้า darkMode นั้นเองง ให้เข้าไปที่ไฟล์ tailwind.config.js แล้วเพิ่ม darkMode เข้าไป
// tailwind.config.js (ใช้ ES Module)
export default {
content: ['./index.html', './src/**/*.{js,ts,jsx,tsx}'],
theme: {
extend: {
},
},
plugins: [],
darkMode: 'class'
}
JavaScriptจากนั้นเราจะมาทำ Logic ในการเปลี่ยนสีธีมผ่านปุ่มกันโดยที่ผมจะใช้ฟีเจอร์ useState ของเจ้า React เข้ามาช่วยในการเปลี่ยนแปลง Element ของธีมกันนะครับโดยเราจะเขียนโค้ดเพิ่มตามนี้เลย
import React, { useState } from 'react'
const App = () => {
const [darkMode, setDarkMode] = useState(false)
const turnOnDarkMode = () => {
setDarkMode(!darkMode)
}
return (
<div className={`${darkMode ? 'bg-black text-white' : 'bg-white text-black'}`}>
<div className={`p-4 justify-center items-center flex h-screen flex-col transition-colors duration-300 ${
darkMode ? 'bg-black text-white' : 'bg-white text-black'
}`}>
<button
onClick={turnOnDarkMode}
className={`fixed top-4 right-4 z-50 p-2 rounded-full shadow hover:scale-105 transition ${
darkMode ? 'bg-white text-black' : 'bg-black text-white'
}`}
>
{darkMode ? '☀️' : '🌕'}
</button>
<h1 className="text-3xl font-bold mb-4">Hello Tailwind</h1>
<p className="text-lg lowercase">
Lorem ipsum dolor, sit amet consectetur adipisicing elit. ...
</p>
</div>
</div>
)
}
export default App
JavaScriptเราใช้ useState เพื่อเก็บสถานะ darkMode และเมื่อกดปุ่มจะสลับค่าระหว่าง true กับ false ผ่านฟังก์ชัน turnOnDarkMode จากนั้นใน JSX แต่ละ Element เราจะใช้ ternary operator ให้โค้ดสะอากขึ้น และ เพื่อเปลี่ยน class ของ Tailwind โดยไม่ต้องดึง plugin หรือเปลี่ยน global config ของ Tailwind เพราะเรากำหนดเงื่อนไขไว้ใน component เองทั้งหมด ทำให้สามารถเปลี่ยนสีพื้นหลังและข้อความได้ทันที
และเราจะมาเพิ่ม Animation ให้ตอนเปลี่ยนธีมของเราลื่นขึ้นกันนะครับให้ไปที่ไฟล์ index.css จากนั้นเพิ่ม @apply transition-colors duration ได้เลย
@import "tailwindcss";
* {
font-family: monospace;
@apply transition-colors duration-300;
}
JavaScriptสุดท้ายเราจะได้โหมดสลัประหว่าง Dark Mode / White Mode แบบง่าย ๆ กันแล้วนะครับ
สำหรับเพื่อน ๆ ที่กลัวว่าจะทำผิดหรือป่าวหรืออยากนำธีมตัวนี้ไปใช้งานต่อสามารถเข้าไปดู Source Code ได้ที่ https://github.com/Doonminus2/TailwindCSS-Dark-Theme