Định kiểu thanh cuộn

Dùng thuộc tính scrollbar-widthscrollbar-color để tạo kiểu cho thanh cuộn.

Giới thiệu

Trên Chrome phiên bản 2, bạn có thể tạo kiểu cho thanh cuộn bằng phần tử giả ::-webkit-scrollbar-*. Phương pháp này có hiệu quả trong Chrome và Safari, nhưng chưa bao giờ được Nhóm hoạt động CSS chuẩn hoá.

Những gì được chuẩn hoá là các thuộc tính scrollbar-widthscrollbar-color, một phần của Thông số kỹ thuật cấp 1 của mô-đun tạo kiểu cho thanh cuộn CSS. Các thuộc tính này được hỗ trợ kể từ Chrome 121.

Hỗ trợ trình duyệt

  • 121
  • 121
  • 64
  • x

Nguồn

Thanh cuộn 101

Phân tích thành phần của thanh cuộn

Ở mức tối thiểu, một thanh cuộn bao gồm một bản nhạc và một nút thu nhỏ. Đường ray là phần mà ngón cái có thể di chuyển. Đường đi biểu thị toàn bộ khoảng cách cuộn. Ngón cái biểu thị vị trí hiện tại trong khu vực có thể cuộn. Khi bạn cuộn, nút này sẽ di chuyển bên trong tuyến đường. Ngón cái cũng thường kéo được.

Tuy nhiên, thanh cuộn có thể có nhiều phần ngoài phần thumb và track. Ví dụ: một thanh cuộn có thể có một hoặc nhiều nút để tăng hoặc giảm độ lệch cuộn. Các phần tạo nên thanh cuộn là do hệ điều hành cơ bản xác định.

Hình minh hoạ các bộ phận tạo nên một thanh cuộn.
Hình minh hoạ các bộ phận trong thanh cuộn. Hình minh hoạ bên trái là một thanh cuộn ở mức tối thiểu, chỉ có một track và thumb. Nút ở bên phải cũng có các nút.

Thanh cuộn kiểu cũ và lớp phủ

Trước khi tìm hiểu cách tạo kiểu cho thanh cuộn, điều quan trọng là bạn cần hiểu rõ sự khác biệt giữa hai loại thanh cuộn.

Thanh cuộn của lớp phủ

Thanh cuộn lớp phủ là thanh cuộn nổi hiển thị ở phía trên cùng của nội dung bên dưới. Quảng cáo này không xuất hiện theo mặc định mà chỉ xuất hiện khi bạn đang chủ động cuộn. Để hiển thị nội dung bên dưới, chúng thường hiển thị là bán trong suốt, nhưng điều đó tùy thuộc vào hệ điều hành quyết định. Trong khi tương tác với các ảnh đó, kích thước của chúng cũng có thể thay đổi.

Hình minh hoạ một trình duyệt có thanh cuộn của lớp phủ.
Hình minh hoạ một trình duyệt có thanh cuộn của lớp phủ. Thanh cuộn phủ lên nội dung; ngón cái trong suốt một phần.

Thanh cuộn kiểu cũ

Thanh cuộn kiểu cũ là các thanh cuộn được đặt trong một gutter thanh cuộn chuyên dụng. Máng xối của thanh cuộn là khoảng cách giữa cạnh đường viền trong và cạnh đệm ngoài. Những thanh cuộn này thường mờ đục (không trong suốt) và chiếm một phần không gian của nội dung liền kề.

Hình minh hoạ một trình duyệt có thanh cuộn cổ điển.
Hình minh hoạ một trình duyệt có thanh cuộn cổ điển. Thanh cuộn được đặt bên cạnh nội dung trong một khu vực chuyên biệt riêng; chiều rộng có sẵn của nội dung sẽ bị thu nhỏ so với chiều rộng có sẵn khi sử dụng thanh cuộn lớp phủ.

Thuộc tính scrollbar-colorscrollbar-width

Tạo màu cho thanh cuộn bằng scrollbar-color

Thuộc tính scrollbar-color cho phép bạn thay đổi bảng phối màu của thanh cuộn. Thuộc tính này chấp nhận hai giá trị <color>. Giá trị <color> đầu tiên xác định màu của thumb và giá trị thứ hai là màu để sử dụng cho bản nhạc.

