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ặcmargin: 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ứaflow-root. - Dùng
leftvàrightvật lý trên trang đa ngôn ngữ. Dùnginline-startvà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.