Flexbox sắp xếp các phần tử theo một hàng hoặc một cột, căn chỉnh và chia khoảng trống dễ dàng.
- Bật flex và hiểu trục chính, trục phụ
- Dùng justify-content, align-items, gap, wrap
- Điều khiển co giãn bằng flex-grow, shrink, basis
- Làm thanh menu, thẻ, căn giữa
- Flex container
- Phần tử có
display:flex. - Flex item
- Các con trực tiếp của container.
- Trục chính (main axis)
- Hướng sắp xếp, mặc định ngang.
- Trục phụ (cross axis)
- Trục vuông góc với trục chính.
Khái niệm và lý thuyết
Flexbox dựa trên khái niệm hai trục. Container có trục chính (hướng sắp xếp, mặc định ngang theo flex-direction: row) và trục phụ vuông góc. justify-content phân bổ khoảng trống dọc theo trục chính; align-items căn theo trục phụ. Khi đổi sang column, hai trục hoán đổi nên hai thuộc tính này đổi chiều tác dụng.
Mỗi item có ba thuộc tính co giãn gộp trong flex: grow (tỉ lệ nhận phần dư), shrink (tỉ lệ bị co khi thiếu chỗ), basis (kích thước khởi đầu). Ví dụ flex: 1 1 200px nghĩa: ưu tiên rộng 200px, nếu dư thì cùng giãn, nếu thiếu thì cùng co.
Flexbox phù hợp khi kích thước do nội dung quyết định và bố cục theo một chiều: thanh menu, hàng nút, thẻ, căn giữa. Khi cần kiểm soát cả hàng lẫn cột cùng lúc, nên chuyển sang Grid.
Bật flex
.hang {
display: flex;
gap: 16px; /* khoảng cách giữa các con */
flex-direction: row; /* hoặc column */
justify-content: space-between; /* căn theo trục chính */
align-items: center; /* căn theo trục phụ */
flex-wrap: wrap; /* cho xuống dòng */
}| justify-content | Hiệu quả |
|---|---|
| flex-start | dồn về đầu |
| center | giữa |
| space-between | đều, sát hai mép |
| space-around | đều, có đệm hai bên |
| space-evenly | khoảng cách bằng nhau |
Co giãn các phần tử
.hang > .cot { flex: 1 1 200px; } /* grow shrink basis */
.hang > .rong { flex: 2; } /* rộng gấp đôi */
.hang > .co-dinh { flex: none; width: 120px; }Mẫu thường dùng
/* Căn giữa tuyệt đối */
.giua { display: flex; justify-content: center; align-items: center; min-height: 100vh; }
/* Thanh menu, logo trái, liên kết phải */
.menu { display: flex; align-items: center; }
.menu .logo { margin-right: auto; }
/* Chân trang dính đáy */
body { min-height: 100vh; display: flex; flex-direction: column; }
main { flex: 1; }Ba thẻ khóa học nằm ngang, tự xuống dòng trên điện thoại:
.khoa { display: flex; flex-wrap: wrap; gap: 20px; }
.khoa .the { flex: 1 1 260px; padding: 16px; border: 1px solid #ddd; border-radius: 12px; }Dùng trò chơi Flexbox Froggy (flexboxfroggy.com) để luyện tập vui hơn.
Khi đặt flex-direction: column, trục chính đổi thành dọc nên justify-content căn theo chiều dọc.
- Làm thanh điều hướng có logo trái, 4 liên kết phải.
- Căn giữa một hộp trong màn hình.
- Làm hàng 3 thẻ co giãn và xuống dòng.
- Flexbox dành cho bố cục một chiều.
justify-contenttheo trục chính,align-itemstheo trục phụ.gapthay margin giữa các phần tử,flex-wrapcho đáp ứng.