Model warna HSL
(hue, saturation, lightness) memberikan cara yang jauh lebih mudah dibaca oleh developer untuk bekerja dengan warna di CSS dibandingkan RGB. Daripada menebak kombinasi nilai merah, hijau, dan biru yang menghasilkan warna yang kamu inginkan, HSL memungkinkan kamu mendeskripsikan warna sesuai cara otak manusia berpikir: pilih warnanya, tentukan seberapa cerah atau pudar, lalu tentukan seberapa terang atau gelap. Pergeseran cara berpikir inilah yang membuat banyak developer meninggalkan
rgb()
dan beralih ke
hsl()
.
Daftar Isi
RGB vs HSL - Perbedaan Mendasar
RGB mendefinisikan warna dengan mencampur tiga kanal cahaya: merah, hijau, dan biru, masing-masing dalam skala 0 hingga 255. Masalahnya, inilah cara layar merender piksel, bukan cara manusia mempersepsi warna. Jika kamu ingin warna biru yang sedikit lebih terang di RGB, kamu harus menaikkan ketiga kanal dengan proporsi yang tepat - tidak ada satu nilai tunggal yang bisa diubah saja.
HSL memetakan langsung ke cara manusia mendeskripsikan warna dalam percakapan sehari-hari:
- Hue - warna itu sendiri, dinyatakan sebagai derajat pada roda warna 360 derajat. Merah berada di 0, hijau di 120, biru di 240.
- Saturation - seberapa cerah atau pudar warnanya, dari 0% (abu-abu murni) hingga 100% (warna penuh).
- Lightness - seberapa terang atau gelap warnanya, dari 0% (hitam) hingga 100% (putih), dengan 50% sebagai warna "murni".
Berikut contoh warna biru sedang yang ditulis dalam kedua format:
/* RGB - what do these numbers even mean at a glance? */
color: rgb(70, 130, 180);
/* HSL - instantly readable: blue hue, moderate saturation, medium lightness */
color: hsl(207, 44%, 49%);
Keduanya menghasilkan warna biru baja yang sama. Namun hanya versi HSL yang langsung memberikan informasi berguna. Hue-nya 207 (kebiruan), saturation sedang di 44%, dan lightness berada di tengah-tengah pada 49%. Kamu bisa memahaminya tanpa perlu membuka color picker.
| Properti | RGB | HSL |
|---|---|---|
| Mudah dibaca manusia | Jarang | Ya |
| Mencerahkan/menggelapkan warna | Ubah 3 nilai sekaligus | Ubah lightness saja |
| Mengubah saturation | Hitung ulang ketiganya | Ubah saturation saja |
| Membuat palet warna | Coba-coba | Putar hue dalam derajat |
| Theming dengan variabel CSS | Rumit dan bertele-tele | Bersih dan mudah diprediksi |
Sintaks HSL di CSS
Fungsi CSS
hsl()
sudah didukung sejak CSS3. Sintaks modern (CSS Color Level 4) juga mengizinkan parameter alpha keempat langsung di dalam
hsl()
, sehingga
hsla()
kini sebagian besar sudah tidak diperlukan lagi:
/* Classic syntax */
color: hsl(207, 44%, 49%);
/* With alpha (transparency) - old way */
color: hsla(207, 44%, 49%, 0.8);
/* Modern CSS Color Level 4 syntax - commas optional, alpha with slash */
color: hsl(207 44% 49%);
color: hsl(207 44% 49% / 0.8);
color: hsl(207 44% 49% / 80%);
Semua browser utama mendukung kedua sintaks tersebut. Versi tanpa koma adalah arah yang dituju CSS ke depan, namun versi dengan koma tetap berfungsi di mana saja termasuk Internet Explorer 9+.
Mengapa HSL Lebih Unggul untuk Pengembangan UI
Kekuatan nyata HSL terlihat begitu kamu perlu membuat variasi warna - yang terjadi terus-menerus dalam pekerjaan UI.
Membangun palet warna dalam hitungan detik
Misalnya warna brand kamu adalah hijau cerah di
hsl(140, 70%, 45%)
. Kamu butuh hover state, disabled state, dan tint latar belakang yang lebih terang. Dengan HSL, kamu hanya mengubah satu nilai setiap kali:
--color-base: hsl(140, 70%, 45%); /* base green */
--color-hover: hsl(140, 70%, 38%); /* darker - just lower lightness */
--color-disabled: hsl(140, 20%, 65%); /* washed out - lower saturation */
--color-tint: hsl(140, 70%, 92%); /* very light background tint */
Coba lakukan hal yang sama secara konsisten di RGB tanpa color picker. Itu benar-benar sulit karena tidak ada sumbu yang terisolasi untuk diubah.
Warna analogus dan komplementer
Karena hue adalah derajat pada roda warna, menghasilkan palet yang harmonis hanyalah soal aritmatika. Warna analogus berada dalam jarak 30 derajat satu sama lain. Warna komplementer berjarak 180 derajat:
--primary: hsl(210, 80%, 50%); /* blue */
--analogous-1: hsl(180, 80%, 50%); /* cyan - 30 degrees left */
--analogous-2: hsl(240, 80%, 50%); /* purple - 30 degrees right */
--complementary: hsl(30, 80%, 50%); /* orange - 180 degrees opposite */
Saturation dan lightness tetap sama, sehingga warna-warna tersebut terasa seperti satu keluarga yang kohesif. Inilah persis cara design system seperti Tailwind CSS dan Material Design menghasilkan skala warna mereka secara programatik.
Contoh Praktis CSS
Custom property CSS dengan komponen HSL
Salah satu pola HSL paling powerful adalah memisahkan ketiga nilai menjadi custom property CSS tersendiri. Ini memungkinkan kamu merakitnya kembali di mana saja dan mengubah kanal individual secara dinamis:
:root {
--brand-h: 210;
--brand-s: 80%;
--brand-l: 50%;
--brand-color: hsl(var(--brand-h), var(--brand-s), var(--brand-l));
}
.button {
background-color: var(--brand-color);
}
.button:hover {
/* Just override lightness - no need to redefine the whole color */
background-color: hsl(var(--brand-h), var(--brand-s), 40%);
}
.button:disabled {
background-color: hsl(var(--brand-h), 20%, 70%);
}
hsl()
, kamu perlu menggunakan koma:
hsl(var(--h), var(--s), var(--l))
. Sintaks modern tanpa koma belum berfungsi dengan
var()
di dalam
hsl()
di semua browser.
Membuat skala tonal lengkap
Design system sering membutuhkan 9-10 nuansa dari satu warna (seperti skala 50 hingga 950 milik Tailwind). Dengan HSL, kamu bisa menghasilkan seluruh skala dengan melangkah lightness pada interval teratur sambil mempertahankan hue dan saturation yang sama:
:root {
--blue-50: hsl(210, 80%, 95%);
--blue-100: hsl(210, 80%, 87%);
--blue-200: hsl(210, 80%, 76%);
--blue-300: hsl(210, 80%, 65%);
--blue-400: hsl(210, 80%, 55%);
--blue-500: hsl(210, 80%, 50%); /* base */
--blue-600: hsl(210, 80%, 43%);
--blue-700: hsl(210, 80%, 36%);
--blue-800: hsl(210, 80%, 26%);
--blue-900: hsl(210, 80%, 16%);
}
Untuk pemahaman lebih mendalam tentang hubungan antar format warna, panduan konversi HEX ke RGB membahas gambaran lengkap format warna CSS termasuk kapan masing-masing format adalah pilihan yang tepat.
Hover State, Theming, dan Dark Mode
Hover state dan focus state
HSL membuat hover state menjadi sangat mudah. Daripada mendefinisikan warna yang sepenuhnya berbeda, kamu cukup menggeser lightness-nya:
.btn-primary {
background: hsl(210, 80%, 50%);
transition: background 0.2s ease;
}
.btn-primary:hover { background: hsl(210, 80%, 43%); }
.btn-primary:active { background: hsl(210, 80%, 36%); }
.btn-primary:focus-visible {
outline: 3px solid hsl(210, 80%, 70%);
}
Setiap state jelas berkaitan dengan warna dasarnya. Rekan kerja yang membaca kode ini langsung memahami hubungan antar state.
Theming dengan variabel HSL
HSL adalah tulang punggung theming CSS modern. Dengan mengekspos hue sebagai variabel, kamu bisa membiarkan pengguna atau admin mengubah seluruh skema warna aplikasi hanya dengan mengubah satu angka:
/* Default theme: blue */
:root {
--theme-hue: 210;
}
/* Green theme - just swap the hue */
[data-theme="green"] {
--theme-hue: 140;
}
/* Purple theme */
[data-theme="purple"] {
--theme-hue: 270;
}
/* All components use the same hue variable */
.button { background: hsl(var(--theme-hue), 75%, 50%); }
.link { color: hsl(var(--theme-hue), 75%, 40%); }
.badge { background: hsl(var(--theme-hue), 75%, 92%); color: hsl(var(--theme-hue), 75%, 25%); }
.focus-ring { outline-color: hsl(var(--theme-hue), 75%, 65%); }
Dark mode dengan HSL
Dark mode adalah area di mana HSL benar-benar unggul. Daripada mempertahankan dua palet warna yang sepenuhnya terpisah, kamu cukup membalik nilai lightness dalam hue yang sama:
:root {
--bg: hsl(210, 20%, 98%); /* near-white background */
--text: hsl(210, 20%, 15%); /* near-black text */
--card: hsl(210, 20%, 93%); /* slightly darker card */
}
@media (prefers-color-scheme: dark) {
:root {
--bg: hsl(210, 20%, 10%); /* flip: near-black background */
--text: hsl(210, 20%, 90%); /* flip: near-white text */
--card: hsl(210, 20%, 15%); /* slightly lighter card in dark */
}
}
Perhatikan bahwa hue (210) dan saturation (20%) tidak pernah berubah. Hanya lightness yang dibalik. Ini membuat dark mode terasa seperti desain yang sama, hanya dibalikkan - dan itulah yang seharusnya dilakukan dark mode yang baik.
Dukungan Browser dan Kompatibilitas
HSL memiliki dukungan browser yang sangat baik. Fungsi
hsl()
telah tersedia sejak:
- Chrome 1 (2008)
- Firefox 1 (2004)
- Safari 3.1 (2008)
- Internet Explorer 9 (2011)
- Edge 12 (2015)
Sintaks modern tanpa koma (
hsl(210 80% 50%)
) dan sintaks slash-alpha (
hsl(210 80% 50% / 0.5)
) merupakan bagian dari spesifikasi
CSS Color Level 4
dan didukung di semua browser modern sejak 2023. Jika kamu masih perlu mendukung IE11 (yang sudah jarang saat ini), gunakan sintaks dengan koma.
hsl()
dengan koma berfungsi di setiap browser yang kemungkinan digunakan penggunamu. Sintaks modern dengan pemisah spasi berfungsi di Chrome 90+, Firefox 89+, dan Safari 14.1+, mencakup lebih dari 95% penggunaan browser secara global.
Kamu selalu bisa menggunakan color picker untuk mengonversi antara format HSL, RGB, dan HEX saat perlu membandingkan nilai atau menyerahkan warna ke alat yang hanya menerima satu format.
HSL vs OKLCH - Apa Selanjutnya?
Jika kamu ingin melangkah lebih jauh dari HSL, OKLCH layak untuk diketahui. Ini adalah ruang warna yang seragam secara perseptual, artinya langkah numerik yang sama dalam lightness atau chroma benar-benar terlihat seperti langkah yang sama bagi mata manusia - sesuatu yang tidak sepenuhnya dijamin oleh HSL.
Masalah dengan HSL adalah dua warna dengan nilai lightness yang sama bisa terlihat sangat berbeda dalam kecerahan yang dipersepsi. Misalnya,
hsl(60, 100%, 50%)
(kuning) terlihat jauh lebih terang daripada
hsl(240, 100%, 50%)
(biru), meskipun keduanya memiliki lightness 50%. OKLCH mengoreksi hal ini.
/* HSL - same lightness, different perceived brightness */
color: hsl(60, 100%, 50%); /* yellow - looks very bright */
color: hsl(240, 100%, 50%); /* blue - looks much darker */
/* OKLCH - same lightness, actually looks the same to the eye */
color: oklch(0.75 0.18 90); /* yellow-ish */
color: oklch(0.75 0.18 260); /* blue-ish - genuinely similar perceived brightness */
OKLCH juga mendukung
warna wide-gamut
(warna tampilan P3) yang melampaui rentang sRGB yang menjadi batasan HSL. Dukungan browser untuk
oklch()
sudah solid di 2024: Chrome 111+, Firefox 113+, Safari 15.4+.
Untuk sebagian besar proyek saat ini, HSL adalah pilihan praktis yang ideal: mudah dibaca, mudah dirawat, didukung secara universal, dan merupakan peningkatan besar dibandingkan RGB. OKLCH adalah pilihan tepat ketika kamu membangun design system yang membutuhkan rasio kontras yang konsisten secara matematis atau ingin menargetkan tampilan wide-gamut.
Jika kamu sedang menjelajahi hubungan warna secara visual saat membangun palet, alat color explorer memungkinkan kamu bereksperimen dengan nilai HSL dan melihat bagaimana rotasi hue, pergeseran saturation, dan perubahan lightness berinteraksi secara real time.
Pilih warna HSL tanpa perlu menebak-nebak
Color picker kami memungkinkan kamu mengatur nilai hue, saturation, dan lightness secara visual, lalu menyalin output model warna HSL langsung ke CSS kamu - tanpa perlu menghitung secara manual.
Coba Color Picker →
Kamu tidak perlu menulis ulang semuanya, tetapi ada baiknya beralih ke HSL untuk setiap definisi warna baru yang kamu tulis, terutama saat menggunakan custom property CSS. Keuntungan terbesar datang ketika kamu membangun atau merawat design system, membuat hover state, atau mengimplementasikan dark mode. Mencampur RGB dan HSL dalam proyek yang sama adalah CSS yang sepenuhnya valid - browser menangani keduanya tanpa perbedaan performa apa pun.
Tidak, tidak ada perbedaan performa yang berarti. Browser mengonversi semua format warna CSS ke representasi internal saat proses parsing, sehingga apakah kamu menulis
hsl(207, 44%, 49%)
atau
rgb(70, 130, 180)
, rendering engine memperlakukannya identik setelah langkah parsing awal tersebut. Pilihannya sepenuhnya tentang pengalaman developer dan kemudahan perawatan, bukan performa runtime.
Ya, dan ini adalah salah satu kasus penggunaan HSL yang paling kuat di JavaScript. Kamu bisa menyimpan hue, saturation, dan lightness sebagai angka terpisah, lalu membangun string warna secara dinamis:
element.style.color = `hsl(${hue}, ${saturation}%, ${lightness}%)`
. Ini membuat animasi, pergantian tema, dan kontrol warna interaktif jauh lebih mudah diimplementasikan dibandingkan bekerja dengan kanal RGB, di mana kamu perlu matematika konversi untuk mencapai efek yang sama.
HSL (hue, saturation, lightness) dan HSB/HSV (hue, saturation, brightness/value) adalah model warna yang berbeda meskipun keduanya berbagi sumbu hue. Dalam HSL, lightness 50% menghasilkan warna murni yang sepenuhnya tersaturasi. Dalam HSB, brightness 100% menghasilkan warna murni. Kedua model menghasilkan hasil yang berbeda untuk nilai saturation dan brightness/lightness yang sama. CSS menggunakan HSL secara spesifik - HSB/HSV umum digunakan di alat desain seperti Photoshop dan Figma tetapi bukan format CSS native.
Konversi dari HEX ke HSL melalui langkah perantara RGB: pertama konversi pasangan HEX ke nilai RGB (0-255), normalisasi ke 0-1, lalu terapkan rumus konversi HSL. Dalam praktiknya, sebagian besar developer menggunakan alat color picker, alat desain seperti Figma, atau color picker di browser DevTools untuk melakukan ini secara instan daripada menghitung secara manual. Browser DevTools memungkinkan kamu mengklik swatch warna apa pun dan beralih antara representasi HEX, RGB, dan HSL.
Ya, OKLCH lebih andal untuk pekerjaan aksesibilitas karena bersifat seragam secara perseptual - langkah yang sama pada kanal lightness-nya sesuai dengan perubahan kecerahan yang dipersepsi secara setara. Ini memudahkan pembuatan palet warna di mana rasio kontras dapat diprediksi di berbagai hue. Dengan HSL, kuning pada lightness 50% terlihat jauh lebih terang daripada biru pada lightness 50%, yang bisa menimbulkan kejutan dalam hal aksesibilitas. Untuk kepatuhan kontras WCAG, OKLCH memberikan hasil yang lebih mudah diprediksi saat membangun skala warna yang aksesibel.