Hướng dẫn chia cột với CSS float và clear float

Một trong những kỹ thuật rất quan trọng trong CSS Layout, một kỹ thuật mà nhiều người phải “sợ” nó, chính làm cách nào để chia cột chuẩn bằng CSS. Một website chỉ có mã nguồn HTML (không dùng các Framework như Bootstrap) thì chỉ có một cột duy nhất. Nếu như bạn muốn chia website thành hai hoặc nhiều cột thì phải làm như thế nào và rút gọn độ dài code nhất? Khi đó chúng ta cần phải dùng đến CSS và cụ thể là dùng CSS Float.

Chia cột trong CSS là gì?

Dùng CSS chia cột là bạn phải thiết lập hai hoặc nhiều phần tử con trong phân tử mẹ cùng nằm trên một hàng. Ví dụ: Trước tiên muốn chia nội dung website thành hai cột thì phải tạo 3 thẻ <div>, <div> thứ nhất mình gọi nó là container hoặc phần tử mẹ, hai <div> còn lại là là hai column (cột).

Theo thói quen của mình thường dùng class container cho id #content là vì mình mình muốn tái sử dụng class để chia cột các phần tử khác trong website. Như ví dụ trên, mình có dùng #content để chứa hai cột là #post#sidebar.
Nhiệm vụ bây giờ là làm cho #post#sidebar nằm thẳng hàng

Các bước chia cột trong CSS

Lưu ý, khi chia cột trong CSS, bạn nên làm theo đầy đủ các bước để chia cột chính xác:

  • Khi chia cột phải có phần tử mẹ bao bọc cột ví dụ như container
  • Lưu ý phải thiết lập chiều rộng cho container
  • Thiết lập chiều rộng cho hai cột trong container sao cho tổng chiều dài hai cột phải luôn ít hoặc bằng chiều rộng của container
  • Nên sử dụng thuộc tính box-sizing: border-box để tính toán kích thước chính xác nhất.
  • Sử dụng float với giá trị left và right để đẩy phần tử cột sang trái hoặc phải.
  • Tiến hành clear float

Cách chia cột trong CSS

Bây giờ cùng bắt đầu chia cột dựa theo source HTML mẫu ở trên nhé.
Đầu tiên, chúng ta tiến hành thiết lập chiều rộng và thêm một tí border (thêm cái border này để hiểu float là như thế nào) cho container

/*==Thiết lập container==*/
.container {
width: 960px;
border: 1px solid #333;
padding: 10px;
}

Bước tiếp theo là thiết lập độ rộng của #post và #sidebar. Thằng #post mình muốn nó chiếm 660px và màu mè xíu cho dễ nhìn giữa hai thằng. Còn thằng #sidebar chỉ 300px thôi.

/*==cột #post==*/
#post {
width: 660px;
height: 150px;
background: #e8e8e8;
}
/*==cột #sidebar==*/
#sidebar {
width: 300px;
height: 150px;
background: #b1b1b1;
}

Đây là kết quả đã đạt được:

chia cot voi css float

Thế là thằng #post#sidebar đã thành 2 khối rồi. Việc bây giờ là cho thằng #post nằm bên trái #sidebar, nên mình sẽ thêm một thuộc tính cho thằng #post với giá trị là left.

float: left;

Đồng thời, muốn #sidebar nhảy qua phải nên mình sẽ dùng thuộc tính float với giá trị right cho thằng #sidebar

float: right;

Sau khi thiết lập xong các thuộc tính thì hai em nó đã chung một hàng.

css float

Nhưng mà nếu như ảnh trên thì bạn có thể thấy cái container nó bị lại bên trên và hai thằng #sidebar#post đã tràn ra khỏi cái container rồi. Vậy giờ làm sao để 2 cột này nằm trong container? Bạn sẽ xử lý như thế nào? Nếu như là mình lúc mới bắt đầu vọc vạch CSS thì mình sẽ thiết lập height cho container dài thêm đủ bao hai thằng #post#siderbar. Nhưng mà cách làm của mình hoàn toàn không chuẩn một tí nào. Thứ bạn cần làm lúc đó chính là tiến hành clear: float.

Clear float hoạt động như thế nào?

Khi ta sử dụng thuộc tính float thì có nghĩa là cấu hình cho phần tử đó được đẩy sang trái hoặc phải và cho phép các phần tử gần đó có thể hiển thị bao bọc xung quanh nó. Như vấn đề ở đây là khi bạn cho toàn bộ các phần tử trong một container float hết thì nghĩa là thằng class container cũng sẽ hiển thị bao bọc xung quanh các phần tử được float, do đó nó mới bị cái lỗi buồn cười như ở trên.

Vì vậy khi tiến hành float các phần tử, việc bạn nên làm là phải tạo ra điểm kết thúc cho việc float này, nghĩa là bạn sẽ muốn nó bắt đầu không float ở đâu nữa. Thuật ngữ này chính là clear float.

Có nhiều cách clear float, tùy theo trường hợp mà chúng ta sẽ sử dụng cách phù hợp.

Cách 1: Sử dụng một thẻ div trống

Đây là một cách rất phổ biến, đó là tạo một thẻ <div> với class riêng cho việc clear float rồi đặt thẻ <div> đó ở cột cuối cùng.

Giờ mình sẽ viết một đoạn CSS cho class=”clear” như sau:

01 .clear { clear: both }

Thuộc tính clear này có nghĩa là thiết lập không cho phép các phần tử khác float xuống nó, nó có các giá trị là left right bothnone. Và chỉ nên dùng giá trị both thôi để clear cả 2 bên.

Bây giờ, mình sẽ tạo một thẻ <div> có class là clear và đặt nó ở dưới cột #sidebar(cột cuối cùng của hàng).

01
02
03
04
05
06
07
<div id="content" class="container">
   <div id="post">Nội dung của #post</div>
   <div id="sidebar">Nội dung của #sidebar</div&gt;
   <div class="clear"></div&gt;
</div>

Kết quả đạt được:

css float

Cách 2. Mình sẽ sử dụng overflow

Cách này thì phải gọi là nhanh gọn lẹ, không cần chỉnh sửa HTML mà chỉ cần viết thêm overflow: auto; cho container là được.

Kết quả chả khác gì ở trên.