Bố cục vi mô

Khi nghĩ đến bố cục, chúng ta thường nghĩ đến thiết kế ở cấp trang. Nhưng các thành phần nhỏ hơn trong trang có thể có bố cục độc lập riêng.

Lý tưởng nhất là những bố cục ở cấp thành phần này sẽ tự động điều chỉnh, bất kể vị trí của chúng trên trang. Có thể có những trường hợp bạn không biết liệu một thành phần sẽ được đặt vào cột nội dung chính, thanh bên hay cả hai. Nếu không biết chắc chắn thành phần sẽ kết thúc ở đâu, bạn cần đảm bảo rằng thành phần có thể tự điều chỉnh theo vùng chứa của nó.

Bố cục hai cột, một cột rộng và một cột hẹp. Các đối tượng đa phương tiện được bố trí khác nhau tuỳ thuộc vào việc chúng nằm trong cột rộng hay cột hẹp.

Lưới

Lưới CSS không chỉ dành cho bố cục cấp trang. Điều này cũng phù hợp với các thành phần nằm trong đó.

Trong ví dụ này, giả phần tử ::before::after tạo các đường trang trí ở hai bên tiêu đề. Bản thân tiêu đề là một vùng chứa lưới. Các phần tử riêng lẻ được bố trí sao cho các đường kẻ luôn lấp đầy khoảng trống có sẵn.

h1 {
  display: grid;
  grid-template-columns: 1fr auto 1fr;
  gap: 1em;
}
h1::before,
h1::after {
  content: "";
  border-top: 0.1em double black;
  align-self: center;
}
Công cụ cho nhà phát triển trong Firefox cho thấy một lớp phủ dạng lưới. Công cụ dành cho nhà phát triển trong Chrome cho thấy một lớp phủ lưới.
Các trình duyệt dành cho máy tính như Firefox và Chrome có công cụ cho nhà phát triển có thể cho bạn thấy các đường lưới và vùng được phủ lên thiết kế của bạn.

Tìm hiểu cách kiểm tra bố cục dạng lưới trong Chrome DevTools.

Flexbox

Như tên gọi, bạn có thể dùng flexbox để làm cho các thành phần của bạn linh hoạt. Bạn có thể khai báo những phần tử nào trong thành phần của bạn phải có kích thước tối thiểu hoặc tối đa và cho phép các phần tử khác linh hoạt điều chỉnh cho phù hợp.

Trong ví dụ này, hình ảnh chiếm 1/4 không gian có sẵn và văn bản chiếm 3/4 còn lại. Tuy nhiên, hình ảnh không bao giờ lớn hơn 200 pixel.

.media {
  display: flex;
  align-items: center;
  gap: 1em;
}
.media-illustration {
  flex: 1;
  max-inline-size: 200px;
}
.media-content {
  flex: 3;
}
Các công cụ dành cho nhà phát triển trong Firefox cho thấy một lớp phủ flexbox. Công cụ dành cho nhà phát triển trong Chrome cho thấy một lớp phủ flexbox.
Các công cụ dành cho nhà phát triển trong Firefox và Chrome có thể giúp bạn hình dung hình dạng của các thành phần flexbox.

Tìm hiểu cách kiểm tra bố cục flexbox trong Chrome DevTools.

Truy vấn vùng chứa

Flexbox giúp bạn thiết kế từ nội dung. Bạn có thể chỉ định các thông số của phần tử (độ hẹp, độ rộng) và để trình duyệt tìm ra cách triển khai cuối cùng.

Nhưng bản thân thành phần này không nhận biết được bối cảnh của nó. Nó không biết liệu có đang được dùng trong nội dung chính hay trong một thanh bên hay không. Điều này có thể khiến bố cục thành phần phức tạp hơn bố cục trang. Để có thể áp dụng các kiểu phù hợp theo ngữ cảnh, các thành phần của bạn cần biết nhiều hơn kích thước của khung hiển thị mà chúng nằm trong.

