CSS renk karışımı()

Adem Argyle
Adam Argyle

CSS color-mix() işlevi, renkleri doğrudan CSS'nizden desteklenen renk alanlarında dilediğiniz renkle karıştırmanıza olanak tanır.

Tarayıcı Desteği

  • 111
  • 111
  • 113
  • 16.2

Kaynak

Geliştiriciler, color-mix() tarihinden önce bir rengi koyulaştırmak, açmak veya solgunlaştırmak için renk kanallarında CSS ön işlemcilerini veya calc() özelliğini kullanıyordu.

Daha önce SCSS ile
.color-mixing-with-sass {
  /* Sass: equally mix red with white */
  --red-white-mix: color.mix(red, white);
}

Sass, renk CSS spesifikasyonunun ilerisinde kalarak harika bir iş çıkardı. Ancak, CSS'de renkleri karıştırmanın gerçek bir yolu yoktur. Yaklaşmak için kısmi renk değerlerini hesaplamalısınız. Aşağıda, CSS'nin bugün mix'i nasıl simüle edebileceğine dair azaltılmış bir örnek verilmiştir:

Önce HSL ile
.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(), renkleri CSS'ye karıştırma özelliğini getirir. Geliştiriciler birlikte kullanabilecekleri renk alanını ve her bir rengin karışımda ne kadar baskın olacağını seçebilirler.

Sonra
.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);
}

Biz de bunu istiyoruz. Esneklik, güç ve tam özellikli API'ler. Sevdiğiniz içerikleri

CSS'de renkleri karıştırma

CSS, birden fazla renk alanı ve renk gamı dünyasında mevcuttur ve bu nedenle, karıştırma için renk alanının belirtilmesi isteğe bağlı değildir. Dahası, farklı renk alanları, bir karışımın sonuçlarını önemli ölçüde değiştirebilir. Bu nedenle, bir renk alanının etkilerini bilmek istediğiniz sonuçları elde etmenize yardımcı olur.

Etkileşimli giriş için bu color-mix() aracını deneyin: - Her renk alanının efektlerini keşfedin. - Silindir şeklindeki bir renk alanını (lch, oklch, hsl ve hwb) karıştırırken ton interpolasyonunun etkilerini keşfedin. - Üstteki iki renk kutusundan birini tıklayarak karıştırılan renkleri değiştirin. - Karıştırma oranını değiştirmek için kaydırma çubuğunu kullanın. - Oluşturulan color-mix() CSS kodu en altta mevcut.

Çeşitli renk alanlarını karıştırma

Karıştırma (ve gradyanlar) için varsayılan renk alanı oklab'dir. Tutarlı sonuçlar sağlar. Karışımı ihtiyaçlarınıza göre düzenlemek için alternatif renk alanları da belirleyebilirsiniz.

Örneğin black ve white. Karıştırdıkları renk alanı o kadar da önemli değil, değil mi? Yanlış.

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 renk alanının (srgb, linear-srgb, lch, oklch, lab, oklab, xyz) her biri siyah ve beyazın birlikte karıştırılmasıyla elde edilen sonuçları gösterir. Her bir renk alanının bir griye farklı şekilde karıştırılacağını gösteren yaklaşık 5 farklı renk tonu gösterilmektedir.
Demoyu deneyin

Bunun büyük bir etkisi var.

Başka bir örnek için blue ve white öğelerini ele alalım. Bu özellikle renk alanının şekli sonuçları etkileyebilecek bir durum olduğu için bunu seçtim. Bu örnekte, beyazdan maviye doğru giderken renk alanlarının çoğu mor olur. Ayrıca oklab renginin karıştırma için nasıl güvenilir bir renk alanı olduğunu, çoğu kişinin beyaz ve maviyi (mor değil) karıştırma beklentisine en yakın olanıdır.

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);
Her biri farklı sonuçlara sahip olan 7 renk alanının (srgb, linear-srgb, lch, oklch, lab, oklab, xyz) her biri farklı sonuçlar gösteriyor. Çoğu pembe veya mor, bazıları aslında hâlâ mavidir.
Demoyu deneyin

