เปิดตัว Tailwind CSS v4.0
(tailwindcss.com)- Tailwind CSS v4.0 เป็นรีลีสที่เขียนเฟรมเวิร์กขึ้นใหม่ทั้งหมดตั้งแต่ต้น โดยยกระดับประสิทธิภาพการบิลด์อย่างมาก และเปลี่ยนแนวทางการตั้งค่าและการปรับแต่งให้ยึด CSS เป็นศูนย์กลาง
- จากเกณฑ์ของ Catalyst เวลาในการบิลด์ทั้งหมดเร็วขึ้น 3.78 เท่า จาก 378ms ใน v3.4 เหลือ 100ms ใน v4.0 และการบิลด์เพิ่มเฉพาะส่วนที่ไม่มี CSS ใหม่ดีขึ้น 182 เท่า จาก 35ms เหลือ 192µs
- การติดตั้งเรียบง่ายขึ้นด้วย
@import "tailwindcss"เพียงบรรทัดเดียวและค่าเริ่มต้นแบบไม่ต้องตั้งค่า และผู้ใช้ Vite สามารถใช้@tailwindcss/viteแทน PostCSS ได้ - v4.0 ใช้ประโยชน์จากฟีเจอร์ CSS สมัยใหม่ เช่น cascade layers,
@property,color-mix(), logical properties พร้อมเพิ่มการตรวจจับคอนเทนต์อัตโนมัติและการจัดการ@importในตัว - container queries, 3D transform, Gradient API ที่ขยายขึ้น,
@starting-style,not-*,field-sizing,color-scheme,inertและอื่น ๆ ถูกนำมาเป็นฟีเจอร์หลัก ทำให้พึ่งพาปลั๊กอินแยกน้อยลง
เอนจินประสิทธิภาพสูงที่เขียนใหม่ทั้งหมดตั้งแต่ต้น
- Tailwind CSS v4.0 เป็นเวอร์ชันที่ เขียนเฟรมเวิร์กใหม่ทั้งหมด โดยอาศัยประสบการณ์ด้านสถาปัตยกรรมที่สั่งสมมาหลายปี
- จากเบนช์มาร์กภายในของโครงการ การรีบิลด์ทั้งหมดเร็วขึ้นมากกว่า 3.5 เท่า และการบิลด์เพิ่มเร็วขึ้นมากกว่า 8 เท่า
- เวลาในการบิลด์ค่ามัธยฐานตามเกณฑ์ Catalyst มีดังนี้
- บิลด์ทั้งหมด: v3.4 378ms → v4.0 100ms, ดีขึ้น 3.78 เท่า
- รีบิลด์เพิ่มที่มี CSS ใหม่: 44ms → 5ms, ดีขึ้น 8.8 เท่า
- รีบิลด์เพิ่มที่ไม่มี CSS ใหม่: 35ms → 192µs, ดีขึ้น 182 เท่า
- การบิลด์เพิ่มที่ไม่จำเป็นต้องคอมไพล์ CSS ใหม่เร็วขึ้นเกิน 100 เท่า จนเสร็จได้ในระดับไมโครวินาที
- ยิ่งทำงานกับโปรเจกต์นานขึ้น ก็ยิ่งมีโอกาสใช้คลาสเดิมซ้ำอย่าง
flex,col-span-2,font-boldมากขึ้น จึงเจอสถานการณ์แบบนี้บ่อย
- ยิ่งทำงานกับโปรเจกต์นานขึ้น ก็ยิ่งมีโอกาสใช้คลาสเดิมซ้ำอย่าง
ใช้ประโยชน์จากแพลตฟอร์ม CSS สมัยใหม่
- v4.0 ใช้ฟีเจอร์ของเว็บแพลตฟอร์มที่พัฒนาขึ้นหลัง Tailwind CSS v3.0 อย่างจริงจัง
- ฟีเจอร์ CSS พื้นฐานสำคัญมีดังนี้
- Native cascade layers: ควบคุมวิธีที่กฎสไตล์ต่าง ๆ โต้ตอบกันได้ละเอียดขึ้น
- Registered custom properties: ทำให้เกิดแอนิเมชัน gradient ได้ และช่วยเพิ่มประสิทธิภาพอย่างมากในหน้าขนาดใหญ่
color-mix(): ปรับความทึบของค่าสีทุกแบบได้ รวมถึง CSS variables และcurrentColor- Logical properties: ทำให้การรองรับ RTL ง่ายขึ้นและลดขนาด CSS ที่สร้างขึ้น
- ฟีเจอร์เหล่านี้ยังช่วยให้การทำงานภายในของ Tailwind เรียบง่ายขึ้น ลดพื้นที่เสี่ยงต่อบั๊ก และดูแลรักษาได้ง่ายขึ้น
ทำให้การติดตั้งและการรวมเข้ากับขั้นตอนบิลด์ง่ายขึ้น
- ขั้นตอนติดตั้งถูกจัดระเบียบใหม่เพื่อลดจำนวนสเต็ปและ boilerplate
npm i tailwindcss @tailwindcss/postcss- เพิ่ม
@tailwindcss/postcssเข้าไปในปลั๊กอิน PostCSS - ใช้
@import "tailwindcss"ในไฟล์ CSS
- ใน v4.0 สามารถนำ Tailwind มาใช้ได้ด้วย CSS เพียงบรรทัดเดียว แทนการใช้คำสั่ง
@tailwind - มีแนวทางแบบไม่ต้องตั้งค่า ที่เริ่มต้นใช้งานได้ทันทีโดยไม่ต้องกำหนดค่าใด ๆ แม้แต่พาธของไฟล์เทมเพลต
- มีการรวมกฎ
@importให้เองโดยไม่ต้องใช้ปลั๊กอินภายนอก และใช้ Lightning CSS ภายในสำหรับ vendor prefixing และการแปลงไวยากรณ์สมัยใหม่ - ผู้ใช้ Vite สามารถเลือกใช้
@tailwindcss/viteแทน PostCSS ได้- Tailwind CSS v4.0 เร็วอยู่แล้วแม้ใช้เป็นปลั๊กอิน PostCSS แต่ถ้าใช้ปลั๊กอิน Vite จะได้ประสิทธิภาพที่ดียิ่งขึ้น
การตรวจจับคอนเทนต์อัตโนมัติและ import ในตัว
- การตั้งค่าอาร์เรย์
contentที่จำเป็นใน v3 ถูกแทนที่ด้วย heuristic การตรวจจับอัตโนมัติ ใน v4.0 - รายการที่อยู่ใน
.gitignoreจะถูกละเว้นโดยอัตโนมัติ จึงไม่สแกน dependency หรือไฟล์ที่สร้างขึ้นซึ่งไม่ได้อยู่ภายใต้การจัดการเวอร์ชัน- ตัวอย่าง:
/node_modules,/coverage,/.next,/build
- ตัวอย่าง:
- นามสกุลไฟล์ไบนารีอย่างรูปภาพ วิดีโอ และ
.zipก็จะถูกละเว้นโดยอัตโนมัติเช่นกัน - เมื่อต้องการเพิ่มแหล่งข้อมูลที่ถูกยกเว้นโดยค่าเริ่มต้นอย่างชัดเจน สามารถใช้คำสั่ง
@sourceในไฟล์ CSS ได้@source "../node_modules/@my-company/ui-lib";@sourceใช้ heuristic แบบเดียวกัน จึงยังคงตัดไฟล์ไบนารีออกโดยไม่ต้องระบุนามสกุลเพิ่มเติม
- ก่อน v4.0 หากต้องการ inline ไฟล์ CSS อื่นผ่าน
@importจำเป็นต้องใช้ปลั๊กอินแยกอย่างpostcss-importแต่ตอนนี้ไม่ต้องมีเครื่องมืออื่นแล้วด้วย การรองรับ import ในตัว- ระบบ import นี้ถูกสร้างมาเฉพาะสำหรับ Tailwind CSS และผสานเข้ากับเอนจินโดยตรงจึงทำงานได้เร็วกว่า
การตั้งค่าแบบ CSS-first และ theme variables
- หนึ่งในการเปลี่ยนแปลงใหญ่ของ v4.0 คือการตั้งค่าโปรเจกต์โดยทำ ใน CSS โดยตรง แทน JavaScript
- แทนที่จะใช้ไฟล์
tailwind.config.jsสามารถปรับแต่งได้ด้วย@themeภายในไฟล์ CSS ที่ import Tailwind- ตั้งค่า design tokens
- นิยาม utility แบบกำหนดเอง
- นิยาม variant แบบกำหนดเอง
- design tokens ที่กำหนดใน
@themeจะถูกเปิดเผยเป็น CSS variables โดยอัตโนมัติ- ตัวอย่าง:
--font-display,--breakpoint-3xl,--color-avocado-500,--ease-fluid
- ตัวอย่าง:
- CSS variables ที่สร้างขึ้นแบบนี้สามารถอ้างอิงใน runtime ด้วย CSS ปกติได้
- นำ inline styles กลับมาใช้ซ้ำ
- ส่งให้ไลบรารีอย่าง Motion เพื่อใช้ทำแอนิเมชัน
ค่า utility และ variant แบบไดนามิก
- v4.0 ทำให้ utility และ variant หลายรายการรองรับค่าที่กำหนดเองเฉพาะจุดได้ง่ายขึ้นโดยไม่ต้องตั้งค่า
- Grid สามารถใช้ขนาดที่ต้องการได้โดยไม่ต้องตั้งค่าเพิ่มเติม
- ตัวอย่าง:
grid grid-cols-15
- ตัวอย่าง:
- custom boolean data attribute ก็สามารถ target ได้โดยไม่ต้องนิยามล่วงหน้า
- ตัวอย่าง:
data-current:opacity-100
- ตัวอย่าง:
- spacing utilities อย่าง
px-*,mt-*,w-*,h-*จะถูกคำนวณแบบไดนามิกจากตัวแปร spacing scale ตัวเดียว- ตัวอย่าง:
--spacing: 0.25rem w-17จะถูกสร้างในรูปแบบcalc(var(--spacing) * 17)
- ตัวอย่าง:
- เครื่องมืออัปเกรดที่เปิดตัวพร้อม v4.0 จะตรวจจับไวยากรณ์ค่ากำหนดเองที่ไม่จำเป็นแล้วทำให้เรียบง่ายลงให้อัตโนมัติเป็นส่วนใหญ่
พาเลตสีและ container queries
- พาเลตสีเริ่มต้นทั้งหมดถูกอัปเกรดจาก
rgbเป็นoklch- ทำให้ใช้ gamut ที่กว้างขึ้นนอกข้อจำกัดของ sRGB และได้สีที่สดขึ้น
- เนื่องจากพยายามรักษาสมดุลระหว่างสีให้ใกล้กับ v3 การอัปเกรดโปรเจกต์เดิมจึงไม่ควรรู้สึกเหมือนเป็น breaking change
- การรองรับ container queries ถูกนำเข้าเป็นฟีเจอร์หลักใน v4.0 ทำให้ไม่ต้องใช้ปลั๊กอิน
@tailwindcss/container-queries - มี variant ใหม่
@max-*สำหรับใช้ max-width container queries - สามารถซ้อน
@min-*และ@max-*เพื่อกำหนดช่วงของ container query ได้เหมือนกับ breakpoint variants ทั่วไป
ขยาย 3D transform และ Gradient API
- v4.0 เพิ่ม API สำหรับ 3D transform
rotate-x-*rotate-y-*scale-z-*translate-z-*
- ความสามารถด้าน gradient ก็ถูกขยายเช่นกัน ทำให้สร้างเอฟเฟกต์ที่หลากหลายขึ้นได้โดยไม่ต้องเขียน CSS เอง
- linear gradient สามารถรับค่ามุมได้โดยตรง
- ตัวอย่าง:
bg-linear-45 - เดิม
bg-gradient-*ถูกเปลี่ยนชื่อเป็นbg-linear-*
- ตัวอย่าง:
- โหมดการไล่สีของ gradient ควบคุมได้ผ่าน modifier
bg-linear-to-r/srgbbg-linear-to-r/oklch- ค่าปริยายของการไล่สีใน v4.0 คือ OKLAB และยังใช้ modifier สำหรับ color space อื่นได้
- มี utility ใหม่
bg-conic-*,bg-radial-*สำหรับสร้าง conic และ radial gradient- ใช้งานร่วมกับ
from-*,via-*,to-*เดิมได้ - รวมถึงรองรับค่ากำหนดเองสำหรับการควบคุมรายละเอียด เช่น วิธี interpolation ของสีและตำแหน่ง gradient
- ใช้งานร่วมกับ
variant และ utility ใหม่
- variant ใหม่
startingรองรับ CSS@starting-style- ทำให้สร้าง transition ของพร็อพเพอร์ตีได้ตอนที่องค์ประกอบแสดงขึ้นครั้งแรก
- สามารถทำแอนิเมชันให้กับองค์ประกอบที่ปรากฏบนหน้าได้โดยไม่ต้องใช้ JavaScript
- การรองรับของเบราว์เซอร์อาจยังไม่เพียงพอสำหรับหลายทีมในตอนนี้ แต่กำลังเข้าใกล้จุดนั้น
- variant ใหม่
not-*รองรับ CSS pseudo-class:not()- ตัวอย่าง:
not-hover:opacity-75 - ยังสามารถปฏิเสธ media query และ
@supportsquery ได้ด้วย
- ตัวอย่าง:
- v4.0 ยังเพิ่ม utility และ variant ต่อไปนี้
inset-shadow-*,inset-ring-*: ซ้อน box shadow ได้สูงสุด 4 เลเยอร์ในองค์ประกอบเดียวfield-sizing: รองรับการปรับขนาด textarea อัตโนมัติโดยไม่ต้องใช้ JavaScriptcolor-scheme: ช่วยลบ scrollbar สีสว่างใน dark modefont-stretch: ปรับ variable font ที่รองรับหลายความกว้างinert: สไตล์องค์ประกอบที่ไม่โต้ตอบซึ่งถูกระบุด้วยพร็อพเพอร์ตีinertnth-*: รองรับการจัดสไตล์ตระกูล nthin-*: ทำงานคล้ายgroup-*โดยไม่ต้องมีคลาสgroup:popover-open: ใช้ target popover ที่เปิดอยู่ได้ผ่าน variantopenเดิม- descendant variant: ใช้จัดสไตล์องค์ประกอบลูกทั้งหมด
การเริ่มต้นและเส้นทางอัปเกรด
- สำหรับโปรเจกต์ใหม่ สามารถใช้ Tailwind CSS v4.0 ได้ตาม เอกสารการติดตั้ง
- หากต้องการทดลองในเบราว์เซอร์ทันที สามารถใช้ Tailwind Play
- สำหรับโปรเจกต์เดิม มีทั้ง คู่มืออัปเกรด และ เครื่องมืออัปเกรดอัตโนมัติ ให้ใช้งาน
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
ครั้งหนึ่งเคยวิจารณ์ข้อบกพร่องหลายอย่างของ Tailwind และความไม่เข้ากันกับแนวทางเว็บ “บริสุทธิ์” สมัยใหม่อย่างรุนแรง แต่ ความก้าวหน้าครั้งใหญ่ใน v4 นั้นน่ายินดีมาก
การที่สามารถเข้าถึงธีมของ Tailwind ได้ในรูปแบบตัวแปร CSS แบบเนทีฟ และในเอกสารยังมีตัวอย่างคอมโพเนนต์ปุ่มที่เขียนด้วยตัวแปรเนทีฟในสไตล์ชีตภายนอก ถือเป็นการเปลี่ยนแปลงครั้งใหญ่มาก
การที่สามารถ ตั้งค่าด้วย CSS ล้วน ๆ ได้ก็ดีเยี่ยม และตอนนี้ Tailwind ให้ความรู้สึกเหมือนยูทิลิตีที่เพิ่มเข้าไปในโปรเจกต์ใดก็ได้ มากกว่าจะเป็นเฟรมเวิร์กแบบ JavaScript ที่ “แพร่กระจาย” จนกลืนสถาปัตยกรรมที่สมเหตุสมผล
ไม่ว่าคำวิจารณ์ในช่วงหลายปีที่ผ่านมาจะได้ผล หรือพวกเขาจะได้ข้อสรุปที่ดีด้วยตัวเองก็ตาม ข้อถกเถียงจำนวนมากระหว่างฝ่ายสนับสนุนและคัดค้าน Tailwind ตอนนี้ดูจะเกี่ยวข้องน้อยลงแล้ว และนั่นเป็นเรื่องดีมาก ตอนนี้จึงโฟกัสกับการสร้างผลิตภัณฑ์ได้
เพราะสามารถแสดงอะไรก็ได้อย่างเป็นระบบ จึงทำงานได้ดีจริง ๆ และมีบางอย่างที่มีประโยชน์มากอยู่ในนั้น
อย่างแรก วิศวกร JavaScript/Tailwind เข้ามาครอบงำการถกเถียงด้านดีไซน์ไปแล้ว แทนที่จะโฟกัสกับ “utility-first”, “การลบโค้ดที่ไม่ได้ใช้”, “CSS ที่ type-safe” ควรโฟกัสกับระบบดีไซน์มากกว่า เช่น ในงานไทโปกราฟีจะใช้ Perfect Fifth หรือ Perfect Fourth
อย่างที่สอง Tailwind ทำให้การมีส่วนร่วมในกระบวนการผลิตจริงเป็นเรื่องยาก การตัดสินใจด้านดีไซน์ถูกฝังอยู่ในนิพจน์คอมโพเนนต์ React ที่อ่านยากอย่าง
flex items-center shadow-lg p-6 hover:bg-gray-50 dark:bg-gray-800 py-[calc(theme(spacing[2.5])-1px)]สำหรับวิศวกร JavaScript อาจเข้าใจได้ แต่สำหรับดีไซน์ที่เป็นระบบ มันกลายเป็นกำแพง แทนที่จะใช้ CSS แสดงความสัมพันธ์ทางคณิตศาสตร์ที่แม่นยำ กลับกลายเป็นการใช้ inline style ที่สะดวกกว่า
CSS ใช้ง่ายกว่าเดิมมาก และเบราว์เซอร์ส่วนใหญ่ตอนนี้ก็ทำงานสอดคล้องกันแล้ว
ไม่มีขั้นตอน build และไม่ทำให้มาร์กอัปเลอะเทอะด้วยโค้ดที่มากเกินไป จึงคุ้มค่าที่จะเรียนรู้
จะเขียนแอตทริบิวต์
styleลงใน HTML โดยตรงก็ได้ ซึ่งเมื่อก่อนหลีกเลี่ยงกันเพื่อแยก concerns ออกจากกัน แต่ก็สงสัยว่าทำไมถึงอยากนำแนวทางคล้าย ๆ กันกลับมาใช้อีก หรือแค่ต้องการลดตัวอักษรลงไม่กี่ตัวกันแน่แอตทริบิวต์
styleดูจะเข้าใจง่ายกว่าด้วยซ้ำ เพราะไม่ต้องแปลงโค้ดในหัว เลยยังไม่ค่อยเห็นเสน่ห์ของมันstyleไม่ได้ เช่น pseudo-class:hover,:focus, pseudo-element::before,::after, media query, keyframe และ animationประสบการณ์นักพัฒนาในโปรเจกต์ใหญ่ก็ไม่ดีนัก
ในทางกลับกัน
@scopeซึ่งกำลังจะกลายเป็นมาตรฐาน เป็นฟีเจอร์เสริมที่ดีสำหรับการวางสไตล์ไว้ใกล้กับจุดใช้งาน: https://developer.mozilla.org/en-US/docs/Web/CSS/@scopeabstraction ของคอมโพเนนต์ช่วยแยกความหมายกับสไตล์ออกจากกันได้แน่นขึ้น ในทั้งสองกรณีต้องหา abstraction อย่าง “hero” เหมือนกัน แต่ในโลกของคอมโพเนนต์ ไม่ได้ abstraction แค่สไตล์ แต่รวมถึงชื่อแท็ก HTML ด้วย
ไม่ว่าจะทางไหน “รายละเอียดด้านสไตล์” ก็ถูกแยกออกจาก “คอนเทนต์” ซึ่งเป็นไฟล์ซอร์สของหน้าอยู่แล้ว เพื่อ separation of concerns หรือการแยกคอนเทนต์กับการนำเสนอให้ดียิ่งขึ้น การยอมรับขั้นตอน build ก็เป็นสิ่งที่ทำได้
ยังลดความจำเป็นในการดูแลไฟล์แยก และการลบคอมโพเนนต์ที่ไม่ได้ใช้ออกไปด้วย
สามารถใช้ media query ที่แท็ก
styleทำไม่ได้ และไม่มีความเสี่ยงที่จะไปแก้ class ที่ใช้ในที่อื่นโดยไม่ตั้งใจ global scope ของ CSS มีข้อดี แต่ก็อันตรายสไตล์ถูกมองว่าเป็นของคอมโพเนนต์ ไม่ใช่ของระบบดีไซน์ ใน ecosystem วิศวกรรมที่ให้ JavaScript มาก่อน ยังต้องการ บริษัทที่ขับเคลื่อนด้วยดีไซน์ ซึ่งเข้าใจพลังของ CSS สมัยใหม่และดีไซน์ที่เป็นระบบมากกว่านี้
แนวทาง
.cssปกติทำให้เกิดชื่อแปลก ๆ การซ้ำซ้อน และความเป็นไปได้ที่จะชนกันcss modulesก็เป็นตัวเลือกหนึ่ง แต่จำนวนไฟล์ต่อคอมโพเนนต์/หน้าจะเพิ่มขึ้นเป็นสองเท่าโดยแทบจะเป็นเช่นนั้นจริง ๆsassหรือlessให้ความรู้สึกเหมือนเอาปัญหาของcss modulesกับ.cssปกติมารวมกันไม่ได้ชอบหรือเกลียด Tailwind โดยเนื้อแท้ และตอนแรกก็เกลียดมาก แต่ในโปรเจกต์ที่มีคอมโพเนนต์และหน้ารวมกัน มากกว่า 200 ไฟล์ ก็รู้สึกได้ถึงคุณค่าของมัน
ปฏิกิริยาแรกต่อ Tailwind คือ “น่ารำคาญ” รู้สึกเหมือนว่าทั้งที่รู้ CSS อยู่แล้ว แต่ตอนนี้ต้องมาเรียน CSS ใหม่อีกครั้ง
คล้ายกับสถานการณ์ที่พ่อแม่พยายามช่วยลูกทำการบ้านคณิตศาสตร์ แต่แนวทางที่สอนในโรงเรียนต่างจากสมัยก่อนอย่างสิ้นเชิง วิธีแก้โจทย์ของตัวเองยังถูกต้องอยู่ แต่ไม่ถูกยอมรับ และลูกก็หงุดหงิดเพราะต้องปรับสองระบบให้ตรงกัน
เข้าใจบรรยากาศที่ว่าในทีมมันทำงานได้ดีและขยายได้ดี ก็เลยต้องใช้ไป และเคยมีประสบการณ์แบบนั้นมาแล้ว
ถึงอย่างนั้นก็ยังชอบ สไตล์ชีตธรรมดา ที่กำหนดเป้าหมายด้วยคลาสหรือแท็กมากกว่า โดยเฉพาะตอนนี้ที่ CSS รองรับ nested selector แล้วก็ยิ่งเป็นแบบนั้น
ปัญหาเรื่องการจัดการสไตล์ชีตมีอยู่จริง และชอบแนวทางแบบ Remix/React Router ที่กำหนดและใช้ไฟล์ CSS ในระดับ route ถ้าแค่นั้นไม่พอ หรือสไตล์แบบไดนามิกซับซ้อนเกินไปสำหรับไฟล์
.cssก็ยังใช้style={{...}}ได้เสมอCSS ทรงพลัง ยืดหยุ่น และขยายได้ จึงรู้สึกว่า Tailwind เป็นข้อจำกัดมากกว่าการปรับปรุง ไม่ค่อยเข้าใจว่าทำไมยังได้รับความนิยมต่อเนื่อง แต่คิดว่าอีก 3–4 ปี ทุกคนก็คงย้ายไปใช้อย่างอื่นกันอีก
แต่พอได้มีส่วนร่วมในโปรเจกต์โอเพนซอร์สที่ใช้ Tailwind ก็เริ่มคุ้นเคย และตอนนี้รู้สึกต่างออกไป
โดยพื้นฐานแล้ว Tailwind ใกล้เคียงกับ ชวเลข ของ
style={{…}}สิ่งที่ถ้าเขียนในไฟล์.cssหรือ style object ต้องใช้หลายบรรทัด ยูทิลิตีเดียวจบได้ในราว 15 ตัวอักษรเวลาที่ใช้ค้นหาอะไรอย่าง “visual text replacement css” หรือเปิด CSS cheat sheet กับบทความ CSS-Tricks เมื่อ 8 ปีก่อนลดลงมาก แทนที่จะทำแบบนั้น ก็ดูเอกสาร Tailwind อยู่เสมอและหาคลาสยูทิลิตีที่ทำสิ่งที่ต้องการได้เร็ว
หลายอย่างเข้าไปอยู่ในแคชในหัวได้มากจนน่าประหลาดใจ และรู้สึกว่าดีกว่าการพยายามจำ CSS ทั้งหมดที่จำเป็นสำหรับงาน layout มาก
ไม่ต้องไปแตะ CSS แยกต่างหาก และสไตล์ก็อยู่บนองค์ประกอบที่ถูกใช้สไตล์นั้นทันที จึงไม่ต้องเทียบไปเทียบมา
จริง ๆ ใช้แค่แอตทริบิวต์
cssก็ทำได้ แต่ปัญหาคือทุกคนถูกสอนมาว่านั่นเป็นวิธีที่ผิด และรายการสตริงที่มียูทิลิตีหลายตัวก็ใช้ง่ายกว่าการใช้ CSS object ล้วน ๆ ด้วยมันเป็น wrapper แบบโมดูลาร์ที่ประกอบกันได้และเป็นมาตรฐาน วางอยู่บนระบบขนาดใหญ่และซับซ้อน จึงถือเป็นความก้าวหน้าครั้งใหญ่
ในทางกลับกัน บนโซเชียลมีเดียมีโพสต์ที่เอาการคูณกับการหารมาปนกันแล้วบอกว่าคำตอบมีเพียงคำตอบเดียว Tailwind ไม่ได้แย่ถึงขนาดนั้น แต่ในฐานะคนแก่ มันดูใกล้ทิศทางนั้นมากกว่า
ชอบ Tailwind ใช้มันใน 3 โปรเจกต์ตลอด 4 ปีที่ผ่านมา รู้สึกว่าใช้งานเป็นธรรมชาติ เอกสารดี และเรียบง่าย
ไม่คิดถึงยุค emotion กับ styled-components ที่ต้องตั้งชื่อให้
divทุกตัวที่มีสไตล์ในโปรเจกต์ใน Tailwind คอนเทนเนอร์ก็เป็นแค่
divกับคลาสไม่กี่ตัวเท่านั้น การถกเถียงเรื่องการตั้งชื่อ ลดลง และสมองกับเวลารีวิวที่เสียไปกับการตั้งชื่อลดลงdivทุกตัวอยู่บ่อย ๆ แล้วก็แปลกใจนิดหน่อยแทบไม่เคยคิดเกิน 1 วินาทีเพื่อจะตั้งชื่ออะไรสักอย่างเลย สำหรับบางคนมันเป็นจุดที่ติดขัดจริง ๆ หรือ? อยากรู้ว่ามันทำให้ชะงักจนไปต่อไม่ได้จริงหรือไม่
คนที่ผมเจอมักจะกำหนดรายละเอียดทุกอย่างเท่าที่จะเป็นไปได้แบบไม่มีที่สิ้นสุด ปฏิบัติกับเว็บฟอร์มเหมือนเป็นรายการรีโนเวตบ้านส่วนตัวทาง HGTV
ตอนลองใช้ Tailwind ครั้งหนึ่ง จำนวนคลาสมากกว่ามาร์กอัปเป็นหลักหนึ่ง และไม่นานก็อ่านยาก
ตอนนี้พอใจกับ workflow แบบ CSS-in-JS เป็นการเขียน CSS แบบเดิมโดยมี LLM ช่วย แสดงรูปให้ LLM ดูแล้วขอคอมโพเนนต์ ก็ได้ออกมาทันทีพร้อมชื่อที่เหมาะสม
การทำสไตล์ใน React ไม่ค่อยดี และถึงใช้ Tailwind ก็เป็นแค่ตัวเลือกที่แย่น้อยลงเท่านั้น
ถ้าใช้ frontend framework กับขั้นตอน build แล้ว Svelte กับ Astro ก็ดีตามแต่กรณีใช้งาน สามารถทำสไตล์ด้วย CSS ธรรมดาได้ และถ้าคงคอมโพเนนต์ให้เล็ก ก็แทบไม่ต้องใช้ชื่อคลาส
ใช้ element selector แล้วให้ framework จัด scope ของสไตล์ตอน build ก็พอ
เคยลองใช้ Tailwind กับไซต์ของตัวเองและค่อนข้างชอบ แต่อาจไม่ใช่ด้วยเหตุผลที่มักพูดกัน
คุณค่าที่แท้จริงของ Tailwind คือการที่สามารถอ่าน สไตล์ทั้งหมดที่มีผลต่อองค์ประกอบหนึ่งได้ในที่เดียว
ชื่อคลาสอาจยาวได้ แต่การอ่านบรรทัดยาว ๆ หนึ่งบรรทัดเร็วกว่าการต้องเปิด browser developer tools ทุกครั้ง หรือเลื่อนขึ้นลงไปมาระหว่างสไตล์ชีตหนึ่งไฟล์หรือมากกว่านั้นมาก
ภายหลังกลับมาที่โค้ดนั้นก็แก้ได้อย่างมั่นใจโดยไม่ต้องกังวลว่าจะไปเปลี่ยนองค์ประกอบอื่น
ธรรมชาติแบบ cascading ของ CSS ยังมีประโยชน์อยู่ แต่โดยปกติแล้วอยากจำกัดสไตล์ไว้กับองค์ประกอบเดียว ส่วนที่เหลือก็กลับไปใช้ CSS แต่ CSS ที่เขียนจริง ๆ มีน้อยมาก ส่วนใหญ่ก็แค่อยากจัดระยะห่างให้พอดี
ชอบตรงที่ “จะทำ X ยังไง?” ไม่ได้กลายเป็นงานค้นคว้า 30 นาที แต่จบด้วยการค้นเอกสารอย่างรวดเร็ว
ชิ้นส่วน Tailwind ในโพสต์ HN นี้ดูค่อนข้างน่ากลัวเมื่อเทียบกับสิ่งนั้น
ถ้าเพิ่ม
text-xlให้divแล้วข้างในมีdivกับspanซ้อนอยู่ ทั้งหมดจะสืบทอดtext-xlดังนั้นถ้าจะดูว่าอะไรทำให้เกิดtext-xlในองค์ประกอบที่ซ้อนอยู่ สุดท้ายก็ยังต้องไล่ย้อนขึ้นไปตาม ลำดับชั้นขององค์ประกอบถึงอย่างนั้น โดยรวมก็ง่ายขึ้นเล็กน้อย
วลีอย่าง “เวลาบิลด์สั้นลง”, “ไม่มี directive
@tailwindอีกต่อไป”, “ไม่มีการตั้งค่าด้วย JavaScript”, “ออกแบบมาเพื่อเว็บสมัยใหม่” ฟังดูเหมือนว่าตอนนี้ CSS ทำทุกอย่างที่เราเคยทำเองได้แล้ว แต่เราก็ยังแสร้งกันต่อไปว่าเรายังจำเป็นอยู่
styleและปรับให้เหมาะสมได้ง่ายกว่ามาก”Tailwind ก็แทบจะแมปกับ CSS แบบ 1:1 ไม่ใช่หรือ?
เข้าใจได้ว่าไม่ชอบ Tailwind แต่คิดว่าควรพูดว่าชอบหรือไม่ชอบอะไรใน Tailwind มากกว่าจะตั้งหุ่นฟางขึ้นมาโจมตี
การดูถูกโปรเจกต์โอเพนซอร์สของคนอื่นและคนที่ใช้มันอย่างเป็นประโยชน์ก็ไม่ดีเหมือนกัน
อยากถามคนที่รู้ CSS ดี ๆ ผมไม่ค่อยรู้
กำลังอัปโปรเจกต์ Phoenix ส่วนตัวเป็น 1.7 และเห็นว่า Phoenix ตอนนี้ใช้ Tailwind เป็นค่าเริ่มต้น เลยคิดว่าจะลองใช้แทน Bootstrap
จนถึงตอนนี้เวอร์ชัน Bootstrap ดู “พอใช้ได้” แต่เวอร์ชัน Tailwind ดูเละเทะมาก
วิธีที่ง่ายที่สุดในการได้ค่าเริ่มต้นที่ดูดี โดยไม่ต้องพยายามเป็นดีไซเนอร์คืออะไร? หรือควรแค่ติดตั้ง Bootstrap กลับไปแล้วจบ?
Tailwind ให้เครื่องมือเมื่อคุณอยากควบคุมดีไซน์ แต่สุดท้ายคุณก็ต้อง ควบคุมดีไซน์เอง
ถ้าแค่อยากให้ดูดีและกลิ่นอายแบบ Bootstrap ก็รับได้ Bootstrap นั่นแหละเหมาะกว่า
ตามทฤษฎีมีโปรเจกต์ที่นำ Bootstrap มาสร้างใหม่บน Tailwind ซึ่งน่าจะให้จุดเริ่มต้นแบบ Bootstrap พร้อมพลังของ Tailwind ได้ แต่ในทางปฏิบัติผมยังไม่เห็นอะไรที่ทำงานได้ดีกว่าการใช้ Bootstrap ตรง ๆ
เอกสาร DaisyUI อยู่ที่นี่: https://daisyui.com
Tailwind ก็มีคอมโพเนนต์แบบเสียเงินด้วย แค่คัดลอกแล้ววางก็ใช้ได้ ข้อดีคือพอคุ้นแล้วคุณสามารถค่อย ๆ แก้คอมโพเนนต์ของ Flowbite ได้
ถ้ามีความมั่นคงในงานและอยากลองจับนู่นนี่ ก็เล่นกับ Tailwind ได้ คนที่ตามกระแสไวและเสียงดังส่วนใหญ่ดูเหมือนจะชอบ Tailwind
แต่ถ้าเป็นโปรเจกต์ของตัวเอง ใช้เงินตัวเอง หรือมีเดดไลน์ ก็ควรใช้ Bootstrap ที่รู้อยู่แล้ว และโฟกัสกับการทำงานให้เสร็จมากกว่ามาสู้สงครามยืดเยื้อกับ UI
Tailwind ให้ชุดคลาสที่ต้องนำมาซ้อนกันเพื่อสร้างคอมโพเนนต์
ถ้าใช้ซอร์สของ UI component ร่วมด้วยก็น่าจะง่ายขึ้น เมื่อก่อนเคยใช้ TailwindUI แต่เป็นแบบเสียเงิน และคิดว่าน่าจะมีทางเลือกฟรีดี ๆ อยู่เหมือนกัน
บทสนทนาเรื่อง “Tailwind หรือไม่ Tailwind” มีแพตเทิร์นชัดเจน มันเกิดซ้ำทุกครั้งที่มีการพูดถึง Tailwind
มีคนที่ไม่เคยใช้จริงจังเกิน 30 นาที แค่ลองนิดหน่อยหรืออ่านเอกสารผ่าน ๆ คนกลุ่มนี้ไม่ชอบ Tailwind และชอบอะไรอย่าง “CSS ล้วน” มากกว่า
ในทางกลับกัน มีคนที่เคยใช้ในโปรเจกต์จริง ภายในทีมที่มีมากกว่าหนึ่งคน คนกลุ่มนี้เข้าใจคุณค่า ยอมรับ trade-off และชอบมัน
ผมเห็นคนย้ายจากกลุ่มแรกไปกลุ่มที่สองเยอะ แต่แทบไม่เคยเห็นคนจากกลุ่มที่สองกลับไปกลุ่มแรก
นั่นแหละคือเหตุผลที่ Tailwind ประสบความสำเร็จ มันอาจไม่สวยในสายตานักบริสุทธิ์นิยม แต่ในสายตาคนสร้างของและนักปฏิบัตินิยม มันยอดเยี่ยมจริง ๆ
ไม่ได้ต่อต้าน Tailwind แต่เหตุผลที่ยังไม่ได้ลองใช้คือยังไม่เห็นชัดว่ามันเป็นแนวทางที่ดีกว่าทางเลือกอื่นอย่าง Web Components หรือ React Styled Components อย่างไร
ปัญหาใหญ่ที่สุดคือ Tailwind ทำให้ HTML รกไปด้วย utility class จำนวนมาก จนอ่านและดูแลรักษายาก
ผมรู้ว่ามันดีกว่าไฟล์ CSS global ขนาดมหึมาและ CSS แบบคลาสสิกที่อิงชื่อแท็ก แต่ก็มีวิธีใช้ CSS ที่ scope อยู่กับคอมโพเนนต์ โดยไม่ทำให้ namespace ส่วนกลางปนเปื้อนอยู่แล้ว เช่น Web Components และ Styled Components
ทั้งสองแบบผูกสไตล์ไว้กับคอมโพเนนต์ หรือโดยทั่วไปก็คือชุดของแท็ก HTML เฉพาะ ทำให้ดูได้ง่ายว่าสไตล์ไหนถูกใช้ที่ไหน
ไม่ต้องมีชื่อคลาส global และลดความกังวลเรื่องผลข้างเคียงหรือการชนกันโดยไม่ตั้งใจ เมื่อลบคอมโพเนนต์ สไตล์ที่เกี่ยวข้องก็ถูกลบไปด้วย จึงไม่ต้องกังวลว่าจะมี CSS ที่ไม่ได้ใช้หลงเหลืออยู่ ด้วย shadow DOM ก็ไม่มีความเสี่ยงที่สไตล์ของคอมโพเนนต์หนึ่งจะไปกระทบอีกคอมโพเนนต์โดยไม่ตั้งใจ
ผมให้ความสำคัญกับการรักษา HTML ให้สั้นและอ่านง่าย โดยไม่ผสมสไตล์เพื่อการแสดงผลเข้าไปในมาร์กอัปโดยตรง ถ้าสไตล์ทั้งหมดอยู่ในแอตทริบิวต์
classแบบ Tailwind ก็จะเกิดลิสต์คลาสยาว ๆ ในบรรทัดเดียว และถ้าต้องใส่ชื่อคลาสจริงร่วมด้วย HTML ก็จะรกมองแวบเดียวก็ยากที่จะรู้ว่ามีสไตล์อะไรถูกใช้ และจัด indentation ให้ดี ๆ ก็ยากด้วย มันทำให้นึกถึงหลายเหตุผลที่เราเคยเลิกใช้แอตทริบิวต์
styleแบบ inline ใน HTMLไม่ได้เกลียด Tailwind แต่ในแง่ความอ่านง่าย การดูแลรักษา และการแยกความรับผิดชอบ ยังไม่เห็นข้อได้เปรียบที่ชัดเจนเหนือ Web Components หรือ Styled Components และยังมีข้อกังวลใหญ่ ๆ ที่ยังไม่ได้คำตอบ
อ่านเอกสารแล้วแต่ยังไม่เคยใช้ และยังเข้าใจยากว่าทำไมถึงควรเลือก Tailwind แทนทางเลือกอื่น การที่มีคลาสจำนวนมหาศาลอยู่กลาง HTML ธรรมดา ทำให้สำหรับผมแล้วทั้งสองอย่างอ่านยาก
ยอมรับว่ามีคนที่ใช้ Tailwind ได้อย่างมีประโยชน์และทำงานได้มีประสิทธิภาพ แต่ตอนนี้ Tailwind อยู่แทบทุกที่ จึงเห็น หน้าตาที่ดูสะอาดแต่พบได้ทั่วไป โผล่อยู่หลายแห่ง
โดยทั่วไป Tailwind ไม่ได้มีอิทธิพลต่อสไตล์มากกว่า CSS ปกติเท่าไรนัก มีข้อยกเว้นอยู่บ้าง เช่น เงาที่ค่อนข้างถูกทำให้เป็นมาตรฐานมากขึ้น และพาเลตสี indigo ที่ช่วงหลังส่งอิทธิพลออกไปภายนอกด้วย
แค่ผู้คนมักออกแบบไซต์ไปในแนวทางหนึ่งเท่านั้น โดยเฉพาะเมื่อใช้ร่วมกับ ShadCn
มองคล้ายกับที่ Inter ถูกใช้เป็นฟอนต์เว็บไซต์เหมือน Helvetica ยุคใหม่ ถ้ามีคนจำนวนมากใช้และมันดูดี ก็ไม่เห็นเหตุผลว่าทำไมถึงไม่ควรใช้
Bootstrap มี utility class จำนวนมากมาตั้งแต่นานก่อน Tailwind และช่วยประหยัดเวลาได้มาก โดยไม่ได้บังคับหน้าตาเฉพาะแบบใดแบบหนึ่ง
แค่เรียกใช้เฉพาะคลาสที่ต้องการก็พอ แน่นอนว่าถ้าไม่ได้ดาวน์โหลดไฟล์ซอร์ส Sass มาก็เป็นอีกเรื่องหนึ่ง แต่นั่นคงเป็นการเลือกที่โง่เขลา
ดังนั้นโปรเจกต์ส่วนใหญ่จึงใช้เฟรมเวิร์กเพียงไม่กี่ตัว ถ้ามีโปรเจกต์ UI คุณภาพดีเพิ่มอีกสัก 4–5 ตัว โดยเฉพาะที่มีทิศทางสไตล์แตกต่างกันมากขึ้น ความหลากหลายก็น่าจะเพิ่มขึ้น
ดีไซน์ก็เหมือนงานสร้างสรรค์หลายอย่าง ที่คนจำนวนน้อยอย่างน่าประหลาดเป็นผู้กำหนดกระแส
อยากให้คนรู้เรื่องนี้มากขึ้น คิดว่าอาจมีคนมีพรสวรรค์ที่ไม่ลงมือทำเพราะคิดว่า “ต่อให้ฉันทำ ก็ไม่มีใครฟัง”
แต่ถ้าคนเหล่านั้นบางส่วนลองลงมือ ผมเชื่อว่าอาจเปิดทางให้ UI ใหม่ ๆ กับส่วนใหญ่ของเว็บได้
Tailwind เป็นหลักฐานที่แสดงให้เห็น ข้อดีของ inline style นั่นคือวิธีสไตลิงบางสิ่งโดยไม่ต้องตั้งชื่อ ความเป็นสากลของสตริง และข้อจำกัดของสตริง
ผมตั้งตารอสิ่งที่จะตามมาหลังจากนี้ และระหว่างนั้นก็คงจะใช้ Tailwind ไปแบบไม่ค่อยเต็มใจ