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 */
}
| Aturan | Detail |
|---|---|
| Nama | Diawali --, lalu huruf, angka, -, atau _. Membedakan huruf besar dan kecil: --Brand tidak sama dengan --brand. |
| Nilai | Hampir apa saja: warna, panjang, daftar, string. Nilainya tidak diperiksa sampai dipakai. |
| Tempat deklarasi | Aturan mana saja. :root untuk nilai global, selector komponen untuk nilai lokal. |
| Pewarisan | Custom property diwariskan, jadi child bisa melihat nilai dari ancestor-nya. |
Tempat var() berfungsi | Hanya 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 CSS | Variabel Sass | |
|---|---|---|
| Sintaks | --brand: #2563eb; dan var(--brand) | $brand: #2563eb; |
| Kapan nilainya ditentukan | Di browser, secara langsung | Saat build, hilang dari output |
| Berubah per elemen | Ya, lewat pewarisan | Tidak |
| Berubah dengan class atau media query | Ya | Tidak |
| Berubah dari JavaScript | Ya | Tidak |
| Dipakai di selector atau kondisi media | Tidak | Ya |
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--brandyang dideklarasikan sebagai-brandtidak 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;lalumargin: var(--gap)pxtidak menghasilkan10px. Pakaicalc(var(--gap) * 1px)atau simpan10px. - Mendeklarasikan di elemen yang salah. Variabel yang dideklarasikan di
.cardtidak 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.