ตัวสร้าง CSS สำหรับเอฟเฟกต์กระจกความละเอียดสูง
(glass3d.dev)- glass3d generator เป็นเครื่องมือที่ให้คุณปรับค่าตั้งค่า แล้วดูตัวอย่างและคัดลอก CSS พื้นผิวกระจก ได้ทันที
- ค่าปรับหลักประกอบด้วย blur, brightness, saturation ของ
backdrop-filterรวมถึงสีและการเลือก texture - สีถูกจัดการด้วย HSL และค่า alpha โดยค่าตัวอย่างคือ
hsl(189 80% 10% / 0.2) - texture สามารถเลือกได้จาก rice paper, egg shell, ink jet, coarse, topology
- CSS ที่สร้างขึ้นจะแบ่ง background filter, noise texture, inner shadow และ content layer โดยผสมผสาน
.glass3d,::before,::afterและz-indexขององค์ประกอบลูก
ค่าที่ปรับได้ใน glass3d generator
- เมื่อเปลี่ยนค่าตั้งค่า ผลลัพธ์จะสะท้อนบนอินเทอร์เฟซเองทันที
- CSS ที่เสร็จแล้วสามารถคัดลอกไปใช้งานได้
- รายการตั้งค่าหลักมีดังนี้
backdrop-filterblurbrightnesssaturationcolortexture
โครงสร้าง CSS ที่ถูกสร้างขึ้น
- คลาส
.glass3dกำหนด CSS variables และฐานสำหรับ layer--filter-glass3d:blur(32px) brightness(0.85) saturate(2.5)--color-glass3d:hsl(189 80% 10% / 0.2)--noise-glass3d:egg-shell.pngของtransparenttextures.com- ใช้
position: relative,z-index: 4และbox-shadowหลายระดับ
.glass3d::beforeใช้ background filter และ texture- ใช้
var(--filter-glass3d)กับ-webkit-backdrop-filterและbackdrop-filter - ใส่ตัวแปรสีและตัวแปร noise ลงใน
background-colorและbackground-imageตามลำดับ - ตั้งค่า
background-size: 100px,background-repeat: repeat
- ใช้
.glass3d::afterเพิ่ม เงาไฮไลต์ด้านใน- ใช้ค่า
inset box-shadowหลายค่า
- ใช้ค่า
.glass3d > *ใช้position: relativeและz-index: 6เพื่อให้เนื้อหาแสดงอยู่ด้านบน
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
วิธีนี้มีปัญหาตรงที่ใช้เฉพาะพิกเซลที่อยู่ด้านหลังพื้นผิวโดยตรงมาทำเบลอ ซึ่งอธิบายให้เห็นได้ดีใน https://www.joshwcomeau.com/css/backdrop-filter/#the-issue
น่าอ่านควบคู่กับการถกเถียงใน https://news.ycombinator.com/item?id=42302907 ถ้าพื้นหลังเคลื่อนที่อยู่ด้านล่าง ปัญหา การเบลอเฉพาะพิกเซลด้านหลังโดยตรง ก็ถือว่าสำคัญพอสมควร แต่ถ้าเป็นพื้นหลังนิ่ง โดยทั่วไปมักไม่ใช่เรื่องใหญ่
กับองค์ประกอบที่ฮาร์ดโค้ดไว้ทำงานได้ดี แต่ยังต้องหาวิธีให้มันทำงานในไลบรารีคอมโพเนนต์ทั้งชุดที่ border-radius เปลี่ยนตามแบรนด์ของผู้ใช้และ container query
ผมกลับมองว่าวัสดุพื้นฐานใกล้เคียงกับกระดาษมากกว่า
สำหรับผม เวอร์ชันที่ปรับแล้วขัดกับ เบาะแสด้านความลึก จึงดูรบกวนสายตากว่าและผิดมากกว่า
ดูดีทีเดียว แต่ถ้าขาด คุณสมบัติการหักเหแสง ของแก้วไป ก็จะเสียความรู้สึกแบ่งเลเยอร์อย่างชัดเจน ซึ่งผมมองว่าเป็นผลงานสำคัญที่สุดของ Liquid Glass
Material มีเอกสารสำหรับนักออกแบบที่ยอดเยี่ยม แสดงด้วย 3D มุมด้านข้างว่าแอปควรถูกประกอบจากเลเยอร์ที่เคลื่อนไหวอย่างสอดคล้องกัน แต่พอรวมเป็น 2D แล้วกลับหาว่าฟังก์ชันไหนอยู่ตรงไหนได้ยากมาก ผู้คนมักมองไม่เห็นปุ่มแอ็กชันตรงมุมบ่อยมากจริง ๆ
การเคลื่อนไหวช่วยแยกโครมออกจากคอนเทนต์ได้บ้าง แต่มีองค์ประกอบที่กำหนดภาพให้ชัดเจนน้อยเกินไป ผมคิดว่าข้อดีที่สุดของ Liquid Glass คือ การบิดเบือนบริเวณขอบ เมื่อคอนเทนต์เคลื่อนที่ จะเกิดการเคลื่อนไหวแบบไม่เชิงเส้น และการมองเห็นของมนุษย์จับสิ่งนั้นได้ทันที
ภาพหน้าจอนิ่งมักดูไม่ดีเสมอไป แต่เมื่อเคลื่อนไหว มันแยกองค์ประกอบได้ดีกว่าสิ่งที่เคยเห็นมามาก องค์ประกอบการหักเหแสงสำคัญที่ใช้ประโยชน์จากการตรวจจับการเคลื่อนไหวของมนุษย์อย่างมากนั้นหายไปจากที่นี่
ก่อนหน้านี้เคยเห็นเดโมเว็บที่ยอดเยี่ยมอีกตัวหนึ่ง แต่ตอนนี้หาเจอยาก แทนกัน เดโมนี้ประสิทธิภาพบนมือถือไม่ดีและภาพก็ดูด้อยกว่า แต่แสดงทีละขั้นได้ดีว่างานซับซ้อนแค่ไหน การทำการบิดเบือนขอบด้วย SVG filter อย่างเดียวเป็นเส้นทางที่ค่อนข้างโหด: https://atlaspuplabs.com/blog/liquid-glass-but-in-css#breaki...
ผมยังเจอชุดความพยายามทำ Liquid Glass (CodePen Spark) ด้วย และลิงก์ที่สองถือเป็นตัวอย่างที่ทำออกมาได้ค่อนข้างดีด้วย SVG ที่กำหนดไว้ล่วงหน้าและฮาร์ดโค้ดอย่างเฉพาะเจาะจงมาก: https://codepen.io/spark/453 https://codepen.io/lucasromerodb/pen/vEOWpYM
ผู้คนเห็นแก้วจริงทุกวัน จึงมีสัญชาตญาณว่าอะไรดูจริงและถูกต้อง ดังนั้นงานเลียนแบบจึงดูแย่กว่าอย่างชัดเจน และ Apple ก็ยังรักษาภาพลักษณ์สินค้าที่ “ดูพรีเมียม” ไว้ได้
สำหรับโปรเจกต์ปัจจุบัน เป้าหมายคือทำวัสดุที่ดูขัดเกลา ทำงานสม่ำเสมอข้ามเบราว์เซอร์ และไม่ใช้ 3D จริง ๆ ที่บอกว่าเอฟเฟกต์จะเห็นชัดขึ้นเมื่อเคลื่อนไหวบนพื้นหลังคงที่ก็ถูกแล้ว ในไซต์เดโมของไลบรารีที่กำลังทำอยู่ก็ทำแบบนั้น แต่ยังไม่พร้อม
ผมรู้ว่าแก้วจริงทำงานแบบนั้น แต่ไม่อยากต้องสนใจ เหมือนหยิบเอาส่วนที่แย่ที่สุดของ skeuomorphism มาแล้วผลักให้หนักขึ้นสองเท่า และแม้ผมจะเป็นคนที่ชอบยุคก่อน iOS 7 มากกว่า ก็ยังรู้สึกแบบนั้น
เป็นเอฟเฟกต์ที่เจ๋ง แต่สำหรับผมมันยังไม่รู้สึกเหมือนแก้วจริง
ความต่างที่เห็นได้ทันทีที่สุดคือแสงไม่ได้โต้ตอบกับ bevel ผมคาดว่าแสงควรย้อนเข้าไปในแก้วอีกครั้งและส่งผลต่อทั้งแสงเงาและสีด้วย แค่ใส่เบลออย่างเดียวไม่พอ
อีกอย่าง แก้วอาจมีเงาของตัวเองและ ลวดลายการรวมแสง ที่น่าสนใจได้ ที่นี่มองเห็นเงาอยู่ แต่รู้สึกเหมือน drop shadow ธรรมดา จึงดูเหมือนการ์ดแบน ๆ มากกว่าจะเป็นวัตถุฟิสิกส์ 3D ที่เป็นส่วนหนึ่งของโฟลว์ใหม่
อย่างไรก็ดี การเลียนแบบด้วย CSS อย่างเดียวไม่ใช่เรื่องง่าย และ shader ที่รันบน GPU ดูเหมาะกว่ามาก
divทั่วไปได้อย่างไร? ถ้าใช้เอฟเฟกต์ GPU กับ HTML พื้นฐานไม่ได้ และต้องทำกับองค์ประกอบคัสตอมอย่างการผสม Canvas แบบตามใจชอบ บางทีการสร้าง rendering engine ใหม่ทั้งชุดที่รองรับเอฟเฟกต์ GPU อาจจะดีกว่าผมมองว่า HTML ตายแล้ว สำหรับการส่งข้อความ แท็กไม่กี่อันก็พอ ส่วนที่เหลือส่วนใหญ่ถูกใช้ทำให้เว็บเพจกลายเป็นระเบิดโฆษณา ดังนั้นเริ่มใหม่ด้วยแท็ก
<text>และการผสานกับ GPU ที่ดีกว่า แล้วตัดส่วนที่เหลือออกไปน่าจะดีกว่าผมทำเวอร์ชัน JavaScript ที่ หักเห องค์ประกอบบนหน้าเว็บจริง ๆ: https://real-glass.vercel.app/
กำลังรวบรวมของพวกนี้อยู่: https://github.com/swyxio/spark-joy
แหล่งข้อมูลอื่น ๆ ก็มีเครื่องมือสร้าง CSS ฟรีที่อิงตามสเปกดีไซน์ glassmorphism https://ui.glass/generator/, เฮดเดอร์คงที่แบบกระจกฝ้า https://www.joshwcomeau.com/css/backdrop-filter/, glassy glassmorphism codepen และ in context
ทำออกมาได้ดีมากจริง ๆ น่าทึ่งเสมอที่กราฟิกคอมพิวเตอร์ไม่ได้เป็น “ทริกประหลาดเพียงอย่างเดียว” แต่ใกล้เคียงกับ ทริก 5 ชั้นที่ซ้อนกัน มากกว่า
การทำให้เข้ากันได้ข้ามเบราว์เซอร์ก็เป็นโจทย์ยากเพิ่มเติม อยากรู้ว่าพอมีความรู้สึกไหมว่าส่วนไหนกินทรัพยากรมากที่สุด ถ้าคิดง่าย ๆ ก็น่าจะเป็น
backdrop-filterสัญชาตญาณถูกแล้ว และส่วนที่กินทรัพยากรมากที่สุดคือ การเบลอ ของ
backdrop-filterยิ่งค่าเบลอมากเท่าไร ก่อนเรนเดอร์ก็ต้อง “อ้างอิง” พิกเซลข้างเคียงมากขึ้นเท่านั้นอีกองค์ประกอบที่มีต้นทุนสูงคือ ต้องวาดใหม่ตลอดเมื่อเลื่อนหน้า หรือเมื่อพื้นหลังวิดีโอทำให้ลักษณะของกระจกเปลี่ยนไป
ดูเหมือนจะใช้เทคนิคคล้ายกับการทำกระจกของผม: https://news.ycombinator.com/item?id=42225481
โดยเฉพาะส่วนที่ใช้
box-shadowหนัก ๆ นั้นคล้ายกันปัญหาเล็กน้อย: เงาระหว่างด้านบนกับพื้นที่เลื่อนที่มี toggle/โค้ดจะหายไปเมื่อเลื่อนลง น่าจะควรถูกซ่อนไว้ตอนแรกแล้วค่อยปรากฏขึ้นมากกว่า
box-shadowแบบ “overhang” เหล่านั้นถูกออกแบบให้ใช้ภายในองค์ประกอบ ไม่ใช่ให้ทอดลงมาจากองค์ประกอบใดองค์ประกอบหนึ่ง ซึ่งกรณีนี้ทำให้ตระหนักว่าควรใช้เงาแบบหลังแทนบนมือถือของผม การเลื่อนเนื้อหาค่อนข้างช้า อยากรู้ว่ามีเอฟเฟกต์เลื่อนอื่นที่ตั้งใจทำให้ช้าหรือเปล่า หรือเป็นผลข้างเคียงของ เอฟเฟกต์กระจก
อาจเป็นผมพลาดเอง แต่บนมือถือ ถ้าซ่อนหรือพับกล่องได้จะมีประโยชน์กว่านี้มาก
ตอนนี้มันกินทั้งหน้าจอจนแทบไม่เห็นเอฟเฟกต์ด้านหลังเลย แต่ก็ยังสนใจอยู่ เลยคิดว่าจะกลับมาลองอีกทีบนจอที่ใหญ่กว่าในภายหลัง อย่างไรก็ตาม ถ้ามีตัวเลือกให้ซ่อนกล่องน่าจะดีขึ้นมาก
ในการทำเวอร์ชันแรก ผมวางสี่เหลี่ยมเดโมเล็ก ๆ ไว้เหนือ UI ของตัวสร้าง แต่แม้จะเป็นของเล็ก ๆ ก็ใช้พื้นที่มากเกินไปจนทำให้ใช้งาน UI ลำบาก ถ้าทำให้ทั้งหน้าเลื่อนได้ ผู้คนก็หงุดหงิดเพราะไม่ชัดเจนว่าถ้าจะดูสี่เหลี่ยมที่กำลังแก้ไขอยู่ต้องเลื่อนกลับไปด้านบนสุด
เครื่องมือนี้หลัก ๆ ทำมาเพื่อการเขียนโค้ด จึงให้ความสำคัญกับ ประสบการณ์บนเดสก์ท็อป ก่อน ส่วนมือถือวางไว้ให้เป็นเหมือนพรีวิวอย่างรวดเร็วและเป็นการพิสูจน์ว่ามันทำงานบนมือถือได้ด้วย ถึงอย่างนั้น ถ้ารู้จัก UI คล้าย ๆ กันที่ทำงานบนมือถือได้ดีจริง ๆ ก็อยากเห็นลิงก์