Tailwind CSS Academy · บทเรียน

การอยู่ร่วมกับ CSS เดิม

ผสาน Tailwind เข้ากับโปรเจกต์ที่มี CSS เดิมหรือเฟรมเวิร์กอื่น โดยจัดการความขัดแย้งด้านความจำเพาะและการย้ายระบบทีละส่วน

บทเรียน 2 จาก 413 ขั้นตอน

การอยู่ร่วมกับ CSS เดิม เป็นบทเรียน Tailwind CSS Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Tailwind CSS Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Tailwind CSS Academy มีบทเรียนทั้งหมด 4 บทเรียน

ความท้าทายในการใช้งานร่วมกัน

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

ทำความเข้าใจความขัดแย้งของความจำเพาะ CSS

ยูทิลิตีของ Tailwind ใช้ตัวเลือกแบบคลาสเดียวที่มีค่าความจำเพาะ 0,1,0 ส่วน CSS แบบเดิมมักใช้ตัวเลือกองค์ประกอบสืบทอด เช่น .header .nav a ซึ่งมีความจำเพาะสูงกว่า เมื่อสไตล์ทั้งสองกำหนดเป้าหมายองค์ประกอบเดียวกัน กฎ CSS แบบเดิมที่มีความจำเพาะสูงกว่าจะมีผล ไม่ว่าจะอยู่ลำดับใดในไฟล์ก็ตาม นั่นหมายความว่ายูทิลิตี Tailwind อย่าง text-blue-600 อาจดูเหมือนไม่ทำงาน หากกฎองค์ประกอบสืบทอดแบบเดิมเขียนทับ

/* Legacy CSS — specificity 0,2,1 */
.header .nav a {
  color: #333333;
}

/* Tailwind utility — specificity 0,1,0 */
/* .text-blue-600 { color: #2563eb; } */

<!-- This Tailwind class LOSES because legacy has higher specificity -->
<header class="header">
  <nav class="nav">
    <a class="text-blue-600">Will still be #333333</a>
  </nav>
</header>

ใช้ @layer เพื่อจัดการความจำเพาะ

คำสั่ง @layer ของ Tailwind จะวางกฎไว้ภายในเลเยอร์ลำดับการใช้ CSS สไตล์ใน @layer base และ @layer utilities มีลำดับความสำคัญต่ำกว่าสไตล์ที่อยู่นอกเลเยอร์ (สไตล์แบบเดิม) แม้ยูทิลิตีจะมีความจำเพาะเท่ากันก็ตาม ดังนั้นสไตล์แบบเดิมจึงมีผลเหนือกว่าได้เองโดยไม่ต้องใช้ !important ในทางกลับกัน ยูทิลิตี Tailwind ใหม่ที่คุณเพิ่มผ่าน @layer utilities จะไม่ทำให้ CSS ที่มีอยู่เดิมเสียหายโดยไม่ตั้งใจ

/*
  Order of precedence (highest to lowest):
  1. !important declarations
  2. Unlayered styles (legacy CSS)
  3. @layer utilities
  4. @layer components
  5. @layer base

  Legacy CSS in a separate file wins by default over Tailwind layers.
*/

/* legacy.css — unlayered, wins over Tailwind layers */
.btn { background-color: navy; }

/* tailwind output — in @layer components, loses to legacy */
/* @layer components { .btn { ... } } */

การนำเข้า Tailwind ร่วมกับ CSS แบบเดิม

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

/* main.css */
@tailwind base;
@tailwind components;
@tailwind utilities;

/* Import legacy styles AFTER Tailwind so they can override when needed */
@import './legacy/reset.css';
@import './legacy/typography.css';
@import './legacy/components.css';

/* New component styles using @apply where needed */
@import './components.css';

หลีกเลี่ยงการชนกันของชื่อคลาส

ชื่อยูทิลิตีของ Tailwind แทบไม่ขัดแย้งกับชื่อคลาสแบบเดิมทั่วไป แต่ก็อาจเกิดการชนกันได้ ตัวอย่างที่พบบ่อยคือคลาสแบบเดิม .container ชนกับยูทิลิตี .container ของ Tailwind วิธีแก้อย่างเป็นทางการคือการเติมคำนำหน้า — เพิ่มคำนำหน้าใน tailwind.config.js เพื่อให้คลาส Tailwind ทั้งหมดกลายเป็น tw-flex, tw-bg-blue-500 และอื่น ๆ ซึ่งช่วยหลีกเลี่ยงชื่อซ้ำกับสไตล์แบบเดิมได้อย่างสมบูรณ์

// tailwind.config.js
module.exports = {
  prefix: 'tw-',   // All Tailwind classes prefixed with 'tw-'
  content: ['./src/**/*.{html,js}'],
  theme: { extend: {} },
};

<!-- In HTML: use tw- prefix on all Tailwind classes -->
<div class="tw-flex tw-items-center tw-gap-4 tw-bg-blue-500">
  <!-- Legacy classes work normally alongside -->
  <div class="legacy-card header-title tw-text-white">
</div>

กลยุทธ์การย้ายระบบแบบค่อยเป็นค่อยไป

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

<!-- BEFORE: legacy button -->
<button class="btn btn-primary btn-lg">Save</button>

