Menu

Variabel CSS: Custom Property, :root dan var()

Variabel CSS (custom property) menyimpan sebuah nilai satu kali lalu memakainya ulang dengan var(). Pelajari cara mendeklarasikannya di :root, mengatur cakupan dan menimpanya, memberi nilai cadangan, mengganti tema dengan JavaScript, dan menghindari jebakan nilai yang tidak valid.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

Mendeklarasikan dan memakai variabel CSS

Variabel CSS, yang secara resmi disebut custom property, adalah property yang namanya diawali --. Deklarasikan sekali, biasanya di :root supaya seluruh halaman mewarisinya, lalu baca di mana saja dengan var().

Ubah --brand menjadi #16a34a, maka border kartu dan tombolnya berubah bersamaan. Itulah intinya: satu nilai, satu tempat untuk mengubahnya. Variabel juga bisa digabungkan dengan calc(), seperti yang ditunjukkan padding samping tombol itu.

Sintaks

:root {
  --name: value;         /* declare */
}

.element {
  color: var(--name);                 /* use */
  color: var(--name, #111827);        /* use, with a fallback */
  padding: calc(var(--space) * 2);    /* compute with it */
}
AturanDetail
NamaDiawali --, lalu huruf, angka, -, atau _. Membedakan huruf besar dan kecil: --Brand tidak sama dengan --brand.
NilaiHampir apa saja: warna, panjang, daftar, string. Nilainya tidak diperiksa sampai dipakai.
Tempat deklarasiAturan mana saja. :root untuk nilai global, selector komponen untuk nilai lokal.
PewarisanCustom property diwariskan, jadi child bisa melihat nilai dari ancestor-nya.
Tempat var() berfungsiHanya di nilai property, tidak di selector, nama property, atau kondisi @media.

:root cocok dengan elemen <html>. Selector ini dipakai sebagai ganti html karena specificity-nya setara class, dan berdasarkan kebiasaan, selector ini menandakan "pengaturan global".

Cakupan: menimpa variabel per komponen

Karena variabel diwariskan, mendeklarasikan ulang sebuah variabel di sebuah elemen akan mengubahnya untuk elemen itu dan semua yang ada di dalamnya. Aturan yang memakai variabel itu tetap sama.

Varian-varian itu hanya mengatur sebuah variabel, tidak pernah mengatur border-nya langsung. Menambahkan varian keempat cukup satu baris.

Nilai cadangan

var(--name, fallback) memakai nilai cadangan saat variabelnya tidak didefinisikan di elemen itu atau di ancestor mana pun. Semua yang ada setelah koma pertama adalah nilai cadangan, jadi nilai itu sendiri boleh berisi koma (var(--font, Georgia, serif)), dan bisa berupa var() lain.

Mengubah variabel dengan JavaScript: tombol ganti tema

JavaScript bisa mengatur variabel di elemen mana pun dengan style.setProperty(). Atur di document.documentElement (elemen <html>), maka seluruh halaman ikut berubah. Pola yang lebih umum adalah mengaktifkan dan menonaktifkan class yang mendefinisikan ulang variabelnya:

Baca kembali sebuah variabel dengan getComputedStyle(element).getPropertyValue('--text'). Perhatikan bahwa setProperty menulis inline style di <html>, yang mengalahkan class .dark, jadi setelah tombol kedua ditekan, warna teksnya tetap sama di kedua tema sampai nilai inline itu dihapus dengan root.style.removeProperty('--text').

Mengirim nilai dari HTML

Variabel di atribut style adalah cara paling rapi untuk memberikan data per elemen ke stylesheet. Desainnya tetap di CSS, dan HTML hanya memberikan sebuah angka.

calc(var(--value) * 1%) mengubah angka biasa menjadi persentase. Variabel juga bisa berubah di dalam media query: @media (min-width: 900px) { :root { --space: 20px; } } membuat setiap jarak yang membaca --space membesar di layar lebar.

Jebakan nilai yang tidak valid

Browser tidak bisa tahu sebelumnya apakah sebuah variabel berisi nilai yang valid untuk property yang memakainya. Kalau ternyata tidak valid, property itu tidak kembali ke deklarasi sebelumnya di aturan tersebut. Property itu menjadi invalid at computed-value time dan berperilaku seolah-olah diatur ke unset: property yang diwariskan mengambil nilai elemen induk, sedangkan yang lain mengambil nilai awalnya.

Teksnya mewarisi 16px dari <body>, dan border-width kembali ke nilai awalnya, medium, yang digambar browser sebagai 3px. Tanpa variabel, deklarasi yang tidak valid dibuang dan deklarasi sebelumnya tetap berlaku. Dengan variabel, sudah terlambat untuk itu. Nilai cadangan tidak membantu saat variabelnya didefinisikan tetapi salah: nilai cadangan hanya untuk variabel yang tidak didefinisikan.

Variabel CSS vs variabel Sass

Variabel CSSVariabel Sass
Sintaks--brand: #2563eb; dan var(--brand)$brand: #2563eb;
Kapan nilainya ditentukanDi browser, secara langsungSaat build, hilang dari output
Berubah per elemenYa, lewat pewarisanTidak
Berubah dengan class atau media queryYaTidak
Berubah dari JavaScriptYaTidak
Dipakai di selector atau kondisi mediaTidakYa

Keduanya bisa bekerja sama: banyak proyek memakai Sass untuk logika saat build dan menghasilkan variabel CSS untuk apa pun yang bisa diganti temanya.

Kesalahan yang sering terjadi

  • Lupa dua tanda hubung. var(brand) dan --brand yang dideklarasikan sebagai -brand tidak berfungsi.
  • Memakai variabel di media query. @media (min-width: var(--bp)) tidak valid. Kondisi media butuh nilai literal.
  • Mengira deklarasi sebelumnya tetap berlaku saat variabelnya tidak valid. Tidak begitu, lihat jebakan di atas.
  • Mencampur satuan dengan cara yang salah. --gap: 10; lalu margin: var(--gap)px tidak menghasilkan 10px. Pakai calc(var(--gap) * 1px) atau simpan 10px.
  • Mendeklarasikan di elemen yang salah. Variabel yang dideklarasikan di .card tidak terlihat oleh saudara atau elemen induknya. Deklarasikan nilai bersama di :root.

Pertanyaan yang sering diajukan

Bagaimana cara mendeklarasikan variabel CSS?

Tulis property yang namanya diawali dua tanda hubung di dalam sebuah aturan, biasanya :root untuk nilai global: :root { --brand: #2563eb; }. Baca nilainya di mana saja dengan var(--brand), misalnya color: var(--brand);.

Apa itu :root di CSS?

:root adalah pseudo-class yang cocok dengan elemen root dokumen, yaitu <html> di halaman HTML. Variabel yang dideklarasikan di sana diwariskan ke setiap elemen. Specificity-nya setara class, jadi selector ini mengalahkan selector html biasa.

Bagaimana cara mengatur nilai default untuk variabel CSS?

Berikan argumen kedua ke var(): color: var(--accent, #2563eb);. Nilai cadangan ini dipakai saat --accent tidak didefinisikan di elemen itu atau ancestor-nya. Nilai cadangan tidak dipakai saat variabelnya didefinisikan dengan nilai yang tidak valid untuk property tersebut.

Bagaimana cara mengubah variabel CSS dengan JavaScript?

Panggil setProperty pada style sebuah elemen: document.documentElement.style.setProperty('--brand', '#16a34a'). Setiap aturan yang memakai var(--brand) langsung ikut berubah. Baca nilainya saat ini dengan getComputedStyle(el).getPropertyValue('--brand').

Apa perbedaan variabel CSS dan variabel Sass?

Variabel Sass diganti dengan nilainya saat stylesheet di-compile, jadi tidak bisa berubah di browser. Variabel CSS hidup di browser: bisa diwariskan, bisa berbeda per elemen, merespons media query dan class, dan bisa diubah dari JavaScript.

Apakah nama variabel CSS membedakan huruf besar dan kecil?

Ya. --Brand dan --brand adalah dua variabel yang berbeda, tidak seperti nama property biasa seperti color, yang tidak membedakan huruf besar dan kecil.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai