@container dan :has(): dua API responsif baru yang andal di Chromium 105

Kueri penampung dan :has() adalah pasangan yang sangat cocok untuk responsif. Untungnya, kedua fitur ini hadir bersama di Chromium 105. Ini adalah rilis besar dengan dua fitur yang sangat banyak diminta untuk antarmuka responsif.

Kueri Penampung: ringkasan singkat

Kueri penampung memungkinkan developer membuat kueri pemilih induk untuk informasi gaya dan ukuran, sehingga memungkinkan elemen turunan memiliki logika gaya visual yang responsif, di mana pun elemen tersebut berada di halaman web.

Daripada mengandalkan area pandang untuk input gaya seperti ruang yang tersedia, developer kini juga dapat membuat kueri ukuran elemen dalam halaman. Kemampuan ini berarti komponen memiliki logika gaya visual responsifnya. Hal ini membuat komponen jauh lebih tangguh, karena logika gaya dilampirkan ke komponen tersebut, di mana pun komponen tersebut muncul di halaman.

Menggunakan kueri penampung

Untuk mem-build dengan kueri penampung, Anda harus menetapkan pembatasan terlebih dahulu pada elemen induk. Lakukan ini dengan menetapkan container-type di penampung induk. Anda mungkin memiliki kartu dengan gambar dan beberapa konten teks yang terlihat seperti ini:

Kartu dua kolom tunggal.

Untuk membuat kueri penampung, tetapkan container-type pada penampung kartu:

.card-container {
  container-type: inline-size;
}

Menetapkan container-type ke inline-size akan mengkueri ukuran arah inline induk. Dalam bahasa latin seperti bahasa Inggris, ini akan menjadi lebar kartu, karena teks mengalir inline dari kiri ke kanan.

Sekarang, kita dapat menggunakan penampung tersebut untuk menerapkan gaya ke turunannya menggunakan @container:

.card {
  display: grid;
  grid-template-columns: 1fr 1fr;
}

@container (max-width: 400px) {
  .card {
    grid-template-columns: 1fr;
  }
}

Pemilih induk :has()

Class semu :has() CSS memungkinkan developer memeriksa apakah elemen induk berisi turunan dengan parameter tertentu.

Misalnya, p:has(span) menunjukkan pemilih paragraf (p), yang memiliki span di dalamnya. Anda dapat menggunakan ini untuk menata gaya paragraf induk itu sendiri, atau menata gaya apa pun di dalamnya. Salah satu contoh yang berguna adalah figure:has(figcaption) untuk menata gaya elemen figure yang berisi teks. Anda dapat melihat informasi selengkapnya tentang :has() di artikel ini oleh Jhey Tompkins.

Kueri penampung dan :has()

Anda dapat menggabungkan kemampuan pemilihan induk :has() dengan kemampuan kueri induk dari kueri penampung untuk membuat beberapa gaya intrinsik yang sangat dinamis.

Mari kita perluas contoh pertama dengan kartu roket. Bagaimana jika Anda memiliki kartu tanpa gambar? Mungkin Anda ingin memperbesar ukuran judul dan menyesuaikan tata letak petak menjadi satu kolom agar terlihat lebih disengaja tanpa gambar.

Teks yang lebih besar di kartu tanpa gambar, dan ditampilkan di kolom.

Dalam contoh ini, kartu dengan gambar memiliki template petak dua kolom, sedangkan kartu tanpa gambar memiliki tata letak satu kolom. Selain itu, kartu tanpa gambar memiliki judul yang lebih besar. Untuk menulisnya menggunakan :has(), gunakan CSS berikut.

.card:has(.visual) {
  grid-template-columns: 1fr 1fr;
}

Anda mencari elemen dengan class visual untuk menerapkan gaya dua kolom di atas. Fungsi CSS lainnya yang rapi adalah :not(). Ini adalah bagian dari spesifikasi yang sama dengan :has(), tetapi sudah ada lebih lama dan memiliki dukungan browser yang lebih baik. Anda bahkan dapat menggabungkan :has() dan :not(), seperti ini:

.card:not(:has(.visual)) h1 {
  font-size: 4rem;
}

Pada kode di atas, Anda menulis pemilih yang menata gaya h1 dalam kartu yang tidak berisi class visual. Inilah cara Anda dapat menyesuaikan ukuran {i>font<i} dengan sangat jelas.

Menggabungkan semuanya

Demo di atas menunjukkan kombinasi :has(), :not(), dan @container, tetapi kueri penampung benar-benar terlihat saat Anda dapat melihat elemen yang sama digunakan di beberapa tempat. Mari kita tambahkan sentuhan gaya dan tampilkan kartu ini dalam petak berdampingan.

Sekarang Anda benar-benar dapat melihat kekuatan CSS modern. Kita dapat menulis gaya yang jelas menggunakan gaya yang ditargetkan yang membuat logika di atas logika dan membuat komponen yang sangat andal. Dengan dua fitur canggih ini yang hadir di Chromium 105 dan mendapatkan momentum dukungan lintas browser, ini adalah waktu yang menyenangkan untuk menjadi developer UI.