- Một tính năng CSS mới Grid Lanes để triển khai bố cục masonry trên web đã được giới thiệu trong Safari Technology Preview 234
- Có thể xây dựng lưới phản hồi không cần media query bằng thuộc tính
display: grid-lanes, đồng thời định nghĩa các cột linh hoạt với grid-template-columns
- Thuộc tính
item-tolerance cho phép điều chỉnh độ nhạy khi sắp xếp các mục, giúp giảm mất cân đối thị giác do khác biệt kích thước nội dung
- Hỗ trợ cả hướng cột và hướng hàng, luồng sẽ được quyết định tự động tùy theo việc định nghĩa
grid-template-columns hay grid-template-rows
- CSS Working Group đang thảo luận một số tên thuộc tính chi tiết, và đội ngũ WebKit đang song song chuẩn hóa và triển khai để khuyến khích các nhà phát triển thử nghiệm
Tổng quan về CSS Grid Lanes
- Grid Lanes là một chế độ hiển thị mới để triển khai bố cục kiểu masonry trên web bằng CSS thuần
- Dùng
display: grid-lanes để cấu hình với cú pháp tương tự grid hiện có
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)) tạo các cột linh hoạt với độ rộng tối thiểu 250px
- Dùng thuộc tính
gap để chỉ định khoảng cách giữa các mục, và có thể thích ứng với mọi kích thước màn hình mà không cần media query
- Có thể thử nghiệm trong Safari Technology Preview 234, WebKit cũng cung cấp trang demo
Cách Grid Lanes hoạt động
- Trình duyệt sẽ tự động đặt từng mục vào cột gần phía trên nhất
- Tương tự Masonry.js, mục tiếp theo sẽ được thêm vào cột hiện đang ngắn nhất
- Khi di chuyển bằng phím Tab, người dùng có thể duyệt nội dung đang hiển thị theo chiều ngang
- Khi nạp nội dung cuộn vô hạn, việc sắp xếp tự động vẫn có thể thực hiện mà không cần JavaScript
Các khả năng mở rộng của CSS Grid
- Đa dạng kích thước lane: cú pháp
grid-template-* cho phép xen kẽ cột hẹp và cột rộng
- Ví dụ:
grid-template-columns: repeat(auto-fill, minmax(8rem, 1fr) minmax(16rem, 2fr)) minmax(8rem, 1fr)
- Hỗ trợ mở rộng mục (span)
- Có thể đặt một mục trải qua nhiều cột (
grid-column: span 4 v.v.)
- Demo ví dụ: bố cục dạng bài báo
- Có thể định vị tường minh
- Ví dụ:
header { grid-column: -3 / -1; } để cố định header ở các cột cuối
Tính năng chuyển hướng
- Hỗ trợ cả bố cục dựa trên cột (waterfall) lẫn dựa trên hàng (brick)
- Khi định nghĩa
grid-template-columns thì tự động đặt theo hướng cột, còn khi định nghĩa grid-template-rows thì tự động đặt theo hướng hàng
grid-auto-flow: normal là giá trị mặc định, và hệ thống sẽ tự quyết định dựa trên hướng đã định nghĩa
- CSS Working Group đang thảo luận tên gọi của các thuộc tính điều khiển luồng (như
grid-lanes-direction)
- Các thảo luận liên quan đang diễn ra trong issue của GitHub CSSWG-drafts
Điều chỉnh độ nhạy sắp xếp: item-tolerance
item-tolerance quyết định mức độ phân biệt nghiêm ngặt về chênh lệch kích thước khi sắp xếp các mục
- Giá trị mặc định là
1em, các chênh lệch nhỏ hơn mức này sẽ được xem là cùng chiều cao
- Giá trị càng cao thì các mục dịch trái phải ít hơn, còn càng thấp thì điều chỉnh vị trí chi tiết hơn
- Về mặt khả năng tiếp cận, cần đặt giá trị phù hợp để giảm thiểu bước nhảy thị giác khi di chuyển bằng Tab
- Tên thuộc tính hiện được định nghĩa là
item-tolerance, nhưng có thể đổi thành flow-tolerance hoặc pack-tolerance
Ví dụ thử nghiệm và ứng dụng
Kế hoạch sắp tới
- CSS Working Group đang tiếp tục quyết định các tên thuộc tính còn lại
- Đội ngũ WebKit đã song song triển khai và chuẩn hóa từ giữa năm 2022
- Khuyến khích các nhà phát triển tạo demo và gửi phản hồi
- Jen Simmons đang thu thập ý kiến qua Bluesky và Mastodon
- Cú pháp cơ bản đã ổn định, sẵn sàng để chuẩn bị áp dụng vào các dự án thực tế
2 bình luận
Vậy thì lại phải dùng riêng Grid-lanes cho Safari và grid cho Firefox đúng không. Làm ơn chuẩn hóa theo web standards một chút đi...
Ý kiến trên Hacker News
Xin dành một tràng pháo tay cho đội Safari. Việc họ bất ngờ vươn lên đứng đầu bảng xếp hạng Interop 2025 vào tháng 10 thực sự rất đáng kinh ngạc
Mong là tính năng CSS Gap Decorations sớm ra mắt. Tôi đã chán ngấy việc phải tiếp tục dùng những mẹo vá víu không cần thiết chỉ để tạo các đường viền đẹp giữa các item flex hoặc grid
Gần đây tôi dùng layout Masonry trong một dự án, hiệu năng thì ổn nhưng vì dựa trên absolute positioning nên khá là chắp vá. Phải biết trước tỷ lệ khung hình của đối tượng, và khi resize thì phải tính lại. Vì thế tôi rất mong sớm có hỗ trợ native
Những công bố kiểu này rất hay, nhưng cũng có gì đó như một màn hài kịch bi thảm. Vì Apple không cập nhật trình duyệt một cách liên tục, nên phải rất lâu sau mới tới thời điểm có thể thật sự tin tưởng và dùng các tính năng mới này
Layout Masonry nhìn thì đẹp, nhưng tôi thấy nó khiến việc nắm được toàn bộ hình ảnh chỉ trong một cái nhìn trở nên khó hơn
Tôi thắc mắc tại sao lại không gọi nó là Masonry. Dù vậy, cái tên grid-lanes cũng mang tính mô tả nên khá dễ hiểu
Tôi tò mò không biết các LLM sẽ mất bao lâu để học chính xác cú pháp CSS mới kiểu này
Nếu phải nhìn một trang web làm từ lưới văn bản với kích thước và vị trí tùy ý, tôi thà bị ai đó bắn cho xong
Ảnh demo lưới kiểu báo
Cá nhân tôi ghét layout dạng lane. Rất khó xem tuần tự mọi phần tử trong danh sách, mắt cứ phải nhảy lên xuống nên gây mệt mỏi nhận thức khá lớn
Tôi nghĩ Apple nên cho phép tải Safari một cách ổn định trên mọi nền tảng