<!-- AFTER: new Tailwind button (legacy .btn class removed) -->
<button class="rounded-lg bg-blue-600 px-6 py-3 font-semibold text-white
              transition hover:bg-blue-700">Save</button>

<!-- DURING MIGRATION: both can coexist temporarily -->
<button class="btn btn-primary tw-ring-2 tw-ring-offset-2">Save</button>

การปิดใช้งาน Preflight ของ Tailwind

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

// tailwind.config.js
module.exports = {
  corePlugins: {
    preflight: false,  // Disable the CSS reset
  },
  content: ['./src/**/*.{html,js}'],
  theme: { extend: {} },
  plugins: [],
};

การกำหนดขอบเขต Tailwind เฉพาะส่วน

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

/* Using postcss-scopify or similar — scope Tailwind to .tw-scope */
.tw-scope {
  @tailwind base;
  @tailwind components;
  @tailwind utilities;
}

<!-- In HTML: only elements inside .tw-scope use Tailwind -->
<div class="tw-scope">
  <div class="flex items-center gap-4 bg-blue-500">
    <!-- Tailwind works here -->
  </div>
</div>

<!-- Outside .tw-scope: legacy CSS only -->
<div class="old-header"><!-- legacy --></div>

การทดสอบหลังย้ายแต่ละขั้นตอน

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

// Playwright visual regression example
import { test, expect } from '@playwright/test';

test('button renders correctly', async ({ page }) => {
  await page.goto('/components/button');
  await expect(page.locator('.btn-primary')).toHaveScreenshot('button.png');
});

// Run comparison:
npx playwright test --update-snapshots  // First run: capture baseline
npx playwright test                     // Subsequent: compare

การลบ CSS เดิมอย่างปลอดภัย

เมื่อย้ายคอมโพเนนต์ไปใช้ Tailwind เสร็จสมบูรณ์แล้ว ให้ลบกฎ CSS เดิม ใช้แท็บ Coverage ใน DevTools ของเบราว์เซอร์เพื่อค้นหากฎ CSS ที่ไม่มีการใช้งานเลยในหน้าที่กำหนด ซึ่งเป็นหลักฐานที่ชัดเจนว่ากฎเหล่านั้นไม่ได้ถูกใช้ PurgeCSS ยังสามารถรายงานได้ว่าตัวเลือกใดในไฟล์เดิมไม่เคยตรงกับเนื้อหาใดเลย เพื่อช่วยชี้แนะแนวทางการลบ CSS ที่ไม่ใช้งานอย่างปลอดภัย

# Check CSS coverage in Chrome DevTools:
# 1. Open DevTools > Coverage tab (Ctrl+Shift+P → 'Show Coverage')
# 2. Start recording, interact with the page
# 3. Red bars indicate unused CSS rules — safe to delete if confirmed

# PurgeCSS analysis:
npx purgecss --css legacy.css --content 'src/**/*.html'
# Rules absent from the output were matched — keep
# Rules still in output were never matched — remove candidates

การสื่อสารความคืบหน้าการย้ายระบบ

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

/* MIGRATION STATUS: IN PROGRESS
   Component: .header-nav
   Tailwind replacement: planned in Sprint 12
   Owner: @alice
   Note: Used in _header.html and email-template.html
*/
.header-nav {
  display: flex;
  align-items: center;
  gap: 1rem;
}

ตรวจสอบความเข้าใจ

ทดสอบความเข้าใจแนวคิด Tailwind CSS Mastery จากบทเรียนนี้

ทบทวนบทเรียน

ในบทเรียนนี้ คุณได้เรียนรู้เกี่ยวกับ การจัดการความขัดแย้งด้านความจำเพาะ ระหว่าง Tailwind กับ CSS เดิมโดยใช้เลเยอร์ของ cascade, การปิดใช้งาน Preflight และการเพิ่มคำนำหน้า เพื่อหลีกเลี่ยงการทำให้รูปแบบเดิมเสียหายหรือเกิดชื่อชนกัน และ การย้ายคอมโพเนนต์ทีละขั้น พร้อมการทดสอบการถดถอยทางภาพและการติดตามความคืบหน้า บทถัดไปเราจะสำรวจ CSS Modules ที่ใช้ร่วมกับ Tailwind

เริ่มต้นได้ฟรี

เรียนรู้ HTML ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
30
บทเรียน
120

คำถามที่พบบ่อย

บทเรียน “การอยู่ร่วมกับ CSS เดิม” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การอยู่ร่วมกับ CSS เดิม” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Tailwind CSS Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Tailwind CSS Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การอยู่ร่วมกับ CSS เดิม”

ผสาน Tailwind เข้ากับโปรเจกต์ที่มี CSS เดิมหรือเฟรมเวิร์กอื่น โดยจัดการความขัดแย้งด้านความจำเพาะและการย้ายระบบทีละส่วน คุณปฏิบัติ Tailwind CSS Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Tailwind CSS Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Tailwind CSS Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “การอยู่ร่วมกับ CSS เดิม” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Tailwind CSS Academy นี้ได้ไหม

ได้ บทเรียน Tailwind CSS Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การจัดระเบียบไฟล์และโฟลเดอร์
  2. การอยู่ร่วมกับ CSS เดิม
  3. CSS Modules และ Tailwind
  4. การขยาย Tailwind ในโมโนรีโพ
← กลับไปที่ Tailwind CSS Academy