ตัวสร้าง CSS สำหรับเอฟเฟกต์กระจกความละเอียดสูง
(glass3d.dev)- ให้แนวทางในการสร้างเอฟเฟกต์กระจกความละเอียดสูงด้วย โค้ด CSS
- ใช้ฟิลเตอร์ภาพอย่าง blur, brightness, saturate และเงาแบบหลายชั้น
- ใช้ pseudo-element เพื่อสร้างเอฟเฟกต์เลเยอร์ด้านหน้าและด้านหลัง รวมถึงพื้นผิว (texture)
- นำไปใช้และปรับแต่งกับ UI ได้หลากหลายด้วย CSS class ที่กระชับเพียงตัวเดียว
- เหมาะสำหรับการนำ เอฟเฟกต์กระจกความละเอียดสูง ไปใช้ในเว็บโปรเจ็กต์ได้อย่างรวดเร็วและทันสมัย
แนะนำ
โค้ด CSS ชุดนี้ออกแบบมาโดยเฉพาะสำหรับการสร้าง เอฟเฟกต์กระจกความละเอียดสูง ในเว็บ UI สามารถให้ผลลัพธ์ที่ละเอียดและมีมิติมากกว่าเอฟเฟกต์ glassmorphism แบบเดิม และตรวจดูผลลัพธ์ได้อย่างตรงไปตรงมาด้วยการใส่ CSS class เพียงตัวเดียว
เนื้อหาหลัก
- ในคลาส
.glass3dมีการใส่เอฟเฟกต์ฟิลเตอร์ภาพหลายแบบ เช่น blur(32px), brightness(0.85), saturate(2.5) รวมถึงการเพิ่มสีและ texture แบบ noise - ใช้ box-shadow หลายระดับเพื่อสร้างความรู้สึกเหมือนกระจกที่มีมิติจริง
- ใน
::beforepseudo-element มีการซ้อน backdrop-filter, สี และภาพพื้นหลังแบบ noise เพื่อสร้างความโปร่งใสของพื้นหลังและพื้นผิวแบบมีมิติ - ใน
::afterpseudo-element มีการเพิ่ม เงาด้านใน (inset shadow) เพื่อให้เกิดเอฟเฟกต์เหมือนแสงสะท้อนบนผิวกระจกจริง - แยก z-index เพื่อจัดโครงสร้างให้เอฟเฟกต์ของแต่ละเลเยอร์ไม่ชนกันและแสดงผลได้อย่างถูกต้อง
- ใช้ตัวเลือก
.glass3d > *เพื่อให้ส่วนเนื้อหาขององค์ประกอบลูกแสดงอยู่บนสุดเสมอ
พื้นหลังการใช้งานและข้อดี
- สามารถสร้าง UI เอฟเฟกต์กระจกที่โมเดิร์นและทันสมัยได้ด้วย CSS class เดียว โดยไม่ต้องพึ่งไลบรารีหรือ dependency ภายนอก
- นำไปใช้และต่อยอดได้ง่ายกับระบบออกแบบ UI, การ์ด, ป๊อปอัป, ปุ่ม ฯลฯ จึงมีประโยชน์มากสำหรับนักพัฒนาเว็บฟรอนต์เอนด์
- ด้วยการใช้ภาพ pattern จริงเป็น texture การจับคู่สีที่หลากหลาย และเอฟเฟกต์เงาหลายชั้น ทำให้มีจุดเด่นด้านมิติและการไล่แสงเงาเหนือกว่าเทคนิค glassmorphism แบบเดิม
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
มีเวอร์ชันที่ใช้ JavaScript เพื่อใส่เอฟเฟกต์การหักเหแสงจริงให้กับองค์ประกอบบนหน้า แนะนำให้ลองดู https://real-glass.vercel.app/
เอฟเฟกต์นี้มีข้อจำกัดตรงที่ทำให้เบลอได้เฉพาะพิกเซลที่อยู่หลังพื้นผิวโดยตรง แนะนำให้อ่านบทความของ Josh Comeau ที่อธิบายประเด็นนี้ได้ดี (https://www.joshwcomeau.com/css/backdrop-filter/#the-issue) และกระทู้บน Hacker News (https://news.ycombinator.com/item?id=42302907) ถ้าพื้นหลังมีการเคลื่อนไหวก็เป็นประเด็นที่ค่อนข้างสำคัญ แต่ถ้าเป็นพื้นหลังนิ่งก็มักไม่สำคัญมาก
border-radiusด้วย SVG mask มันทำงานได้ดีกับองค์ประกอบที่ฮาร์ดโค้ดไว้ แต่ยังต้องคิดต่อว่าจะทำให้ใช้ได้กับทั้ง component library ที่border-radiusเปลี่ยนตาม brand/container query ได้อย่างไรดูเหมือนทำออกมาได้ค่อนข้างเจ๋ง แต่ถ้าขาดเอฟเฟกต์การหักเหของกระจกไป ความรู้สึกของการแยกเลเยอร์แบบเด่นชัดของ Liquid Glass ก็หายไป ดูจาก design resource ของ Material จะเห็นว่าเขาเน้นว่าแอปควรประกอบด้วยเลเยอร์ 3D ที่เคลื่อนไหวอย่างสอดคล้องกัน แต่พอเอามาทำเป็น 2D จริงแล้วทุกองค์ประกอบปนกัน การแยกแต่ละเลเยอร์จะยากมาก คนมักหา action button ที่อยู่ตามมุมไม่เจอ แม้ motion จะช่วยแยก chrome ออกจากคอนเทนต์ได้ แต่ในเชิงภาพมันไม่ได้โดดเด่นมาก ข้อดีใหญ่ที่สุดของ Liquid Glass น่าจะเป็น edge distortion เพราะมันสร้าง non-linear motion ที่สายตาคนจับได้ทันทีเมื่อคอนเทนต์ขยับ ทำให้การแบ่งเลเยอร์ชัดขึ้นเมื่อมีการเคลื่อนไหว ซึ่งองค์ประกอบการหักเหสำคัญนี้ไม่มีอยู่ที่นี่ การทำ edge distortion ด้วย SVG filter ไม่ใช่เรื่องง่าย และสุดท้ายก็เป็นงานที่ซับซ้อนมาก ดูคำอธิบายแบบทีละขั้นได้ที่ https://atlaspuplabs.com/blog/liquid-glass-but-in-css/… จะเห็นความซับซ้อนชัดเจน และยังเจอ CodePen Spark collection ที่รวมความพยายามทำ Liquid Glass หลายแบบไว้ด้วย พร้อมตัวอย่างอ้างอิงที่ทำออกมาใช้ได้ด้วย SVG แบบฮาร์ดโค้ด แนะนำเช่นกัน https://codepen.io/spark/453 https://codepen.io/lucasromerodb/pen/vEOWpYM
ตัวเอฟเฟกต์เองดูดี แต่ฉันยังไม่ค่อยรู้สึกถึงความเป็นกระจก ความต่างที่เห็นได้ทันทีคือแสงไม่ตอบสนองกับ bevel เลย และก็คาดหวังว่าแสงที่สะท้อนบนกระจกจะมีผลกับแสง/สีด้วย แค่ blur อย่างเดียวคงไม่พอ อีกอย่างกระจกยังสร้างเงาเฉพาะตัวได้ด้วย โดยเฉพาะ caustics แต่ดูเหมือน Apple ก็ไม่ได้ใส่ใจถึงจุดนั้น ตอนนี้เงาดูเหมือน drop shadow ธรรมดา เลยยิ่งให้ความรู้สึกเหมือนการ์ดแบน ๆ มากกว่าวัตถุ 3D ซึ่งสวนทางกับแก่นของเทรนด์ล่าสุด เรื่องนี้ทำด้วย CSS ล้วนคงยาก และน่าจะเหมาะกับการรัน shader บน GPU มากกว่า
divทั่วไปได้ไหม ถ้าใส่เอฟเฟกต์ GPU ลงใน HTML พื้นฐานโดยตรงไม่ได้ สุดท้ายการทำ rendering engine ใหม่ด้วย custom canvas อาจจะดีกว่า ตอนนี้ HTML แทบไม่มีความหมายแล้ว เหลือแค่ใช้แท็ก<p>ส่งข้อความและที่เหลือก็เป็นโฆษณาหมด งั้นอาจถึงเวลาต้องเริ่มใหม่ทั้งหมด เหลือแค่<p>แล้วปรับปรุงการผสานกับ GPU ให้ดีขึ้นกำลังสะสมตัวอย่างดีไซน์แบบนี้อยู่ https://github.com/swyxio/spark-joy
ขอแนะนำข้อมูลที่เกี่ยวข้องอีกสักหน่อย
รู้สึกว่าถ้ามีตัวเลือกซ่อนหรือพับกล่องบนมือถือได้ น่าจะใช้งานสะดวกขึ้นมาก เพราะกล่องกินพื้นที่เต็มหน้าจอจนแทบไม่เห็นเอฟเฟกต์ด้านหลัง แต่ก็น่าสนใจดี ไว้จะลองใหม่บนจอใหญ่ การมีตัวเลือกซ่อนกล่องน่าจะช่วยได้มาก
ดูเหมือนจะใช้เทคนิคคล้ายกับ glass implementation ของฉัน https://news.ycombinator.com/item?id=42225481 โดยเฉพาะแนวทางที่ใช้ box shadow อย่างหนักค่อนข้างคล้ายกัน
ใช้เป็นเอฟเฟกต์พื้นหลังเว็บได้ดี
บนมือถือของฉันการเลื่อนค่อนข้างช้า เลยสงสัยว่ามีเอฟเฟกต์เลื่อนช้าแบบจงใจอยู่แล้วหรือว่าเป็นผลข้างเคียงจากเอฟเฟกต์กระจก
คิดว่าทำออกมาได้ดีมาก และทุกครั้งก็ยังทึ่งที่ computer graphics ไม่ได้มี "วิธีพิเศษอย่างหนึ่ง" แต่จริง ๆ คือ "กลลวงซ้อนกัน 5 ชั้น" การรองรับข้ามเบราว์เซอร์ก็น่าจะเป็นความท้าทายใหญ่เหมือนกัน เลยสงสัยว่าพอจะเดาได้ไหมว่าส่วนไหนใช้ทรัพยากรมากที่สุด ฉันเดาเล่น ๆ ว่าน่าจะเป็น
backdrop-filterbackdrop-filterยิ่งค่า blur สูง ก็ยิ่งต้องดูข้อมูลพิกเซลรอบข้างมากขึ้นในการเรนเดอร์ อีกส่วนที่ใช้ทรัพยากรก็คือการอัปเดตลักษณะของ glass แบบเรียลไทม์ตอนเลื่อนหน้าหรือเมื่อพื้นหลังวิดีโอเปลี่ยน