Container Queries — CSS

Coba bayangin satu kartu produk yang dipake di banyak tempat: di sidebar (sempit), di grid main content (sedang), di hero section (lebar). Pengen kartunya…

Container query bikin satu komponen ganti tampilan mengikuti lebar kotak pembungkusnya, bukan lebar layar. Kartu yang sama bisa numpuk di sidebar yang sempit dan berjajar di kolom utama yang lega, tanpa CSS tambahan. Mirip meja lipat: dibuka lebar di ruangan luas, dilipat di pojok yang sempit.

🧪 Tebakan cepat: kalau .wrapper gak diberi container-type, apa aturan di dalam @container tetap jalan? Tebak dulu, jawabannya ada di bagian "Dua langkah: tandai container, lalu tanya".

Kartu yang ikut lebar pembungkusnya

<div class="wrapper">
  <div class="card">
    <img src="foto.jpg" alt="Foto produk">
    <p>Judul kartu</p>
  </div>
</div>

<style>
.wrapper {
  container-type: inline-size;
}

@container (min-width: 350px) {
  .card {
    display: flex;
    gap: 16px;
  }
}
</style>

Hasilnya: selama .wrapper lebih sempit dari 350px, aturan di @container gak dipakai, jadi foto dan judul numpuk, foto di atas. Begitu .wrapper selebar 350px atau lebih, .card jadi flex dan fotonya pindah ke kiri judul. Lebar layarnya gak berubah sama sekali, yang berubah cuma lebar pembungkusnya.

Dua langkah: tandai container, lalu tanya

  1. Tandai pembungkusnya dengan container-type. Istilah resminya, elemen itu jadi containment context: titik acuan buat @container.
  2. Tulis @container (kondisi) { ... } berisi aturan buat elemen di dalamnya.

Jawaban tebakan: gak jalan. Tanpa container-type gak ada container yang bisa ditanya, jadi aturan di @container gak pernah dipakai, selebar apa pun pembungkusnya.

Aturan di dalam @container mengatur isi container, bukan container itu sendiri. Makanya container-type ditaruh di .wrapper, sedangkan yang berubah .card.

Nilai container-type yang perlu kamu tahu:

Beda dengan media query

Media query (@media) juga menanyakan ukuran, tapi yang ditanya viewport: lebar layar atau jendela browser. Lengkapnya ada di materi Media Queries.

Pakai @media buat tata letak seluruh halaman, dan @container buat komponen yang dipasang di banyak tempat, kayak kartu atau widget.

⚠️ Jebakan yang sering ketemu

TL;DR: Container query mengubah komponen sesuai lebar pembungkusnya, bukan lebar layar. Langkah 1: kasih pembungkusnya container-type: inline-size. Langkah 2: tulis @container (min-width: 350px) { ... } berisi aturan buat elemen di dalamnya. Tanpa container-type, @container gak pernah jalan. @media mengecek viewport, @container mengecek container.

Yang akan kamu pelajari