color-mix() ile bir renk alanının etkilerini öğrenmek, renk geçişleri oluşturma konusunda da harika bir bilgidir. Renk 4 söz dizimi, renk geçişlerinin renk alanını belirtmesine de olanak tanır. Burada renk geçişi, bir alan alanı üzerindeki karışımı gösterir.

.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);
}
Farklı renk alanlarında siyah-beyaz renk geçişleri.
Demoyu deneyin

Hangi renk alanının "en iyi" olduğunu merak ediyorsanız renk alanı yoktur. İşte bu yüzden pek çok seçenek var. Ayrıca, "en iyi " renk icat edildiyse yeni renk alanları da icat edilmezdi (oklch ve oklab'a bakın). Her renk alanının öne çıkma ve doğru seçim olma açısından benzersiz bir anı olabilir.

Örneğin, canlı bir karışım sonucu almak istiyorsanız hsl veya hwb kullanın. Aşağıdaki demoda iki canlı renk (eflatun ve misket limonu) birlikte karıştırılmış ve hsl ile hwb canlı bir sonuç oluştururken srgb ve oklab doymamış renkler üretiyor.

Karışım, önceki paragrafta açıklandığı gibi sonuçlanır.
Demoyu deneyin

Tutarlılık ve incelik istiyorsanız oklab'i kullanın. Mavi ile siyahın bir arada kullanıldığı aşağıdaki demoda hsl ve hwb aşırı canlı ve ton değişimli renkler oluştururken, srgb ve oklab koyu mavi üretir.

Karışım, önceki paragrafta açıklandığı gibi sonuçlanır.
Demoyu deneyin

color-mix() oyun alanında farklı renkleri ve alanları test ederek beş dakika harcayın ve her alanın avantajlarını öğrenmeye başlayın. Ayrıca, hepimiz kullanıcı arayüzlerimizdeki potansiyellere uyum sağladığından renk alanları konusunda daha fazla rehberlik verilmesini bekleyebiliriz.

Ton interpolasyonu yöntemini ayarlama

Silindir şeklindeki bir renk alanını (yani, h ton kanalına sahip olan ve belirli bir açıyı kabul eden bir renk kanalına sahip herhangi bir renk alanını) karıştırmayı tercih ettiyseniz, interpolasyonun shorter, longer, decreasing ve increasing olup olmadığını belirtebilirsiniz. Daha fazla bilgi edinmek isterseniz bu HD Renk Kılavuzu'nda bu konu ayrıntılı bir şekilde ele alınmıştır.

Burada, maviden beyaza karışım örneğinin aynısını görüyorsunuz, ama bu kez yalnızca farklı ton interpolasyon yöntemlerine sahip silindir alanlarda bulunuyor.

Karışım, önceki paragrafta açıklandığı gibi sonuçlanır.
Demoyu deneyin

Burada, ton interpolasyonunu görselleştirmeye yardımcı olmak için özel olarak gradyanlar için oluşturduğum başka bir Codepen'i bulabilirsiniz. Bu özelliğin, ton interpolasyonu belirtildiğinde her bir renk alanının karışım sonucunu nasıl ürettiğini anlamanıza yardımcı olacağını düşünüyorum. Lütfen inceleyin!

Çeşitli renk söz dizimleriyle karıştırma

Şu ana kadar blue ve white gibi CSS adlı renkleri çoğunlukla karıştırdık. CSS renk karıştırma, iki farklı renk alanındaki renkleri karıştırmaya hazırdır. İki rengin aynı alanda olmadığı durumlar için ortak alanı belirlediğinden, karıştırma işlemi için renk alanını belirtmenin önemli olmasının bir başka nedeni de budur.

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

Önceki örnekte hsl ve display-p3, oklch biçimine dönüştürülüp karıştırılır. Çok havalı ve esnek.

Karıştırma oranlarını ayarlama

Şimdiye kadarki örneklerin çoğunda gösterildiği gibi, her karıştırışınızda her rengin eşit parçalarını istemeniz pek olası değildir. Güzel bir haberimiz var. Sonuçta ortaya çıkan karışımda her rengin ne kadarının görülmesi gerektiğini belirtmek için bir söz dizimi var.

Bu konuyu başlatmak için aşağıda, tamamen eşdeğer olan (ve spesifikasyondan) bir mix örneği verilmiştir:

.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%);
}

