Cascade Layers (@layer) — CSS

Perang spesifisitas adalah bug CSS paling umum. Reset CSS kalah dari Bootstrap, Bootstrap kalah dari utility class, utility class kalah dari !important…

Kalau dua aturan CSS mengatur hal yang sama di elemen yang sama, browser harus memilih satu. Biasanya yang menang selector yang lebih spesifik (specificity: #id lebih kuat dari .class, .class lebih kuat dari nama tag), dan kalau sama kuat, yang ditulis paling bawah. @layer menambah satu tingkat di atas itu: kamu kelompokkan CSS ke beberapa lapisan (layer), lalu kamu sendiri yang menentukan lapisan mana yang menang.

🧪 Tebakan cepat: aturan dengan selector #beli ada di layer awal, aturan dengan .tombol ada di layer terakhir. Mana yang menang? Tebak dulu, jawabannya ada di bagian "Urutan layer mengalahkan specificity".

Tiga layer buat satu tombol

<button id="beli" class="tombol">Beli</button>

<style>
@layer reset, theme, components;

@layer reset {
  button { background: none; border: none; }
}

@layer theme {
  button { background: navy; color: white; }
}

@layer components {
  .tombol { background: green; }
}
</style>

Hasilnya tombol hijau dengan teks putih. Ganti baris pertama jadi @layer components, theme, reset; dan sekarang reset paling kuat, jadi tombolnya kehilangan background.

Urutan layer mengalahkan specificity

Misalnya di layer theme kamu tulis #beli { background: red; }. Selector id jauh lebih spesifik dari .tombol, tapi tombolnya tetap hijau, karena components ada di urutan lebih akhir. Jawaban tebakan: .tombol yang menang.

Antar layer, yang dilihat cuma urutannya. Specificity baru dipakai buat dua aturan di dalam layer yang sama. Itulah gunanya @layer: kamu bisa menang tanpa harus menulis selector yang makin panjang.

CSS tanpa layer menang dari semua layer

Aturan yang ditulis di luar @layer mana pun mengalahkan semua aturan di dalam layer, berapa pun specificity-nya. Kalau di bawah tadi ada button { background: orange; } tanpa layer, tombolnya jadi oranye, walau .tombol di components lebih spesifik.

⚠️ Jebakan yang sering ketemu

💡 Library juga bisa dimasukkan ke layer. @import url("library.css") layer(vendor); menaruh seluruh CSS library di layer vendor. Taruh vendor di awal daftar urutan, dan CSS kamu menang tanpa !important.

TL;DR: @layer mengelompokkan CSS ke beberapa lapisan. Baris @layer reset, theme, components; menentukan urutannya: layer terakhir menang, berapa pun specificity selector di layer sebelumnya. Specificity cuma dipakai di dalam satu layer. CSS di luar layer mengalahkan semua layer.

Yang akan kamu pelajari