การจัดรูปแบบที่ปรับตามขนาด

ภาพรวม

การจัดรูปแบบที่คำนึงถึงขนาดช่วยให้คอมโพเนนต์เปลี่ยนเลย์เอาต์หรือลักษณะที่ปรากฏตามพื้นที่ว่างที่มีอยู่ แทนที่จะเป็นขนาดของทั้งหน้าจอ ซึ่งมีประโยชน์สำหรับคอมโพเนนต์ต่างๆ เช่น การ์ดหรือแถบนำทางที่อาจวางไว้ในส่วนต่างๆ ของเลย์เอาต์ (เช่น แถบด้านข้างแคบๆ หรือพื้นที่หลักกว้างๆ)

ขอแนะนำให้ใช้การค้นหาคอนเทนเนอร์เนื่องจากจะทำให้คอมโพเนนต์เป็นโมดูลอย่างแท้จริง คุณไม่จำเป็นต้องทราบว่าคอมโพเนนต์จะอยู่ที่ใดหรือเขียนคำค้นหาสื่อที่ซับซ้อนเพื่อจัดการเลย์เอาต์ที่เป็นไปได้ทั้งหมด

การใช้งาน

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;
    }
  }
}

ซึ่งจะช่วยให้ผู้ใช้ที่ใช้เบราว์เซอร์รุ่นเก่าได้รับเลย์เอาต์ที่ใช้งานได้ แม้ว่าจะไม่ปรับให้เข้ากับความกว้างของคอนเทนเนอร์ที่เฉพาะเจาะจงทุกรายการได้อย่างสมบูรณ์แบบก็ตาม