- Với các bảng có nhiều hàng, càng cuộn thì càng dễ quên ý nghĩa của từng cột, khiến việc đọc dữ liệu trở nên bất tiện
- Chỉ cần thêm
position: sticky; và top: 0; vào thead là có thể triển khai cố định header
sticky có mức hỗ trợ trình duyệt khoảng 96% trên toàn cầu, nên không còn gần với một tính năng thử nghiệm
- Ngay cả khi xem các hàng ở phía dưới như mục thứ 300, tiêu đề cột vẫn còn hiển thị, giúp trải nghiệm duyệt bảng tốt hơn
- Cách triển khai tuy nhỏ nhưng hiệu quả lớn, nên với các trang web cung cấp bảng dài, đây là cải thiện tính dễ dùng cơ bản đáng áp dụng
Vấn đề header biến mất trong các bảng dài
- Với tập dữ liệu lớn hoặc bảng có hàng trăm hàng, sau khi cuộn, header của bảng sẽ biến mất khỏi màn hình
- Khi kéo xuống đến mục thứ 300, có thể sẽ khó kiểm tra lại dữ liệu của từng cột biểu thị điều gì
- Bảng càng mới với người xem thì họ càng phải vừa đọc vừa ghi nhớ ý nghĩa của các cột, làm tăng gánh nặng khi duyệt
Áp dụng sticky cho thead
- Cách giải quyết là thêm hai thuộc tính CSS vào
thead
position: sticky;
top: 0;
- Khi dùng
position: sticky cùng với top: 0, có thể cố định header ở phía trên màn hình ngay cả trong lúc cuộn
sticky có tỷ lệ hỗ trợ khoảng 96% trên toàn cầu, nên có thể dùng trên nhiều trình duyệt
- Có thể kiểm tra cách hoạt động thực tế trong ví dụ CodePen
1 bình luận
Các ý kiến trên Hacker News
Tôi chấp nhận header cố định trên một trục, nhưng vẫn đang chờ ngày CSS hỗ trợ trên cả hai trục: https://github.com/w3c/csswg-drafts/issues/8286
overflow-x: auto, nhưng lại bị bắt chọn một trong haiThú thật là dù gần như không biết CSS, tôi vẫn đang làm các web app chạy tạm ổn. Gần đây tôi đã cố định header cho một bảng quái vật khoảng 20.000 hàng: https://www.datasciencemeta.com/rpackages Ban đầu tôi kỳ vọng các class bảng của Bootstrap sẽ có thứ gì đó như
class="table table-header-sticky", nhưng không có; tôi mày mò các gợi ý từ Stack Overflow, GPT, CodePen khoảng 20 phút thì đều sinh ra tác dụng phụ kỳ lạ Thế mà với CodePen trong bài này, chỉ 2 phút là chạy được, và hiện tôi đang triển khai lên productionCố định header bảng trông có vẻ dễ chỉ với
position: sticky;, nhưng hễ bắt đầu thêm gì đó vào nội dung bảng là nó phức tạp ngay Tôi từng thêm chức năng cho một bảng có header cố định: khi người dùng cuộn phần thân rồi rời trang, lưu lại chỉ mục của hàng đầu tiên đang hiển thị và khôi phục khi quay lại, nhưng nó luôn khôi phục xuống dưới khoảng một hàng. Hóa ra hàng 5 thực ra đang ở ngay đầu bảng, nhưngtheadchồng lên nên hàng 6 trông như hàng đầu tiên Vì vậy tôi điều chỉnh vị trí cuộn có tính đến chiều caothead, nhưng đôi khi vẫn lệch vài pixel; do bảng lớn nên tôi lazy-load trong sự kiện cuộn và dùng layout bảng tự động mặc định, khiến ô header bị xuống dòng và toàn bộ chiều cao header thay đổi. Cuối cùng tôi gắn ResizeObserver vàotheadđể điều chỉnh động vị trí cuộn khi chiều cao thay đổi [1] https://developer.mozilla.org/en-US/docs/Web/API/ResizeObser...Khi triển khai cái này, nếu muốn đường viền của header cũng cố định theo, có thể xử lý bằng cách đặt
position: absolute,width: 100%,top: 0/bottom: 0,border-top/border-bottomchotable thead:beforevàtable thead:afterGiá mà header bảng tự động hoạt động như vậy. Nếu lập trình viên đã cố tình dùng các tag liên quan để làm thêm việc, thì thường rất có khả năng đây chính là hành vi họ muốn
thay vì, và bên trong mỗilại có 45 lớplồng nhau, nên chắc ở những nơi đó sẽ không ăn thuaTrên dòng lệnh, chỉ cần gửi header vào stderr, còn phần thân vào stdout Nếu không làm vậy, kết quả của
heights | sort -k2 -nrsẽ thànhGeorge 186,Wally 173,NAME HEIGHT, nhưng nếu header đi vòng qua stdout thì thứ tự sẽ làNAME HEIGHT,George 186,Wally 173heights | (sed -u 1q; sort -k2 -nr)hoạt động đúng Nguồn: https://stackoverflow.com/a/56151840heightslà file, có thể làm như% head -1 heights ; sed 1,1d heights | sort -k2 -nr; còn nếuheightslà file thực thi tốn kém khi chạy hai lần, có thể làm như% heights > /tmp/heights ; head -1 /tmp/heights ; sed 1,1d /tmp/heights | sort -k2 -nr. Pipe quaawkcũng được Các lựa chọn khác kém tiện hơn nhưng ít gây bất ngờ hơn, và vẫn hoạt động dù tác giả file thực thi nghĩ khácCách này đã không hoạt động trong một thời gian dài. Trước đây Chrome từng vô hiệu hóa
position: stickytrên các phần tửtheadvàtr: https://issues.chromium.org/issues/41303743 Tôi nhớ bảng hỗ trợ trình duyệt gần như toàn màu xanh, nhưng trên bảng trong Chrome thì lại không dùng đượcCũng có phía muốn nói rằng “làm ơn đừng làm vậy”: https://news.ycombinator.com/item?id=32998091
stickycó gì xấu?CodePen sẽ trông đẹp hơn nếu offset
topbằng độ dày đường viền. Ví dụ đặt-1pxthay vì0để tránh phần thân bảng lộ lên phía trên header So sánh: https://codepen.io/bradleytaunt/pen/bGZyJBj Bản sửa: https://codepen.io/alokmenghrajani/pen/ExMBQowTôi đề xuất dùng chiều cao viewport bị giới hạn thay cho header cố định, để header luôn hiển thị Có thể làm như DataGridXL(https://datagridxl.com). Nhân tiện, đó là thứ tôi làm ra