Article Title
Lorem ipsum dolor sit amet, consectetur adipiscing elit...
Khám phá CSS Container Queries, một bước tiến mới trong thiết kế responsive. Tìm hiểu cách tạo các thành phần thích ứng dựa trên kích thước container, không chỉ kích thước viewport.
Thiết kế responsive đã là nền tảng của phát triển web trong hơn một thập kỷ. Theo truyền thống, chúng ta dựa vào media queries để điều chỉnh bố cục dựa trên kích thước viewport. Tuy nhiên, phương pháp này đôi khi có thể cảm thấy hạn chế, đặc biệt khi xử lý các thiết kế dựa trên thành phần phức tạp. Hãy cùng khám phá CSS Container Queries – một tính năng mới mạnh mẽ cho phép các thành phần thích ứng dựa trên kích thước của phần tử chứa, chứ không chỉ viewport.
Container queries là một yếu tố thay đổi cuộc chơi vì chúng cho phép thiết kế responsive dựa trên phần tử. Thay vì hỏi "Kích thước màn hình là bao nhiêu?", bạn có thể hỏi "Thành phần này có bao nhiêu không gian trống?". Điều này mở ra một thế giới khả năng để tạo ra các thành phần có thể tái sử dụng và thích ứng thực sự.
Hãy nghĩ về một thành phần thẻ có thể xuất hiện trong nhiều ngữ cảnh khác nhau: một thanh bên hẹp, một phần hero rộng hoặc một lưới nhiều cột. Với media queries, bạn cần viết các quy tắc cụ thể cho từng tình huống này dựa trên chiều rộng viewport. Với container queries, thẻ có thể điều chỉnh một cách thông minh bố cục và kiểu dáng của nó dựa trên kích thước của container cha, bất kể kích thước màn hình tổng thể.
Container queries cung cấp một số lợi thế chính so với media queries truyền thống:
Hãy đi sâu vào các khía cạnh thực tế của việc sử dụng container queries. Bước đầu tiên là khai báo một container. Bạn có thể thực hiện việc này bằng cách sử dụng thuộc tính container-type trên phần tử cha:
Thuộc tính container-type chấp nhận một số giá trị:
size: Container queries sẽ phản hồi cả kích thước inline và block của container.inline-size: Container queries sẽ chỉ phản hồi kích thước inline (chiều rộng trong các chế độ viết ngang) của container. Đây là tùy chọn phổ biến nhất và thường hữu ích nhất.block-size: Container queries sẽ chỉ phản hồi kích thước block (chiều cao trong các chế độ viết ngang) của container.normal: Phần tử không phải là container truy vấn. Đây là giá trị mặc định.style: Container queries sẽ phản hồi các truy vấn kiểu và truy vấn tên container (được đề cập sau), cho phép bạn truy vấn các thuộc tính tùy chỉnh được đặt trên container.Dưới đây là một ví dụ về việc xác định một container phản hồi kích thước inline của nó:
.card-container {
container-type: inline-size;
}
Bạn cũng có thể sử dụng thuộc tính shorthand container để chỉ định cả container-type và container-name (mà chúng ta sẽ thảo luận sau) trong một khai báo duy nhất:
.card-container {
container: card / inline-size;
}
Trong trường hợp này, 'card' là tên container.
Sau khi bạn đã xác định một container, bạn có thể sử dụng quy tắc @container để viết các truy vấn của mình. Cú pháp tương tự như media queries, nhưng thay vì nhắm mục tiêu đến kích thước viewport, bạn đang nhắm mục tiêu đến kích thước của container:
@container card (min-width: 400px) {
.card {
flex-direction: row;
}
.card__image {
width: 50%;
}
.card__content {
width: 50%;
}
}
Trong ví dụ này, chúng ta đang nhắm mục tiêu đến container "card" và áp dụng kiểu cho các phần tử .card, .card__image và .card__content khi chiều rộng của container ít nhất là 400px. Lưu ý `card` trước `(min-width: 400px)`. Điều này rất quan trọng khi bạn đã đặt tên cho container của mình bằng `container-name` hoặc thuộc tính shorthand `container`.
Nếu bạn chưa đặt tên cho container của mình, bạn có thể bỏ qua tên container:
@container (min-width: 400px) {
.card {
flex-direction: row;
}
.card__image {
width: 50%;
}
.card__content {
width: 50%;
}
}
Bạn có thể sử dụng cùng một phạm vi các tính năng media có sẵn trong media queries, chẳng hạn như min-width, max-width, min-height, max-height và orientation.
Đặt tên cho container của bạn có thể hữu ích, đặc biệt khi xử lý các container lồng nhau hoặc bố cục phức tạp. Bạn có thể gán tên cho một container bằng thuộc tính container-name:
.card-container {
container-name: card;
container-type: inline-size;
}
Sau đó, trong container queries của bạn, bạn có thể nhắm mục tiêu container theo tên của nó:
@container card (min-width: 400px) {
/* Kiểu cho container 'card' */
}
Container Style Queries cho phép bạn phản ứng với kiểu của container thay vì kích thước của nó. Điều này đặc biệt mạnh mẽ khi kết hợp với các thuộc tính tùy chỉnh. Trước tiên, bạn phải xác định container của mình với container-type: style:
.component-container {
container-type: style;
}
Sau đó, bạn có thể sử dụng @container style(--theme: dark) để truy vấn giá trị của thuộc tính tùy chỉnh --theme:
.component-container {
--theme: light;
}
@container style(--theme: dark) {
.component {
background-color: black;
color: white;
}
}
Điều này cho phép các thành phần của bạn thích ứng dựa trên cấu hình được đặt thông qua CSS thay vì kích thước viewport. Điều này mở ra những khả năng tuyệt vời cho việc tạo theme và kiểu dáng động.
Hãy xem một số ví dụ cụ thể về cách container queries có thể được sử dụng trong các tình huống thực tế:
Hãy tưởng tượng một thành phần thẻ hiển thị thông tin về một sản phẩm. Trong một container hẹp, chúng ta có thể muốn xếp chồng hình ảnh và nội dung theo chiều dọc. Trong một container rộng hơn, chúng ta có thể hiển thị chúng cạnh nhau.
HTML:
CSS:
.card-container {
container-type: inline-size;
}
.card {
display: flex;
flex-direction: column;
border: 1px solid #ccc;
padding: 16px;
}
.card__image {
width: 100%;
margin-bottom: 16px;
}
.card__content {
width: 100%;
}
@container (min-width: 400px) {
.card {
flex-direction: row;
}
.card__image {
width: 50%;
margin-bottom: 0;
}
.card__content {
width: 50%;
}
}
Trong ví dụ này, thẻ ban đầu sẽ hiển thị hình ảnh và nội dung được xếp chồng theo chiều dọc. Khi chiều rộng của container đạt 400px, thẻ sẽ chuyển sang bố cục ngang.
Hãy xem xét một menu điều hướng cần thích ứng dựa trên không gian có sẵn. Trong một container hẹp (ví dụ: thanh bên trên thiết bị di động), chúng ta có thể muốn hiển thị các mục menu trong một danh sách dọc. Trong một container rộng hơn (ví dụ: header trên máy tính để bàn), chúng ta có thể hiển thị chúng theo chiều ngang.
HTML:
CSS:
.nav-container {
container-type: inline-size;
}
.nav {
list-style: none;
padding: 0;
margin: 0;
}
.nav__item {
margin-bottom: 8px;
}
.nav__item a {
display: block;
padding: 8px 16px;
text-decoration: none;
color: #333;
}
@container (min-width: 600px) {
.nav {
display: flex;
}
.nav__item {
margin-right: 16px;
margin-bottom: 0;
}
.nav__item a {
display: inline-block;
}
}
Trong ví dụ này, menu điều hướng ban đầu sẽ hiển thị các mục trong một danh sách dọc. Khi chiều rộng của container đạt 600px, menu sẽ chuyển sang bố cục ngang.
Hãy tưởng tượng một bố cục bài viết cần thích ứng tùy thuộc vào vị trí của nó. Nếu ở trong một phần xem trước nhỏ, hình ảnh sẽ ở trên văn bản. Nếu là bài viết chính, hình ảnh có thể ở bên cạnh.
HTML
Article Title
Lorem ipsum dolor sit amet, consectetur adipiscing elit...
CSS
.article-container {
container-type: inline-size;
}
.article {
display: flex;
flex-direction: column;
}
.article-image {
width: 100%;
margin-bottom: 10px;
}
.article-content {
width: 100%;
}
@container (min-width: 768px) {
.article {
flex-direction: row;
}
.article-image {
width: 40%;
margin-right: 20px;
margin-bottom: 0;
}
.article-content {
width: 60%;
}
}
Hỗ trợ trình duyệt cho container queries hiện đã xuất sắc trên các trình duyệt hiện đại, bao gồm Chrome, Firefox, Safari và Edge. Điều quan trọng là phải kiểm tra Can I Use để biết thông tin hỗ trợ trình duyệt mới nhất, vì các tính năng và chi tiết triển khai có thể phát triển.
Mặc dù container queries cung cấp một giải pháp thay thế mạnh mẽ cho media queries, nhưng điều quan trọng là phải hiểu phương pháp nào phù hợp nhất.
Trong nhiều trường hợp, bạn có thể sử dụng kết hợp cả media queries và container queries. Sử dụng media queries để thiết lập bố cục tổng thể của ứng dụng và sau đó sử dụng container queries để tinh chỉnh giao diện và hành vi của các thành phần riêng lẻ trong bố cục đó.
CSS Container Queries đại diện cho một bước tiến quan trọng trong quá trình phát triển của thiết kế responsive. Bằng cách cho phép khả năng phản hồi dựa trên phần tử, chúng trao quyền cho các nhà phát triển tạo ra các thành phần linh hoạt, có thể tái sử dụng và dễ bảo trì hơn. Khi hỗ trợ trình duyệt tiếp tục được cải thiện, container queries sẵn sàng trở thành một công cụ thiết yếu trong kho vũ khí của mọi nhà phát triển web.
Khi triển khai container queries cho đối tượng toàn cầu, hãy xem xét những điều sau:
inline-start và inline-end thay vì các thuộc tính vật lý như left và right.em, rem) để đảm bảo văn bản của bạn được chia tỷ lệ phù hợp.CSS Container Queries là một công cụ mạnh mẽ để xây dựng các ứng dụng web thực sự responsive và dễ thích ứng. Bằng cách chấp nhận thiết kế responsive dựa trên phần tử, bạn có thể tạo các thành phần thích ứng liền mạch với các ngữ cảnh khác nhau, đơn giản hóa mã của bạn và cải thiện trải nghiệm người dùng tổng thể. Khi hỗ trợ trình duyệt tiếp tục tăng lên, container queries sẵn sàng trở thành một phần cơ bản của phát triển web hiện đại. Hãy nắm bắt công nghệ này, thử nghiệm các khả năng của nó và mở khóa một mức độ linh hoạt mới trong các thiết kế responsive của bạn. Cách tiếp cận này cho phép khả năng tái sử dụng thành phần, khả năng bảo trì và quy trình thiết kế trực quan hơn, khiến nó trở thành một tài sản vô giá cho các nhà phát triển front-end trên toàn thế giới. Quá trình chuyển đổi sang container queries khuyến khích một cách tiếp cận thiết kế tập trung vào thành phần hơn, dẫn đến trải nghiệm web mạnh mẽ và dễ thích ứng hơn cho người dùng trên toàn cầu.