Skip to main content
0

Dark Mode ทำยังไงใน Tailwind CSS

ในบทความนี้ เราจะมาดูวิธีการสร้างธีมแบบ 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

2

แนะนำสำหรับคุณ

คัดลอกลิงก์สำเร็จ
Close Menu

เราใช้คุกกี้เพื่อพัฒนาประสิทธิภาพ และประสบการณ์ที่ดีในการใช้เว็บไซต์ของคุณ คุณสามารถศึกษารายละเอียดได้ที่ นโยบายความเป็นส่วนตัว และสามารถจัดการความเป็นส่วนตัวเองได้ของคุณได้เองโดยคลิกที่ ตั้งค่า

ตั้งค่าความเป็นส่วนตัว

คุณสามารถเลือกการตั้งค่าคุกกี้โดยเปิด/ปิด คุกกี้ในแต่ละประเภทได้ตามความต้องการ ยกเว้น คุกกี้ที่จำเป็น

ยอมรับทั้งหมด
จัดการความเป็นส่วนตัว
  • คุกกี้ที่จำเป็น
    เปิดใช้งานตลอด

    ประเภทของคุกกี้มีความจำเป็นสำหรับการทำงานของเว็บไซต์ เพื่อให้คุณสามารถใช้ได้อย่างเป็นปกติ และเข้าชมเว็บไซต์ คุณไม่สามารถปิดการทำงานของคุกกี้นี้ในระบบเว็บไซต์ของเราได้
    รายละเอียดคุกกี้

  • คุกกี้สำหรับการติดตามทางการตลาด

    ประเภทของคุกกี้ที่มีความจำเป็นในการใช้งานเพื่อการวิเคราะห์ และ นำเสนอโปรโมชัน สินค้า รวมถึงหลักสูตรฟรี และ สิทธิพิเศษต่าง ๆ คุณสามารถเลือกปิดคุกกี้ประเภทนี้ได้โดยไม่ส่งผลต่อการทำงานหลัก เว้นแต่การนำเสนอโปรโมชันที่อาจไม่ตรงกับความต้องการ
    รายละเอียดคุกกี้

บันทึกการตั้งค่า