CSS color-mix()

Adam Argyle
Adam Argyle

color-mix() CSS memungkinkan Anda mencampur warna, dalam ruang warna mana pun yang didukung, langsung dari CSS Anda.

Dukungan Browser

  • Chrome: 111.
  • Edge: 111.
  • Firefox: 113.
  • Safari: 16.2.

Sumber

Sebelum color-mix(), untuk menggelapkan, mencerahkan, atau menurunkan saturasi warna, developer menggunakan Praprosesor CSS atau calc() dalam warna saluran TV Anda.

Sebelumnya dengan SCSS
.color-mixing-with-sass {
  /* Sass: equally mix red with white */
  --red-white-mix: color.mix(red, white);
}

Sass telah melakukan banyak hal berada di depan spesifikasi CSS warna. Namun, belum ada cara nyata untuk mencampur warna dalam CSS. Untuk mendekatinya, Anda perlu menghitung sebagian nilai warna. Berikut adalah contoh pengurangan cara CSS dapat menyimulasikan pencampuran saat ini:

Sebelumnya dengan HSL
.color-mixing-with-vanilla-css-before {
  --lightness: 50%;
  --red: hsl(0 50% var(--lightness));

  /* add "white" to red
     by adding 25% to the lightness channel
  */
  --lightred: hsl(0 50% calc(var(--lightness) + 25%);
}

color-mix() menghadirkan kemampuan untuk mencampur warna ke CSS. Developer dapat memilih ruang warna yang dicampur dan seberapa dominan setiap warna dalam campuran.

Setelah
.color-mixing-after {
  /* equally mix red with white */
  --red-white-mix: color-mix(in oklab, red, white);

  /* equally mix red with white in srgb */
  --red-white-mix-srgb: color-mix(in srgb, red, white);
}

Itulah yang kita inginkan. Fleksibilitas, daya, dan API berfitur lengkap. Suka sekali.

Mencampur warna dalam CSS

CSS ada dalam banyak ruang warna dan dunia gamut warna, dan karena itu bukan opsional untuk menentukan ruang warna untuk pencampuran. Selain itu, berbagai ruang warna bisa secara drastis mengubah hasil gabungan, jadi mengetahui efeknya ruang warna akan membantu Anda mendapatkan hasil yang Anda butuhkan.

Untuk pengantar interaktif, coba alat color-mix() ini: - Menjelajahi efek dari setiap ruang warna. - Mempelajari efek interpolasi rona saat mencampur warna silinder spasi (lch, oklch, hsl, dan hwb). - Ubah warna yang sedang dicampur dengan mengklik salah satu dari dua kotak warna di atas. - Gunakan penggeser untuk mengubah rasio pencampuran. - Kode CSS color-mix() yang dihasilkan tersedia di bagian bawah.

Mencampur dalam berbagai ruang warna

Ruang warna default untuk pencampuran (dan gradien) adalah oklab. Menyediakan hasil yang konsisten. Anda juga dapat menentukan ruang warna alternatif untuk menyesuaikan sesuai dengan kebutuhan Anda.

Misalnya, black dan white. Ruang warna yang berpadu tidak akan membuat perbedaan yang besar, bukan? Salah.

color-mix(in srgb, black, white);
color-mix(in srgb-linear, black, white);
color-mix(in lch, black, white);
color-mix(in oklch, black, white);
color-mix(in lab, black, white);
color-mix(in oklab, black, white);
color-mix(in xyz, black, white);
7 ruang warna (sRGB, linear-s rgb, lch, oklch, lab, oklab, xyz) masing-masing menampilkan hasil pencampuran warna hitam dan putih. Sekitar 5 nuansa berbeda ditampilkan, yang menunjukkan bahwa setiap ruang warna bahkan akan bercampur menjadi abu-abu secara berbeda.
Coba demo

Dampaknya besar!

Ambil blue dan white untuk contoh lain. Saya memilih ini karena ini adalah kasus di mana bentuk ruang warna dapat memengaruhi hasilnya. Dalam hal ini, sebagian besar ruang warna akan berubah menjadi ungu saat beralih dari putih ke biru. Ini juga menunjukkan bahwa oklab adalah ruang warna yang dapat diandalkan untuk pencampuran, paling sesuai dengan ekspektasi kebanyakan orang untuk memadukan warna putih dan biru (bukan ungu).

color-mix(in srgb, blue, white);
color-mix(in srgb-linear, blue, white);
color-mix(in lch, blue, white);
color-mix(in oklch, blue, white);
color-mix(in lab, blue, white);
color-mix(in oklab, blue, white);
color-mix(in xyz, blue, white);
7 ruang warna (sRGB, linear-sRGB, lch, oklch, lab, oklab, xyz) ditampilkan dengan hasil yang berbeda. Banyak berwarna merah muda atau ungu, beberapa yang masih berwarna biru.
Coba demo

Mempelajari efek ruang warna dengan color-mix() adalah pengetahuan yang baik untuk membuat gradien berikutnya Sintaks warna 4 juga memungkinkan gradien untuk menentukan ruang warna, di mana gradien menunjukkan campuran pada area ruang.

.black-to-white-gradient-in-each-space {
  --srgb: linear-gradient(to right in srgb, black, white);
  --srgb-linear: linear-gradient(to right in srgb-linear, black, white);
  --lab: linear-gradient(to right in lab, black, white);
  --oklab: linear-gradient(to right in oklab, black, white);
  --lch: linear-gradient(to right in lch, black, white);
  --oklch: linear-gradient(to right in oklch, black, white);
  --hsl: linear-gradient(to right in hsl, black, white);
  --hwb: linear-gradient(to right in hwb, black, white);
  --xyz: linear-gradient(to right in xyz, black, white);
  --xyz-d50: linear-gradient(to right in xyz-d50, black, white);
  --xzy-d65: linear-gradient(to right in xyz-d65, black, white);
}
Gradien hitam ke putih dalam ruang warna yang berbeda.
Coba demo

Jika Anda bertanya-tanya ruang warna mana yang "terbaik", tidak ada satu pun. Itu sebabnya ada begitu banyak pilihan! Juga tidak akan ada ruang warna baru yang ditemukan (lihat oklch dan oklab), jika salah satu adalah "yang terbaik". Setiap warna ruang angkasa dapat memiliki momen unik untuk bersinar dan menjadi pilihan yang tepat.

Misalnya, jika Anda menginginkan hasil campuran yang cerah, gunakan hsl atau hwb. Dalam demo, dua warna cerah (magenta dan limau) dicampur bersama dan hsl dan hwb keduanya memberikan hasil yang cerah, sementara sRGB dan oklab menghasilkan warna tak jenuh.

Hasil gabungan seperti yang dijelaskan dalam paragraf sebelumnya.
Coba demo

Jika Anda menginginkan konsistensi dan kehalusan, gunakan oklab. Dalam demo berikut yang menggabungkan biru dan hitam, hsl dan hwb menghasilkan terlalu cerah dan hue bergeser, sRGB dan oklab menghasilkan warna biru yang lebih gelap.

Hasil gabungan seperti yang dijelaskan dalam paragraf sebelumnya.
Coba demo

Luangkan waktu lima menit dengan color-mix() playground, menguji berbagai warna dan ruang, dan Anda akan mulai memahami manfaat setiap ruang. Selain itu, mengharapkan lebih banyak panduan seputar ruang warna terjadi saat kita semua menyesuaikan diri dengan potensi dalam antarmuka pengguna kita.

Menyesuaikan metode interpolasi hue

Jika Anda memilih untuk mencampur ruang warna silinder, pada dasarnya semua warna ruang dengan saluran hue h yang menerima sudut, Anda dapat menentukan apakah interpolasi berjalan shorter, longer, decreasing, dan increasing. Ini adalah dibahas dengan baik dalam Panduan Warna HD ini jika Anda ingin mempelajari lebih lanjut.

Ini contoh campuran biru ke putih yang sama, tapi kali ini, hanya dalam ruang silinder dengan metode interpolasi rona yang berbeda.

Hasil gabungan seperti yang dijelaskan dalam paragraf sebelumnya.
Coba demo

Berikut ini Codepen lain yang saya buat untuk membantu memvisualisasikan interpolasi hue, tapi khususnya untuk gradien. Saya yakin ini akan membantu Anda memahami bagaimana masing-masing ruang warna menghasilkan hasil campurannya ketika interpolasi hue ditentukan, pelajari!

Mencampur dengan berbagai sintaksis warna

Sejauh ini, kita sebagian besar telah menggabungkan CSS yang diberi nama warna, seperti blue dan white. Warna CSS pencampuran siap untuk mencampur warna yang dari dua ruang warna berbeda. Ini adalah alasan lain adalah kunci untuk menentukan ruang warna untuk pencampuran, saat mengatur ruang bersama ketika kedua warna tidak berada di ruang yang sama.

color-mix(in oklch, hsl(200deg 50% 50%), color(display-p3 .5 0 .5));

Pada contoh sebelumnya, hsl dan display-p3 akan dikonversi menjadi oklch dan kemudian dicampur. Cukup keren dan fleksibel.

Menyesuaikan rasio pencampuran

Jarang sekali jika setiap kali Anda mencampur warna, Anda menginginkan bagian yang sama dari setiap warna, seperti yang telah ditunjukkan oleh sebagian besar contoh. Kabar baiknya, ada sintaks untuk mengartikulasikan berapa banyak setiap warna yang harus terlihat dalam campuran yang dihasilkan.

Untuk memulai topik ini, berikut contoh mix yang semuanya setara (dan dari spesifikasi):

.ratios-syntax-examples {
  /* omit the percentage for equal mixes */
  color: color-mix(in lch, purple, plum);
  color: color-mix(in lch, plum, purple);

  /* percentage can go on either side of the color */
  color: color-mix(in lch, purple 50%, plum 50%);
  color: color-mix(in lch, 50% purple, 50% plum);

  /* percentage on just one color? other color gets the remainder */
  color: color-mix(in lch, purple 50%, plum);
  color: color-mix(in lch, purple, plum 50%);

  /* percentages > 100% are equally clamped */
  color: color-mix(in lch, purple 80%, plum 80%);
  /* above mix is clamped to this */
  color: color-mix(in lch, purple 50%, plum 50%);
}

Saya menemukan contoh-contoh ini dapat menjelaskan {i>edge case<i} dengan baik. Set pertama dari contoh menunjukkan bagaimana 50% tidak wajib tetapi dapat ditentukan secara opsional. Terakhir contoh menunjukkan kasus menarik saat rasio melebihi 100% saat ditambahkan secara keseluruhan, keduanya sama-sama dihubungkan dengan total 100%.

Perhatikan juga, jika hanya satu warna yang menentukan rasio, warna lainnya diasumsikan sisa data menjadi 100%. Berikut beberapa contoh untuk membantu menggambarkan hal ini perilaku model.

color-mix(in lch, purple 40%, plum) /* plum assigned 60% */
color-mix(in lch, purple, 60% plum) /* purple assigned 40% */
color-mix(in lch, purple 40%, plum 60%) /* no auto assignments */

Contoh ini menggambarkan dua aturan: Akun Layanan 1. Jika rasio melebihi 100%, rasio tersebut akan dibatasi dan didistribusikan secara merata. 1. Jika hanya satu rasio yang diberikan, warna lain ditetapkan ke 100 dikurangi rasio tersebut.

Aturan terakhir sedikit kurang jelas; apa yang terjadi jika persentase diberikan untuk kedua warna dan tidak bertambah hingga 100%?

color-mix(in lch, purple 20%, plum 20%)

Kombinasi color-mix() ini menghasilkan transparansi, transparansi 40%. Jika rasio tidak mencapai 100%, kombinasi yang dihasilkan tidak akan buram. Tidak ada warna yang akan tercampur sepenuhnya.

Susun bertingkat color-mix()

Seperti semua CSS, penyarangan ditangani dengan baik dan seperti yang diharapkan; fungsi {i>inner<i} akan diselesaikan terlebih dahulu dan mengembalikan nilainya ke konteks induk.

color-mix(in lch, purple 40%, color-mix(plum, white))

Jangan ragu untuk menyusun bertingkat sebanyak yang Anda butuhkan untuk mendapatkan hasil yang ingin Anda capai.

Membangun skema warna terang dan gelap

Mari kita buat skema warna dengan color-mix().

Skema warna dasar

Pada CSS berikut, tema terang dan gelap dibuat berdasarkan heksa merek {i>color<i}. Tema terang membuat dua warna teks biru tua dan putih yang sangat terang warna permukaan latar belakang. Kemudian dalam kueri media preferensi gelap, parameter kustom properti diberi warna baru sehingga latar belakang menjadi gelap dan warna teks ringan.

:root {
  /* a base brand color */
  --brand: #0af;

  /* very dark brand blue */
  --text1: color-mix(in oklab, var(--brand) 25%, black);
  --text2: color-mix(in oklab, var(--brand) 40%, black);

  /* very bright brand white */
  --surface1: color-mix(in oklab, var(--brand) 5%, white);
}

@media (prefers-color-scheme: dark) {
  :root {
    --text1: color-mix(in oklab, var(--brand) 15%, white);
    --text2: color-mix(in oklab, var(--brand) 40%, white);
    --surface1: color-mix(in oklab, var(--brand) 5%, black);
  }
}

Semua ini dicapai dengan memadukan warna putih atau hitam ke dalam warna merek.

Skema warna menengah

Hal ini dapat ditingkatkan dengan menambahkan lebih dari sekadar tema terang dan gelap. Di beberapa demo berikut, perubahan pada grup radio memperbarui atribut pada HTML memberi tag [color-scheme="auto"] yang kemudian memungkinkan pemilih diterapkan secara bersyarat tema warna.

Demo menengah ini juga menunjukkan teknik tema warna di mana semua warna tema tercantum di :root. Hal ini membuat mereka mudah untuk melihat semuanya dan menyesuaikannya jika perlu. Nantinya di stylesheet, Anda bisa menggunakan variabel sebagaimana didefinisikan. Ini menghemat perburuan melalui stylesheet untuk manipulasi warna sebagai semuanya berada dalam blok :root awal.

Kasus penggunaan yang lebih menarik

Ana Tudor memiliki demo yang bagus dengan beberapa kasus penggunaan untuk studi:

Men-debug color-mix() dengan DevTools

Chrome DevTools memiliki dukungan yang bagus untuk color-mix(). Model ini mengenali dan menyoroti sintaks, membuat pratinjau dari campuran tepat di sebelah gaya dalam panel {i>Styles<i} dan memungkinkan pemilihan warna alternatif.

Hasilnya akan terlihat seperti ini di DevTools:

Screenshot Chrome DevTools yang memeriksa sintaksis campuran warna.

Selamat bersenang-senang!