Menu

CSS overflow: hidden, scroll, auto, clip và dấu ba chấm

overflow quyết định điều gì xảy ra với nội dung không vừa hộp của nó: hiện ra ngoài, cắt bớt, hay thêm thanh cuộn. Tìm hiểu visible, hidden, scroll, auto và clip, overflow-x và overflow-y, dấu ba chấm cho chữ, và các tác dụng phụ của overflow lên bố cục.

Trang này có trình soạn thảo chạy trực tiếp. Sửa, chạy và xem đầu ra ngay lập tức.

overflow làm gì

Khi nội dung lớn hơn hộp của nó (chiều cao cố định, một từ dài, một bảng rộng), nội dung sẽ tràn. Thuộc tính overflow quyết định điều gì xảy ra với phần dư:

Giá trịBạn thấy gìScroll container
visible (mặc định)Nội dung tràn ra ngoài hộp và đè lên phần phía sauKhông
hiddenBị cắt ở mép padding, không có thanh cuộn (script vẫn cuộn được)Có
clipBị cắt, và không cuộn được chút nào, kể cả bằng scriptKhông
scrollLuôn hiện thanh cuộn, kể cả khi nội dung vừaCó
autoChỉ hiện thanh cuộn khi nội dung không vừaCó

Trên macOS và điện thoại, thanh cuộn nằm đè lên nội dung và mờ dần đi, nên scroll và auto có thể trông giống nhau cho đến khi bạn cuộn.

Tạo hộp có thanh cuộn

Hộp chỉ tràn khi có thứ gì đó giới hạn kích thước của nó. Một height hoặc max-height, cộng với overflow-y: auto, biến một danh sách dài thành khung cuộn:

Ở đây max-height tốt hơn height: danh sách ngắn vẫn ngắn, chỉ danh sách dài mới cuộn. Một vùng cuộn không có nội dung nào nhận focus được bên trong thì nên có tabindex="0" để người dùng bàn phím cũng cuộn được.

overflow-x và overflow-y

Hai trục có thể đặt riêng. Cách dùng phổ biến là cho một bảng rộng cuộn ngang bên trong phần tử chứa, thay vì làm rộng cả trang:

Một quy tắc cần nhớ: nếu một trục là hidden, scroll hoặc auto, giá trị visible ở trục còn lại sẽ thành auto. Vì vậy chỉ riêng overflow-x: hidden cũng có thể tạo ra thanh cuộn dọc ngoài ý muốn. overflow-x: clip thì không gây ra điều đó:

.a { overflow-x: hidden; }  /* overflow-y computes to auto */
.b { overflow-x: clip; }    /* overflow-y stays visible */

Cắt chữ bằng dấu ba chấm

text-overflow: ellipsis thay phần cuối bị cắt của một dòng bằng "…". Nó cần đủ ba điều kiện cùng lúc: chiều rộng có giới hạn, chữ không được xuống dòng, và overflow bị ẩn:

Line clamp có tiền tố -webkit- hoạt động trong Chrome, Firefox và Safari. Trình đọc màn hình vẫn đọc toàn bộ chữ, nên những từ bị cắt không mất đi với người dùng chúng.

Tác dụng phụ của overflow

Đặt overflow khác visible hoặc clip thay đổi nhiều thứ hơn là chỉ cắt nội dung:

  • Nó bao lấy float và margin của phần tử con. Phần tử tạo một block formatting context mới, nên nó lớn lên để bao các phần tử con float. display: flow-root làm được điều tương tự mà không cắt gì cả.
  • Nó làm hỏng position: sticky bên dưới. Một phần tử con sticky dính vào scroll container gần nhất; nếu container đó không cuộn, sẽ chẳng có gì dính cả.
  • Nó cắt các phần tử con được định vị tuyệt đối (khi phần tử có overflow cũng là khối chứa của chúng), gồm cả dropdown và tooltip, và nó cũng cắt bóng đổ của phần tử con.

Ẩn thanh cuộn

Bạn có thể giữ hộp cuộn được mà ẩn thanh cuộn bằng scrollbar-width: none. Hãy dùng hạn chế: không có thanh cuộn, nhiều người đọc không nhận ra còn nội dung phía sau. scrollbar-gutter: stable làm điều ngược lại: nó giữ sẵn chỗ cho thanh cuộn để nội dung không bị xê dịch khi thanh cuộn xuất hiện.

Lỗi thường gặp

  • Mong nội dung tràn mà không giới hạn kích thước. Hộp không có height hay max-height sẽ lớn lên thay vì tràn.
  • Đặt overflow: hidden trên body để "sửa" lỗi cuộn ngang. Hãy tìm phần tử bị quá rộng (thường là width cố định, một URL dài, hoặc 100vw khi có thanh cuộn).
  • Dấu ba chấm mà thiếu white-space: nowrap. Chữ xuống dòng, nên không có gì tràn theo chiều ngang và dấu ba chấm không xuất hiện.
  • overflow-x: hidden tạo ra thanh cuộn dọc. Hãy dùng clip.
  • Dropdown bị thẻ chứa nó cắt mất. overflow: hidden của thẻ đã cắt nó; hãy dời quy tắc overflow hoặc render dropdown ra bên ngoài.

Câu hỏi thường gặp

overflow: hidden có tác dụng gì?

Nó cắt phần nội dung không vừa bên trong vùng padding của phần tử, không có thanh cuộn. Phần bị ẩn vẫn có thể được cuộn tới bằng script hoặc khi focus vào thứ gì đó bên trong.

overflow auto và scroll khác nhau thế nào?

scroll luôn dành chỗ cho thanh cuộn, kể cả khi nội dung vừa. auto chỉ hiện thanh cuộn khi nội dung lớn hơn hộp, và thường đó là điều bạn muốn.

Làm sao để một div có thanh cuộn?

Giới hạn kích thước của nó và cho phép cuộn: max-height: 300px; overflow-y: auto;. Không có giới hạn height hoặc max-height, div sẽ lớn lên theo nội dung và không bao giờ tràn.

Vì sao overflow-x: hidden lại thêm cả thanh cuộn dọc?

Nếu một trục là hidden, scroll hoặc auto, giá trị visible ở trục còn lại được tính thành auto. Hãy dùng overflow-x: clip, vì nó không tạo scroll container và giữ trục còn lại ở visible.

Làm sao thêm dấu ba chấm (...) cho chữ bị tràn?

Với một dòng: white-space: nowrap; overflow: hidden; text-overflow: ellipsis; trên phần tử có chiều rộng giới hạn. Với nhiều dòng, dùng display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 3; overflow: hidden;.

Hình minh họa các ngôn ngữ lập trình của Coddy

Học lập trình cùng Coddy

Bắt đầu