Hiểu và ứng dụng Flexbox để tạo bố cục web linh hoạt

Tạo bởi Hoàng Vũ, chỉnh sửa cuối lúc 20 tháng 1, 2025

Flexbox là gì?

Flexbox (Flexible Box Layout Module) là một mô-đun bố cục mạnh mẽ trong CSS, giúp xây dựng các giao diện người dùng linh hoạt và đáp ứng (responsive). Nó được thiết kế để dễ dàng căn chỉnh và phân bố không gian giữa các phần tử trong container, ngay cả khi kích thước của các phần tử không cố định.

Điểm khác biệt chính giữa Flexbox và Grid

Tiêu chí Flexbox Grid
Hướng bố cục Một chiều (row hoặc column) Hai chiều (row và column)
Ứng dụng Phù hợp với bố cục đơn giản Phù hợp với bố cục phức tạp
Định vị phần tử Không định vị phần tử cụ thể, chỉ theo thứ tự nội dung Có thể định vị phần tử tại vị trí cụ thể với grid-row và grid-column
Cách chia vùng Chỉ tập trung vào các phần tử (items) Tập trung vào cả bố cục lưới và phần tử (items)
Hỗ trợ khoảng cách gap chỉ hoạt động giữa các phần tử ngang hoặc dọc gap hỗ trợ cả khoảng cách ngang và dọc
Độ phức tạp Dễ học, phù hợp cho các bố cục nhỏ và đơn giản Học phức tạp hơn, nhưng mạnh mẽ cho bố cục toàn diện
Căn chỉnh phần tử Căn chỉnh theo chiều ngang hoặc dọc (sử dụng justify-content, align-items) Căn chỉnh theo cả hai chiều với place-content, place-items
Hiệu suất Tốt hơn với ít phần tử hơn và bố cục đơn giản Tốt hơn khi làm việc với nhiều phần tử và bố cục phức tạp
Hỗ trợ trình duyệt Hỗ trợ đầy đủ trên hầu hết các trình duyệt hiện đại Hỗ trợ tốt nhưng yêu cầu trình duyệt mới hơn

Các khái niệm cơ bản trong Flexbox

1 . Container và Items

  • Flex container: Là phần tử cha có thuộc tính display: flex hoặc display: inline-flex. Tất cả các phần tử con trực tiếp bên trong nó trở thành flex items.
  • Flex items: Các phần tử con trực tiếp bên trong flex container.

2 . Thuộc tính của Flex container

a. display

  • display: flex: Biến phần tử thành flex container theo chiều block.
  • display: inline-flex: Biến phần tử thành flex container theo chiều inline.

b. flex-direction Xác định hướng chính (main axis) mà các flex items sẽ xếp theo.

  • row (mặc định): Xếp các phần tử từ trái qua phải.
  • row-reverse: Xếp từ phải qua trái.
  • column: Xếp từ trên xuống dưới.
  • column-reverse: Xếp từ dưới lên trên.

c. justify-content Căn chỉnh các phần tử dọc theo trục chính (main axis).

  • flex-start (mặc định): Căn về đầu trục chính.
  • flex-end: Căn về cuối trục chính.
  • center: Căn giữa.
  • space-between: Chia đều khoảng cách, phần tử đầu tiên và cuối cùng sát biên.
  • space-around: Chia đều khoảng cách với khoảng trống ở hai bên.
  • space-evenly: Khoảng cách giữa các phần tử và biên bằng nhau.

d. align-items Căn chỉnh các phần tử dọc theo trục phụ (cross axis).

  • stretch (mặc định): Giãn đầy container.
  • flex-start: Căn về đầu trục phụ.
  • flex-end: Căn về cuối trục phụ.
  • center: Căn giữa.
  • baseline: Căn theo dòng cơ sở.

e. align-content Căn chỉnh nhiều dòng flex items (khi container bật wrap).

  • Các giá trị tương tự như justify-content nhưng áp dụng cho cross axis.

f. flex-wrap Quyết định các flex items có được xuống dòng khi vượt quá không gian container không.

  • nowrap (mặc định): Không xuống dòng.
  • wrap: Xuống dòng.
  • wrap-reverse: Xuống dòng nhưng đảo ngược trật tự.

3 . Thuộc tính của Flex items

a. order Xác định thứ tự sắp xếp của các phần tử. Giá trị mặc định là 0 (giá trị thấp hơn sẽ xếp trước).

b. flex Thuộc tính rút gọn của:

  • flex-grow: Tỷ lệ giãn nở khi có không gian trống.
  • flex-shrink: Tỷ lệ thu hẹp khi thiếu không gian.
  • flex-basis: Kích thước cơ bản của phần tử trước khi áp dụng giãn nở hoặc thu hẹp.

c. align-self Căn chỉnh một phần tử dọc theo trục phụ (ghi đè align-items).

Ứng dụng Flexbox trong bố cục web

1 . Tạo thanh điều hướng

<nav style="display: flex; justify-content: space-between; align-items: center;">
  <div>Logo</div>
  <ul style="display: flex; gap: 1rem;">
    <li>Home</li>
    <li>About</li>
    <li>Contact</li>
  </ul>
</nav>

2 . Tạo layout chia cột

<div style="display: flex;">
  <aside style="flex: 1; background-color: #f4f4f4;">Sidebar</aside>
  <main style="flex: 3;">Main Content</main>
</div>

3 . Căn giữa phần tử

<div style="display: flex; justify-content: center; align-items: center; height: 100vh;">
  <p>Centered Content</p>
</div>

4 . Tạo lưới sản phẩm

<div style="display: flex; flex-wrap: wrap; gap: 1rem;">
  <div style="flex: 1 1 calc(33.333% - 1rem); background-color: #eaeaea;">Item 1</div>
  <div style="flex: 1 1 calc(33.333% - 1rem); background-color: #eaeaea;">Item 2</div>
  <div style="flex: 1 1 calc(33.333% - 1rem); background-color: #eaeaea;">Item 3</div>
</div>

Ưu điểm của Flexbox

  • Dễ dàng tạo bố cục phức tạp mà không cần sử dụng float hoặc positioning.
  • Linh hoạt trong việc căn chỉnh và phân phối không gian.
  • Phù hợp với các giao diện responsive.

Hạn chế của Flexbox

  • Không tối ưu khi xử lý bố cục lưới lớn (Grid Layout phù hợp hơn).
  • Có thể khó hiểu khi kết hợp nhiều thuộc tính phức tạp.

Kết luận

Flexbox là một công cụ mạnh mẽ và linh hoạt để tạo các bố cục web hiện đại. Việc hiểu rõ các thuộc tính và cách hoạt động của nó giúp bạn dễ dàng xây dựng giao diện web đẹp mắt và tương thích với mọi kích thước màn hình.

Website Logo

Với hơn 10 năm kinh nghiệm lập trình web và từng làm việc với nhiều framework, ngôn ngữ như PHP, JavaScript, React, jQuery, CSS, HTML, CakePHP, Laravel..., tôi hy vọng những kiến thức được chia sẻ tại đây sẽ hữu ích và thiết thực cho các bạn.

Bình luận

Website Logo

Chào, tôi là Vũ. Đây là blog hướng dẫn lập trình của tôi.

Liên hệ công việc qua email dưới đây.

lhvuctu@gmail.com

Chúng Tôi Trên

Bạn đang muốn học về lập trình website?

Bạn cần nâng cao kiến thức chuyên nghiệp hơn để nâng cao cơ hội nghề nghiệp? Liên hệ