.scroller {
  scrollbar-color: hotpink blue;
}

Khi sử dụng thanh cuộn của lớp phủ, màu của bản nhạc sẽ không có hiệu lực theo mặc định. Tuy nhiên, khi di chuột lên thanh cuộn, bản âm thanh đó sẽ xuất hiện.

Bản minh hoạ: Tạo kiểu thanh cuộn: scrollbar-color

Để sử dụng chế độ kết xuất mặc định do hệ điều hành cung cấp, hãy dùng auto làm giá trị.

Thay đổi kích thước của thanh cuộn bằng scrollbar-width

Thuộc tính scrollbar-width cho phép bạn chọn thanh cuộn hẹp hơn hoặc thậm chí ẩn hoàn toàn thanh cuộn mà không ảnh hưởng đến khả năng cuộn.

Giá trị được chấp nhận là auto, thinnone.

  • auto: Chiều rộng mặc định của thanh cuộn do nền tảng cung cấp.
  • thin: Một biến thể mỏng của thanh cuộn do nền tảng cung cấp hoặc thanh cuộn tuỳ chỉnh mỏng hơn thanh cuộn của nền tảng mặc định.
  • none: Ẩn hiệu quả thanh cuộn. Tuy nhiên, phần tử này vẫn có thể cuộn được.

Bạn không thể sử dụng <length> như 16px làm giá trị cho scrollbar-width.

.scroller {
  scrollbar-width: thin;
}

Khi sử dụng thanh cuộn của lớp phủ, ngón cái chỉ được vẽ khi bạn đang chủ động cuộn khu vực có thể cuộn.

Bản minh hoạ: Tạo kiểu thanh cuộn: scrollbar-width

Hỗ trợ các phiên bản trình duyệt cũ hơn

Để phục vụ cho những phiên bản trình duyệt không hỗ trợ scrollbar-colorscrollbar-width, bạn có thể sử dụng cả thuộc tính scrollbar-*::-webkit-scrollbar-* mới.

.scroller {
    --scrollbar-color-thumb: hotpink;
    --scrollbar-color-track: blue;
    --scrollbar-width: thin;
    --scrollbar-width-legacy: 10px;
}

/* Modern browsers with `scrollbar-*` support */
@supports (scrollbar-width: auto) {
    .scroller {
        scrollbar-color: var(--scrollbar-color-thumb) var(--scrollbar-color-track);
        scrollbar-width: var(--scrollbar-width);
    }
}

/* Legacy browsers with `::-webkit-scrollbar-*` support */
@supports selector(::-webkit-scrollbar) {
    .scroller::-webkit-scrollbar-thumb {
        background: var(--scrollbar-color-thumb);
    }
    .scroller::-webkit-scrollbar-track {
        background: var(--scrollbar-color-track);
    }
    .scroller::-webkit-scrollbar {
        max-width: var(--scrollbar-width-legacy);
        max-height: var(--scrollbar-width-legacy);
    }
}
Bản minh hoạ: Tạo kiểu thanh cuộn bằng scrollbar-* có phương án dự phòng cho ::-webkit-scrollbar-*

Lưu ý khi bạn đặt width hoặc height của ::-webkit-scrollbar, thanh cuộn lớp phủ sẽ luôn hiển thị, chuyển hiệu quả thành thanh cuộn cổ điển.

Để tạo ảo ảnh, bạn có thể chọn chỉ thay đổi màu sắc khi di chuột qua thanh cuộn.

.scroller::-webkit-scrollbar-thumb {
    background: transparent;
}
.scroller::-webkit-scrollbar-track {
    background: transparent;
}
.scroller:hover::-webkit-scrollbar-thumb {
    background: var(--scrollbar-color-thumb);
}
.scroller:hover::-webkit-scrollbar-track {
    background: var(--scrollbar-color-track);
}

.scroller:hover {
    --fix: ; /* This custom property invalidates styles on hover, thereby enforcing a style recomputation. This is needed to work around a bug in Safari. */
}
Bản minh hoạ: Tạo kiểu thanh cuộn bằng scrollbar-* với phương án dự phòng cho ::-webkit-scrollbar-*, chỉ áp dụng màu ::-webkit-scrollbar-* khi di chuột