สิ่งที่ควรรู้ใน CSS ยุคใหม่ล่าสุดปี 2025
(frontendmasters.com)- รายการสรุป ฟีเจอร์ CSS/HTML ที่เพิ่งเพิ่มเข้ามาหรือขยายการรองรับในปีนี้ จากมุมมองการใช้งานจริง ครอบคลุมตั้งแต่การเปลี่ยนผ่าน UI, ฟอร์ม, ตัวอักษร ไปจนถึง CSS เชิงฟังก์ชัน
- ฟีเจอร์ใหม่ที่เป็นแกนหลัก ได้แก่ การเปลี่ยนขนาดไปยังคีย์เวิร์ดอย่าง
auto, HTMLpopover/invoker, CSS@function·if()โดยหลายอย่างยังรองรับใน Chrome ก่อน จึงจำเป็นต้องใช้กลยุทธ์ Progressive Enhancement - ฟีเจอร์อย่าง
field-sizingสำหรับขยายช่องกรอกอัตโนมัติ, Custom Select,text-wrap: balance/pretty,linear()easing,shape()path ช่วยยกระดับคุณภาพด้านภาพลักษณ์และการใช้งานได้ง่าย - มีเครื่องมือควบคุมค่าและโฟลว์เพิ่มขึ้น เช่น
attr()ที่ทรงพลังขึ้น,reading-flowสำหรับควบคุมลำดับการอ่าน,calc-size()ทำให้ขอบเขตของการออกแบบที่จัดการได้ด้วย CSS เพียงอย่างเดียวกว้างขึ้น - ควรจับตา Masonry,
random(),margin-trim, ส่วนขยายของ View Transitions ที่ยังอยู่ระหว่างมาตรฐานและการรองรับ ขณะที่ Container Queries,:has(), dvh เป็นต้น ได้กลายเป็นทักษะพื้นฐานในการทำงานจริงแล้ว
Animate to Auto
- ฟีเจอร์สำหรับทำ การเปลี่ยนผ่านแบบลื่นไหล ระหว่าง ค่าคงที่ ↔︎
autoในองค์ประกอบที่มีความสูงของคอนเทนต์ไม่แน่นอน- หากประกาศ
interpolate-size: allow-keywordsไว้แบบ global จะอนุญาตการเปลี่ยนผ่านอย่างheight: 0 → auto - หรือจะใช้
calc-size()โดยไม่ต้องพึ่งinterpolate-sizeเพื่อทำ transition ด้วยheight: calc-size(auto, size)
- หากประกาศ
- ข้อดี คือช่วยเลิกใช้วิธีแก้ชั่วคราวแบบ
max-heightหรือทางเลือกที่เปราะบางอย่าง วัดนอกจอ + JS animation พร้อมคง เลย์เอาต์ตามธรรมชาติ เอาไว้ - สถานะการรองรับ ปัจจุบันเน้นที่ Chrome และเพราะแอนิเมชันเป็นสิ่งที่ มีก็ดี จึงเหมาะกับการใช้แบบ PE(Progressive Enhancement)
Popovers & Invokers
- แอตทริบิวต์
popoverเป็นฟีเจอร์ HTML ที่เพิ่มพฤติกรรม เปิด/ปิด และ JS API ที่เกี่ยวข้องให้กับองค์ประกอบใดก็ได้ โดยจัดอยู่ในกลุ่ม overlay แบบเบา ที่ต่างจาก modal- หากใช้ Invoker attribute จะควบคุมได้แบบประกาศตรง ๆ โดยไม่ต้องใช้ JS
- ความสำคัญ คือมี การเข้าถึง, คีย์บอร์ด, การจัดการโฟกัส ฯลฯ มาให้ในระดับ HTML โดยค่าเริ่มต้น ลดความเสี่ยงจากการพลาดตอนพัฒนา
- การรองรับ ของ Popover นั้น กว้างขวาง ส่วน Invoker ยัง นำโดย Chrome และมีความต่างกันในรายละเอียดอย่าง
popover="hint"- มี Polyfill ให้ จึงสามารถนำไปใช้กับ UX สำคัญได้
@function
- นำ ฟังก์ชันที่ผู้ใช้กำหนดเอง เข้าสู่ระบบฟังก์ชันค่าของ CSS ทำให้สามารถนามธรรม ตรรกะที่ใช้ร่วมกัน ได้ในรูปแบบ
@function --foo(--x) { result: ... } - ช่วย ลดความซ้ำซ้อน (DRY) และทำให้ส่วนประกาศเรียบง่ายขึ้น ส่งผลให้ อ่านง่ายและบำรุงรักษาง่ายขึ้น
- การรองรับ ยัง นำโดย Chrome และถ้าเหมาะสมสามารถใช้ graceful fallback โดยเขียน
property: fallbackแล้วตามด้วยproperty: --func()ในบรรทัดถัดไป- ควรระวังว่า ไม่เข้ากัน กับ Sass function
if()
- ฟังก์ชันแตกแขนง ระดับค่า ตัวแรกของ CSS สามารถเรียงเงื่อนไข
media()·supports()·style()เหมือน switch statement แล้ว คืนค่าที่ตรงเงื่อนไขแรก- ตัวอย่าง: เขียน
grid-template-columnsตาม breakpoint ต่าง ๆ ได้ด้วย ประกาศเดียว
- ตัวอย่าง: เขียน
- ผลลัพธ์ คือ เพิ่มความอ่านง่าย และ ลดการเขียนซ้ำ อีกทั้งยังทำงานร่วมกับ
@functionแบบกำหนดเองได้ดี - การรองรับ ยัง นำโดย Chrome จึงแนะนำให้ประกาศค่าฟอลแบ็กก่อนตามรูปแบบ PE
field-sizing
- แนะนำพร็อพเพอร์ตี
field-sizingที่ทำให้ ช่องกรอก/แก้ไขขยายอัตโนมัติตามเนื้อหา- กรณีเด่นคือ การขยายความสูงอัตโนมัติ ของ
<textarea>และยังประยุกต์ใช้กับ UX การปรับขนาดแบบอินไลน์ได้
- กรณีเด่นคือ การขยายความสูงอัตโนมัติ ของ
- การรองรับ คือ Chrome และ Safari มีแผนนำมาใช้ โดยหากจำเป็นสามารถแทนด้วย JS ขนาดเบา ได้
- เพราะเป็นการปรับปรุง UX มากกว่าฟังก์ชันจำเป็น จึงเหมาะกับการนำมาใช้แบบค่อยเป็นค่อยไป
Custom Selects
- รองรับการ ปรับแต่งได้เต็มรูปแบบ ไม่ใช่แค่หน้าตาของ
selectแต่รวมถึง UI ตัวเลือกที่เปิดออกมา ด้วย ผ่านการ opt-in แบบชัดเจน - มี PE ที่ดีมาก เพราะในสภาพแวดล้อมที่ไม่รองรับจะ fallback กลับเป็น
<select>มาตรฐาน อย่างปลอดภัย - การรองรับ ยัง นำโดย Chrome และสามารถขยายพื้นที่ควบคุมได้ด้วย
appearance: base-selectและ::picker(select)
text-wrap
text-wrap: balanceช่วย ปรับสมดุลความยาวบรรทัด สำหรับข้อความตัวใหญ่ เช่น หัวเรื่อง ส่วนtext-wrap: prettyช่วยปรับปรุง widow line และความสวยงาม ในเนื้อความด้วย- ผลลัพธ์ คือ อ่านง่ายขึ้นและคุณภาพงานตัวอักษรดีขึ้น ซึ่ง เห็นผลได้ทันทีโดยแทบไม่มีต้นทุน
- การรองรับ ของ
balanceนั้น กว้างขวาง ส่วนprettyยัง นำโดย Chrome·Safari และเหมาะกับ PE
linear() easing
- ต่างจากคีย์เวิร์ด
linear, ฟังก์ชันlinear()สามารถกำหนด easing curve อย่างละเอียด ด้วย จำนวนจุดตามต้องการ จึงเหมาะกับการสร้างพฤติกรรมซับซ้อนอย่าง bounce - ขณะที่
cubic-bezier()ซึ่งเป็น ทางเลือก มีข้อจำกัดlinear()ให้ การควบคุมจังหวะเวลาอย่างละเอียด และตอนนี้ รองรับครบแล้ว - หากจำเป็นก็สามารถทำ fallback ด้วย named easing หรือ
cubic-bezier()ได้
shape()
- ฟังก์ชัน
shape()เข้ามาเสริมข้อจำกัดของpath()แบบเดิมที่ ใช้ได้เฉพาะพิกเซลและมีไวยากรณ์เข้าใจยาก โดยเปิดให้ใช้ responsive unit และ custom property เพื่ออธิบาย เส้นทางตามต้องการ - ใช้กับ
clip-pathเพื่อ mask รูปร่างตามต้องการ และใช้กับoffset-pathเพื่อ จัดวาง/ทำแอนิเมชันตามเส้นทาง พร้อมมีแผนจะผสานกับshape-outsideในอนาคต - การรองรับ คือ Chrome·Safari ส่วน Firefox ยังอยู่ในขั้น เปิดผ่าน flag จึงควรออกแบบ fallback ที่สวยงาม ในการใช้งานจริง
More Powerful attr()
attr()รองรับ การระบุชนิดข้อมูล แล้ว ทำให้สามารถอ่านค่า ที่ไม่ใช่สตริง เช่น ตัวเลขหรือสี จาก HTML attribute แล้วนำมาใช้เป็น ค่า CSS ได้โดยตรง- ความหมาย คือการขยายรูปแบบการ inject ค่าอย่าง สีธีม, ตัวนับ, ขนาด จาก markup
- การรองรับ ยัง นำโดย Chrome และแนะนำให้นำมาใช้แบบค่อยเป็นค่อยไปกับ องค์ประกอบเชิงภาพ ก่อน แทนที่จะพึ่งพาใน เลย์เอาต์หลัก
Reading Flow
- เพิ่มพร็อพเพอร์ตี
reading-flowสำหรับ ปรับลำดับการเลื่อนแท็บให้เป็นเหตุเป็นผล แม้ในเลย์เอาต์ที่ลำดับภาพกับลำดับซอร์สไม่ตรงกัน- เมื่อมีการจัดวางใหม่ด้วย grid สามารถกำหนดโฟลว์โฟกัสให้สอดคล้องกับรูปแบบเลย์เอาต์ เช่น
reading-flow: grid-rows
- เมื่อมีการจัดวางใหม่ด้วย grid สามารถกำหนดโฟลว์โฟกัสให้สอดคล้องกับรูปแบบเลย์เอาต์ เช่น
- ช่วยลด ความเสี่ยงด้านการเข้าถึง ได้ด้วย ประกาศ CSS เพียงบรรทัดเดียว ทำให้มี อิสระในการออกแบบเลย์เอาต์ มากขึ้น
- การรองรับ ยัง นำโดย Chrome ดังนั้นจึงแนะนำให้หลีกเลี่ยงการ reorder มากเกินไปจนกว่าจะรองรับได้กว้างกว่านี้
Stuff to Keep an Eye On
- Masonry layout ยังอยู่ระหว่างจัดระเบียบสเปก และข้อเสนอ
item-flowอาจขยายความเป็นไปได้ของการจัดวาง เกินกว่ากริดแบบเดิม - ฟังก์ชัน
random()มีให้ใช้ใน Safari แล้ว และเป็นประโยชน์ต่อการทำดีไซน์แบบแปรผันที่มี พลังการแสดงออกสูง margin-trimมีประโยชน์แต่ยัง เอนเอียงไปทาง Safari ส่วนsibling-index()/count()มีใน Chrome และเหมาะกับ stagger animation- มีข่าวดีด้าน cross-browser เช่น
view-transition-name: match-element;ของ View Transitions และ การพัฒนาใน Firefox - การทำให้ การคูณ/หารใน
calc()แบบผสมหน่วย สมเหตุสมผลขึ้นใกล้ผ่านขั้นทดลองแล้ว ซึ่งอาจลดความจำเป็นของ type conversion hack ในอดีต - มีการตั้งคำถามถึงปัญหาการไม่มีชื่อเวอร์ชันแบบ “CSS4” และแนะนำ รายการอ้างอิง ที่รวบรวมฟีเจอร์ใหม่ในช่วง 5 ปีล่าสุด
Great Stuff to Remember
- Container Queries และหน่วยที่เกี่ยวข้อง ยังคงเป็น พื้นฐานสำคัญ และถือเป็น การเพิ่มผลิตภาพครั้งใหญ่ที่สุดนับจาก media query
:has()เปิดให้เลือกตาม พาเรนต์และสถานะ ได้ ทำให้การเลือกแบบผสมที่ซับซ้อนจำนวนมาก แก้ได้ด้วย CSS เพียงอย่างเดียว- View Transitions, Anchor Positioning, Scroll-Driven Animations ไปถึง Safari แล้ว จึงมี อุปสรรคต่อการใช้งานจริงลดลง
- หน่วย viewport เพิ่มเติม (เช่น dvh) ถูกบรรจุใน Baseline แล้ว ช่วยเพิ่ม เสถียรภาพของ viewport บนมือถือ
ไฮไลต์โค้ด/ตัวอย่างการใช้งาน
- การเปลี่ยนขนาด: ใช้
interpolate-size: allow-keywordsแบบ global หรือทำ animation ความสูงตามคอนเทนต์ ด้วยheight: calc-size(auto, size)ตอนสลับสถานะ - การแตกแขนงของกริด: ใช้แพตเทิร์น
if(media(...): ค่า; ... else: ค่า;)เพื่อรวม template columns ตามแต่ละ breakpoint ไว้ใน ประกาศเดียว - Custom Select: เปิดใช้งาน picker แบบกำหนดเอง ด้วย
select, ::picker(select) { appearance: base-select } - bounce easing: ใช้
animation-timing-function: linear( ... หลายจุด ... )เพื่อสร้าง เส้นโค้งการเด้ง/หน่วงอย่างละเอียด - clip path: ใช้
clip-path: shape( ... )เพื่อสร้าง mask รูปร่างแบบ อิงสัดส่วนที่ responsive
แนวทางใช้งานจริง
- รายการที่มี ความต่างของการรองรับระหว่างเบราว์เซอร์สูง ควรนำมาใช้โดยยึด การออกแบบ fallback เป็นหลัก และพิจารณา ผลลัพธ์เทียบกับต้นทุนการนำเข้าใช้
- แอนิเมชัน, ตัวอักษร, เอฟเฟกต์ภาพ เหมาะเป็นตัวเลือก PE ลำดับแรก ส่วน การเข้าถึงหลัก อย่าง ลำดับโฟกัส/แท็บ ควรรอ การรองรับที่กว้างขวางกว่า ก่อน
- ฟังก์ชัน/เงื่อนไขแบบกำหนดเอง จะให้ ROI สูงสุดเมื่อทำเป็น แพตเทิร์นกลางของทีม ผ่าน การทำเอกสารกติกาการออกแบบ และการผสานกับ token·custom property
- รายการปรับปรุง Form UX อย่าง
field-sizing, Custom Select ให้ ประโยชน์ที่สัมผัสได้สูง ในสถานการณ์ mobile-first
บทสรุป
- CSS ยุคใหม่ฉบับปี 2025 เป็นปีที่ ฟังก์ชันค่า, การแตกแขนงเชิงตรรกะ, การควบคุมรูปร่าง ขยายตัวอย่างมาก ทำให้ “ทำสิ่งต่าง ๆ ด้วย CSS ได้มากขึ้น” และมีคุณค่าสำหรับการนำมาใช้แบบค่อยเป็นค่อยไปควบคู่กับ กลยุทธ์ PE
- หากวาง พื้นฐานหลัก (container queries,
:has(), หน่วย viewport) ไว้ก่อน แล้วค่อยนำanimate-to-auto·if()·shape()ซึ่งเป็นรายการ ประสิทธิภาพสูง เข้ามาก่อน ก็จะได้ roadmap ที่ใช้งานได้จริง
3 ความคิดเห็น
ตอนนี้ CSS แทบจะกลายเป็นภาษาหนึ่งไปแล้วนะครับ มันทำให้การเขียนตรรกะเชิงโครงสร้างได้มากพอสมควรเลย.. เลยชวนให้สงสัยว่านี่ยังเป็น stylesheet อยู่ไหม
ฟีเจอร์เด็ด ๆ น่าจะเพิ่มมาเยอะเลย สิ่งที่ก่อนหน้านี้ต้องทำด้วย javascript ก็จะทำได้
CSS ดีขึ้นมากจริง ๆ เลยนะ