Menu

Float và clear trong CSS: cho chữ bao quanh ảnh

float đẩy một phần tử sang một bên và cho chữ chảy bao quanh nó, giống cách tạp chí đặt ảnh. Tìm hiểu float left, right và inline-start, clear, vì sao phần tử cha bị co lại quanh các float và display: flow-root sửa lỗi đó thế nào, cùng lý do float không còn được dùng để dàn trang.

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.

float làm gì

float đẩy một phần tử sang một bên của phần tử chứa và cho phần chữ đứng sau chảy bao quanh nó:

Margin trên hộp float giữ cho chữ không dính sát vào hộp. Margin là cách điều chỉnh khoảng cách đó; bản thân phần chữ không thể nhận margin hướng về phía float.

Các giá trị

Giá trịKết quả
none (mặc định)Không float
leftĐẩy sát mép trái
rightĐẩy sát mép phải
inline-startĐẩy về đầu dòng: bên trái trong tiếng Anh, bên phải trong tiếng Ả Rập hoặc tiếng Do Thái
inline-endĐẩy về cuối dòng

inline-start và inline-end đi theo hướng viết, nên bố cục dùng chúng sẽ tự lật đúng trên các trang viết từ phải sang trái. Một phần tử float cũng trở thành block: display: inline được đổi thành block, nên width và height có tác dụng ngay cả trên span hoặc img.

Cho ảnh float trong đoạn văn

Cách dùng kinh điển: một ảnh nằm trong bài viết, chữ chảy bao quanh. Cho mỗi ảnh float về một phía:

clear: dừng việc bao quanh

clear có nghĩa là "bắt đầu bên dưới mọi float đứng trước ở phía này". Dùng nó cho phần tử không được nằm cạnh float, chẳng hạn tiêu đề của phần tiếp theo:

Tiêu đề đầu tiên chen vào cạnh float. Tiêu đề thứ hai bắt đầu bên dưới float. clear nhận các giá trị left, right, both, inline-start, inline-end và none.

Phần tử cha bị co lại, và flow-root

Float nằm ngoài luồng bình thường, nên một phần tử chứa có toàn bộ con là float sẽ không còn gì trong luồng và co lại thành chiều cao bằng 0. Nền và viền của nó chỉ còn là một đường mảnh phía trên các float:

display: flow-root tạo một block formatting context mới, thứ luôn bao trọn các float bên trong. Code cũ dùng "clearfix" để đạt cùng kết quả:

.clearfix::after {
  content: "";
  display: block;
  clear: both;
}

overflow: hidden hoặc auto cũng chứa được float, nhưng kèm tác dụng phụ là cắt bớt nội dung; xem overflow.

Float không dùng để dàn trang

Trước khi có flexbox và grid, cả bố cục trang được dựng từ các cột float, với clearfix và phép tính chiều rộng ở khắp nơi. Thời đó đã qua: float không căn giữa được, không làm các cột cao bằng nhau được, và vỡ bố cục khi kích thước nội dung thay đổi. Dùng display: flex hoặc display: grid cho hàng và cột, còn float để dành cho việc cho chữ bao quanh một thứ gì đó. Để căn giữa một ảnh thay vì cho chữ bao quanh, xem cách căn giữa ảnh.

Bao quanh theo một hình dạng

shape-outside cho chữ chảy theo một hình dạng thay vì hình chữ nhật của float. Thuộc tính này chỉ có tác dụng trên phần tử float:

.avatar {
  float: left;
  width: 120px; height: 120px;
  border-radius: 50%;
  shape-outside: circle(50%);
  margin-inline-end: 16px;
}

Lỗi thường gặp

  • Phần tử cha có chiều cao bằng 0. Toàn bộ con của nó đều float. Thêm display: flow-root.
  • Dùng float để chia cột hoặc làm thanh điều hướng. Dùng flexbox hoặc grid.
  • Tưởng có float: center. Giá trị này không tồn tại. Căn giữa bằng flexbox, grid hoặc margin: 0 auto.
  • Nội dung sau float vẫn chảy bao quanh dù không muốn. Thêm clear: both, hoặc đặt float cùng phần chữ vào một phần tử chứa flow-root.
  • Dùng left và right vật lý trên trang đa ngôn ngữ. Dùng inline-start và inline-end để bố cục tự lật trong các ngôn ngữ viết từ phải sang trái.

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

float trong CSS dùng để làm gì?

float đưa một phần tử ra khỏi luồng bình thường và đẩy nó sát mép trái hoặc mép phải của phần tử chứa. Chữ và nội dung inline đứng sau sẽ chảy bao quanh nó.

clear dùng để làm gì?

clear đẩy một phần tử xuống dưới mọi float đứng trước nó ở phía được chỉ định: clear: left, clear: right hoặc clear: both. Đây là cách ngăn nội dung chảy cạnh một float.

Vì sao phần tử cha của một phần tử float có chiều cao bằng 0?

Float nằm ngoài luồng bình thường, nên phần tử cha chỉ có con là float sẽ không còn nội dung nào trong luồng và bị co lại. Thêm display: flow-root cho phần tử cha, nó sẽ giãn ra để chứa các float bên trong.

Clearfix là gì?

Một mẹo để phần tử cha chứa được các float bên trong, thường là pseudo-element ::after với clear: both. Ngày nay display: flow-root trên phần tử cha làm cùng việc đó chỉ trong một dòng.

Có nên dùng float để dàn trang không?

Không. Float từng được dùng để chia cột khi chưa có flexbox và grid. Hãy dùng flexbox hoặc grid để dàn trang, và giữ float cho đúng việc ban đầu của nó: cho chữ bao quanh một ảnh hoặc một đoạn trích dẫn.

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