Trình tạo CSS cho hiệu ứng kính độ phân giải cao
(glass3d.dev)- Cung cấp cách tạo hiệu ứng kính độ phân giải cao bằng mã CSS
- Áp dụng các bộ lọc thị giác như blur, độ sáng (brightness), độ bão hòa (saturate) cùng đổ bóng nhiều lớp
- Sử dụng pseudo-element để triển khai hiệu ứng lớp trước/sau và xử lý texture
- Có thể áp dụng và tùy biến cho nhiều UI chỉ với một lớp CSS ngắn gọn
- Phù hợp để đưa hiệu ứng kính độ phân giải cao vào các dự án web theo cách nhanh chóng và hiện đại
Giới thiệu
Đoạn mã CSS này được tối ưu để tạo hiệu ứng kính độ phân giải cao trong web UI. So với hiệu ứng glassmorphism truyền thống, nó cho phép thể hiện tinh xảo hơn và có chiều sâu hơn, đồng thời có thể xem kết quả một cách trực quan chỉ bằng việc áp dụng một class CSS duy nhất.
Nội dung chính
- Lớp
.glass3dáp dụng nhiều hiệu ứng bộ lọc thị giác như blur(32px), độ sáng (0.85), độ bão hòa (2.5), đồng thời chèn texture màu và nhiễu - Cấu hình box-shadow nhiều tầng để tái hiện cảm giác kính nổi khối chân thực
- Ở pseudo-element
::before, chồng lớp backdrop-filter, màu sắc và ảnh nền nhiễu để tạo độ trong suốt của nền và chất liệu nổi khối - Ở pseudo-element
::after, thêm bóng bên trong (inset) để tạo hiệu ứng như ánh sáng phản chiếu trên bề mặt kính thật - Cấu trúc được tổ chức bằng cách tách z-index để các hiệu ứng theo từng layer không xung đột và hiển thị đúng
- Thông qua selector
.glass3d > *, phần nội dung của các phần tử con luôn được hiển thị ở lớp trên cùng
Bối cảnh sử dụng và ưu điểm
- Có thể triển khai UI hiệu ứng kính hiện đại, hợp xu hướng chỉ với một lớp CSS, không cần thư viện hay phụ thuộc bên ngoài
- Rất hữu ích cho lập trình viên frontend web vì có thể dễ dàng áp dụng và mở rộng cho design system, thẻ, popup, nút bấm, v.v.
- Nhờ sử dụng texture từ ảnh pattern thực tế, nhiều tổ hợp màu sắc và hiệu ứng đổ bóng nhiều tầng, cách làm này có ưu thế về chiều sâu và biểu đạt sáng tối so với kỹ thuật glassmorphism hiện có
1 bình luận
Ý kiến Hacker News
Tôi đã làm một phiên bản áp dụng hiệu ứng khúc xạ thực lên các phần tử của trang bằng JavaScript, rất đáng để xem thử https://real-glass.vercel.app/
Hiệu ứng này có giới hạn là chỉ làm mờ các pixel ngay phía sau bề mặt; tôi khuyên nên tham khảo bài viết của Josh Comeau giải thích rất rõ hiện tượng này (https://www.joshwcomeau.com/css/backdrop-filter/#the-issue) và thảo luận trên Hacker News (https://news.ycombinator.com/item?id=42302907). Đây là vấn đề khá quan trọng nếu nền chuyển động, còn nếu nền cố định thì thường không đáng kể
border-radiusbằng SVG mask. Nó hoạt động tốt với phần tử được hardcode, nhưng tôi vẫn đang suy nghĩ thêm về cách dùng nó trong cả thư viện component, nơiborder-radiusthay đổi theo brand/container queryTôi nghĩ nó được làm khá đẹp, nhưng nếu thiếu hiệu ứng khúc xạ của kính thì sẽ mất đi cảm giác tách lớp thị giác rất mạnh của Liquid Glass. Nếu xem tài nguyên thiết kế của Material, họ nhấn mạnh rằng ứng dụng nên được cấu thành từ các lớp 3D nhất quán và chuyển động. Nhưng khi thực tế triển khai bằng 2D và mọi thứ trộn vào nhau, việc phân biệt từng lớp trở nên rất khó. Nhiều người thường không tìm thấy các nút hành động ở góc khuất. Chuyển động đúng là có giúp phân biệt chrome với nội dung, nhưng về mặt thị giác thì không quá nổi bật. Tôi nghĩ ưu điểm lớn nhất của Liquid Glass là edge distortion (biến dạng ở mép). Nó tạo ra chuyển động phi tuyến mà mắt người có thể bắt được ngay khi nội dung di chuyển, khiến sự phân lớp rõ ràng hơn khi có chuyển động. Yếu tố khúc xạ quan trọng này lại thiếu ở đây. Việc làm edge distortion bằng SVG filter không hề dễ, và rốt cuộc là một công việc khá phức tạp. Có thể xem phần giải thích từng bước tại https://atlaspuplabs.com/blog/liquid-glass-but-in-css/… để thấy độ phức tạp, và tôi cũng tìm thấy bộ sưu tập CodePen Spark tập hợp nhiều thử nghiệm triển khai Liquid Glass khác nhau, cùng một ví dụ tham khảo khá ổn làm bằng SVG hardcode https://codepen.io/spark/453 https://codepen.io/lucasromerodb/pen/vEOWpYM
Bản thân hiệu ứng thì đẹp, nhưng tôi không thấy nó mang cảm giác kính cho lắm. Khác biệt dễ nhận ra ngay là ánh sáng không phản ứng gì với bevel (mặt vát/bo ở mép). Tôi cũng mong ánh sáng phản xạ trên kính sẽ ảnh hưởng đến chiếu sáng/màu sắc; chỉ blur thôi thì không đủ. Ngoài ra kính còn có thể tạo ra bóng rất đặc trưng, đặc biệt là caustics, nhưng có vẻ Apple cũng chưa đi xa tới mức đó. Bóng hiện tại trông như drop shadow đơn giản nên chỉ làm tăng cảm giác một tấm thẻ phẳng hơn là một vật thể 3D. Điều này lệch khỏi trọng tâm của xu hướng gần đây. Những hiệu ứng như vậy khó mà làm chỉ với CSS; có lẽ chạy bằng shader trên GPU sẽ phù hợp hơn
divthông thường hay không. Nếu không thể gắn hiệu ứng GPU trực tiếp lên HTML cơ bản thì có lẽ tốt hơn là làm hẳn một engine render mới kiểu canvas tùy biến. Giờ HTML gần như chẳng còn ý nghĩa gì ngoài việc dùng thẻ<p>để truyền chữ, còn phần còn lại đều là quảng cáo, nên có khi nên giữ lại mỗi<p>và bắt đầu lại hoàn toàn với tích hợp GPU tốt hơnTôi đang sưu tầm các mẫu thiết kế kiểu này https://github.com/swyxio/spark-joy
Cũng xin gợi ý thêm vài tài liệu liên quan
Tôi nghĩ nếu trên di động có tùy chọn ẩn hoặc thu gọn hộp thì khả năng sử dụng sẽ tốt hơn nhiều. Hiện tại cái hộp chiếm hết màn hình nên khó thấy được hiệu ứng phía sau. Dù vậy vẫn rất thú vị, tôi định sẽ thử lại trên màn hình lớn. Thêm tùy chọn ẩn hộp có lẽ sẽ giúp ích nhiều
Có vẻ nó dùng kỹ thuật tương tự phần triển khai glass của tôi https://news.ycombinator.com/item?id=42225481, đặc biệt là cách tận dụng box shadow rất mạnh tay
Hiệu ứng này dùng làm nền web khá tốt
Trên điện thoại của tôi, cuộn khá chậm. Không rõ có phải còn hiệu ứng cuộn chậm nào khác được cố ý thêm vào hay đây là tác dụng phụ của hiệu ứng glass
Tôi nghĩ nó được làm rất tốt. Lúc nào tôi cũng ngạc nhiên vì đồ họa máy tính không phải là “một cách đặc biệt duy nhất” mà thực ra là “5 lớp mẹo chồng lên nhau”, và hỗ trợ đa trình duyệt cũng là một thách thức lớn. Không rõ bạn có cảm nhận được phần nào tốn tài nguyên nhất không; tôi đoán chắc là
backdrop-filterbackdrop-filter. Giá trị blur càng cao thì càng phải tham chiếu nhiều thông tin pixel xung quanh để render. Một phần khác cũng tốn tài nguyên là việc cập nhật diện mạo kính theo thời gian thực khi cuộn hoặc khi nền video thay đổi