Uç durumları iyi açıklamak için bu örnekleri buluyorum. İlk örnek grubunda% 50'nin zorunlu olmadığı ancak isteğe bağlı olarak belirtilebildiği gösterilmektedir. Son örnekte ilginç bir durum gösterilmektedir. Oranlar bir araya getirildiğinde% 100'ü aştığında toplam %100'e eşit olarak kenetlenir.

Ayrıca, yalnızca bir renk bir oran belirtiyorsa diğerinin %100'e kalan değer olarak kabul edildiğine de dikkat edin. Bu davranışı daha iyi anlamak için birkaç örnek daha verelim.

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 */

Bu örneklerde iki kural gösterilmiştir: 1. Oranlar %100'ü aştığında, sabitlenir ve eşit olarak dağıtılır. 1. Yalnızca bir oran sağlandığında diğer renk bu oran çıkarılarak 100'e ayarlanır.

Son kural biraz daha belirsizdir; her iki renk için yüzdeler sağlanırsa ve bunların toplamı %100'e eşit değilse ne olur?

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

Bu color-mix() kombinasyonu şeffaflık ve 40% şeffaflık sağlar. Oranların toplamı %100'e ulaşmadığında elde edilen karışım opak olmaz. Renklerin hiçbiri tamamen karıştırılmaz.

color-mix() iç içe yerleştiriliyor

Tüm CSS'ler gibi iç içe yerleştirme iyi ve beklendiği gibi işlenir; iç işlevler önce çözümlenir ve değerlerini üst bağlama döndürür.

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

İstediğiniz sonucu almak için içine istediğiniz kadar yerleştirebilirsiniz.

Açık ve koyu renk şeması oluşturma

color-mix() ile renk şemaları oluşturalım.

Temel renk şeması

Aşağıdaki CSS'de markanın onaltılık rengine göre açık ve koyu tema oluşturulur. Açık tema iki koyu mavi metin rengi ve çok açık beyaz arka plan yüzey rengi oluşturur. Daha sonra, koyu tercihli bir medya sorgusunda, özel özelliklere yeni renkler atanır. Böylece arka plan koyu ve metin renkleri açık olur.

: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);
  }
}

Tüm bunlar, beyaz veya siyahın marka rengiyle karıştırılmasıyla gerçekleştirilir.

Ara renk şeması

Açık ve koyu temalardan daha fazlasını ekleyerek bunu bir adım öteye taşıyabilirsiniz. Aşağıdaki demoda, radyo grubunda yapılan değişiklikler, [color-scheme="auto"] HTML etiketindeki bir özelliği günceller. Bu özellik, seçicilerin bir renk temasını koşullu olarak uygulamasını sağlar.

Bu orta seviye demoda, tüm tema renklerinin :root öğesinde listelendiği bir renk teması tekniği de gösterilmektedir. Böylece hepsini bir arada görmek ve gerekiyorsa ayarlamak kolaylaşır. Daha sonra stil sayfasında, değişkenleri tanımlandıkları şekilde kullanabilirsiniz. Bu sayede, bunların hepsi ilk :root blokunda yer aldığı için stil sayfasında renk değiştirme faaliyetlerini araştırmak zorunda kalmazsınız.

Daha ilginç kullanım alanları

Ana Tudor, çalışma için birkaç kullanım alanı içeren harika bir demo sunuyor:

Geliştirici Araçları'nı kullanarak color-mix() hatalarını ayıklama

Chrome Geliştirici Araçları, color-mix() için mükemmel destek sunar. Söz dizimini tanır ve vurgular, Stiller bölmesinde stilin hemen yanında mix'in bir önizlemesini oluşturur ve alternatif renklerin seçilmesine olanak tanır.

Geliştirici Araçları'nda bu görünüm aşağıdaki gibi olacaktır:

Chrome Geliştirici Araçları'nın renk karışımı söz dizimini inceleyen ekran görüntüsü.

Hepinizi mikslemeniz dileğiyle!