ภาพรวม
การจัดรูปแบบที่คำนึงถึงขนาดช่วยให้คอมโพเนนต์เปลี่ยนเลย์เอาต์หรือลักษณะที่ปรากฏตามพื้นที่ว่างที่มีอยู่ แทนที่จะเป็นขนาดของทั้งหน้าจอ ซึ่งมีประโยชน์สำหรับคอมโพเนนต์ต่างๆ เช่น การ์ดหรือแถบนำทางที่อาจวางไว้ในส่วนต่างๆ ของเลย์เอาต์ (เช่น แถบด้านข้างแคบๆ หรือพื้นที่หลักกว้างๆ)
ขอแนะนำให้ใช้การค้นหาคอนเทนเนอร์เนื่องจากจะทำให้คอมโพเนนต์เป็นโมดูลอย่างแท้จริง คุณไม่จำเป็นต้องทราบว่าคอมโพเนนต์จะอยู่ที่ใดหรือเขียนคำค้นหาสื่อที่ซับซ้อนเพื่อจัดการเลย์เอาต์ที่เป็นไปได้ทั้งหมด
การใช้งาน
1. กำหนดคอนเทนเนอร์
บังคับ: คุณต้องบอกเบราว์เซอร์ก่อนว่าองค์ประกอบใดเป็นคอนเทนเนอร์ที่จะวัด
.card-container {
/* Define the container type. Use 'inline-size' for width-based queries. */
/* You can also use 'size' for both width and height, but it requires explicit sizing. */
container-type: inline-size;
}
2. ใช้รูปแบบตามขนาดคอนเทนเนอร์
ใช้กฎ @container เพื่อใช้สไตล์เมื่อคอนเทนเนอร์มีขนาดถึงที่กำหนด
/* Default styles for small containers (stacked layout) */
.card {
display: flex;
flex-direction: column;
gap: 1rem;
}
/* Styles for larger containers (side-by-side layout) */
/* This triggers when the container is wider than 400px */
@container (min-width: 400px) {
.card {
flex-direction: row;
align-items: center;
}
.card-image {
width: 150px;
height: 150px;
}
}
3. แสดงเนื้อหาแบบมีเงื่อนไข
นอกจากนี้ คุณยังใช้การค้นหาคอนเทนเนอร์เพื่อซ่อนหรือแสดงรายละเอียดเพิ่มเติมเมื่อมีพื้นที่ว่างมากขึ้นได้ด้วย
.card-details {
/* Hide extra details by default in small spaces */
display: none;
}
@container (min-width: 600px) {
.card-details {
/* Show details when there is plenty of room */
display: block;
}
}
กลยุทธ์สำรอง
สำหรับเบราว์เซอร์ที่ไม่รองรับการค้นหาคอนเทนเนอร์ แนวทางที่ดีที่สุดคือการใช้เลย์เอาต์เริ่มต้นที่ปลอดภัย (เช่น เลย์เอาต์แนวตั้งแบบซ้อนกัน) และการเพิ่มประสิทธิภาพแบบต่อเนื่องโดยใช้การค้นหาสื่อหากขนาดหน้าจอทั่วไปอนุญาต
/* Default safe stacked layout */
.card {
display: flex;
flex-direction: column;
}
/* Fallback using media queries for older browsers */
@media (min-width: 600px) {
.card {
flex-direction: row;
}
}
/* Overwrite with container queries where supported */
@supports (container-type: inline-size) {
@media (min-width: 600px) {
.card {
/* Reset media query fallback if needed, or let container query handle it */
flex-direction: column;
}
}
@container (min-width: 400px) {
.card {
flex-direction: row;
}
}
}
ซึ่งจะช่วยให้ผู้ใช้ที่ใช้เบราว์เซอร์รุ่นเก่าได้รับเลย์เอาต์ที่ใช้งานได้ แม้ว่าจะไม่ปรับให้เข้ากับความกว้างของคอนเทนเนอร์ที่เฉพาะเจาะจงทุกรายการได้อย่างสมบูรณ์แบบก็ตาม