Với bố cục trang, bạn biết chiều rộng của vùng chứa vì vùng chứa là cửa sổ xem của trình duyệt; truy vấn nội dung nghe nhìn báo cáo kích thước của vùng chứa cấp trang.

Để báo cáo kích thước của bất kỳ vùng chứa nào, hãy sử dụng truy vấn vùng chứa.

Để bắt đầu, hãy xác định những phần tử đóng vai trò là vùng chứa.

main,
aside {
  container-type: inline-size;
}

Điều này có nghĩa là bạn muốn truy vấn phương diện nội tuyến. Đối với các tài liệu bằng tiếng Anh, đó là trục ngang. Bạn sẽ thay đổi kiểu dựa trên chiều rộng của vùng chứa.

Nếu một thành phần nằm trong một trong các vùng chứa đó, bạn có thể áp dụng các kiểu tương tự như cách bạn áp dụng truy vấn nội dung nghe nhìn.

.media-illustration {
  max-width: 200px;
  margin: auto;
}

@container (min-width: 25em) {
  .media {
    display: flex;
    align-items: center;
    gap: 1em;
  }

  .media-illustration {
    flex: 1;
  }

  .media-content {
    flex: 3;
  }
}

Nếu một đối tượng đa phương tiện nằm trong một vùng chứa hẹp hơn 25em, thì các kiểu flexbox sẽ không được áp dụng. Hình ảnh và văn bản xuất hiện theo thứ tự dọc.

Tuy nhiên, nếu phần tử chứa rộng hơn 25em, thì hình ảnh và văn bản sẽ xuất hiện cạnh nhau.

Với truy vấn vùng chứa, bạn có thể tạo kiểu cho các thành phần một cách độc lập. Bạn có thể viết các quy tắc dựa trên chiều rộng của phần tử chứa; chiều rộng của khung hiển thị không còn quan trọng nữa.

Hai hộp chứa có kích thước khác nhau.

Kết hợp các truy vấn

Bạn có thể dùng truy vấn nội dung nghe nhìn cho bố cục trang và truy vấn vùng chứa cho các thành phần trong trang.

Trong đó, cấu trúc tổng thể của trang có một phần tử main và một phần tử aside. Có các đối tượng đa phương tiện trong cả hai phần tử.

<body>
  <main>
     <div class="media">…</div>
     <div class="media">…</div>
  </main>
  <aside>
     <div class="media">…</div>
  </aside>
</body>

Truy vấn phương tiện áp dụng bố cục dạng lưới cho các phần tử mainaside khi khung nhìn rộng hơn 45em.

@media (min-width: 45em) {
  body {
    display: grid;
    grid-template-columns: 3fr 1fr;
  }
}

Quy tắc truy vấn vùng chứa cho các đối tượng đa phương tiện vẫn giữ nguyên: chỉ áp dụng bố cục flexbox ngang nếu phần tử chứa rộng hơn 25em.

Bố cục hai cột, một cột rộng và một cột hẹp.
Các đối tượng đa phương tiện được bố trí khác nhau tuỳ thuộc vào việc chúng nằm trong cột rộng hay cột hẹp.

Truy vấn vùng chứa là một yếu tố thay đổi cuộc chơi đối với bố cục vi mô. Các thành phần của bạn có thể độc lập và không phụ thuộc vào khung hiển thị của trình duyệt.

Kiểm tra kiến thức của bạn

Kiểm tra kiến thức của bạn về bố cục vi mô.

Lưới và flexbox đều hữu ích cho bố cục vi mô?

Đúng
🎉 Chính xác!
Sai
Sai. Lưới và flexbox đều rất hữu ích, ngay cả đối với bố cục "nhỏ nhất".

Trước đây, bạn đã tìm hiểu về bố cục macro ở cấp trang. Giờ bạn đã biết về bố cục siêu nhỏ ở cấp thành phần.

Tiếp theo, bạn sẽ tìm hiểu sâu hơn về các khối xây dựng cơ bản của nội dung và tìm hiểu cách tạo hình ảnh thích ứng. Trước tiên, bạn sẽ tìm hiểu về kiểu chữ thích ứng.