CSS: aventuras na terra da translucidez

Recentemente, fui solicitado a corrigir uma pĂĄgina de destino. Entre o que encontrei em seu cĂłdigo, havia uma imagem sobre a qual estavam localizados dois elementos translĂșcidos. Ambos com os mesmos valores de cores RGB na propriedade background-color. Parecia algo assim:

<img src='myImage.jpg'/>
<div class='over1'></div>
<div class='over2'></div>

NĂŁo havia necessidade de usar dois desses elementos. Isso poderia ser necessĂĄrio, a menos que devido ao fato de que apenas um desses elementos nĂŁo tenha matizado suficientemente a imagem. Por alguma razĂŁo, o autor da pĂĄgina decidiu que adicionar outro elemento translĂșcido sobreposto Ă  imagem era melhor do que aumentar o valor do opacityprimeiro parĂąmetro . Como resultado, decidi me livrar de uma das camadas e definir o parĂąmetro da restante para que a imagem externa parecesse a mesma da anterior. Tudo isso Ă© bom, mas surgiu a questĂŁo: como ajustar o parĂąmetro do elemento restante para que o resultado seja o mesmo da aplicação de duas camadas translĂșcidas?



opacityopacity

Se vocĂȘ leu este meu artigo sobre a composição de mĂĄscaras, jĂĄ deve ter adivinhado como escolher o valor apropriado. Afinal, a mesma fĂłrmula Ă© usada aqui, que foi usada lĂĄ para a composição de elementos translĂșcidos usando mask-composite: add. Se existem duas camadas com valores de transparĂȘncia igual a a0e a1, em seguida, o valor do indicador do resultado Ă© calculado como se segue:

a0 + a1 - a0*a1

Aqui vocĂȘ pode encontrar uma demonstração interativa, na qual Ă© possĂ­vel comparar a aparĂȘncia da imagem, tonificada com duas camadas, opacitycujas propriedades ( a0e a1) podem ser controladas com a ajuda de controles deslizantes e a mesma imagem tonificada por uma propriedade de camada opacitycalculada de acordo com a fĂłrmula a0 + a1 — a0*a1.


As opçÔes para pintar uma imagem, duas cópias são exibidas uma da outra,

Ă© interessante que as ĂĄreas em que dois elementos translĂșcidos estĂŁo localizados e um desses elementos tenham a mesma aparĂȘncia se a imagem abaixo deles nĂŁo for exibida (vocĂȘ pode desativar a saĂ­da da imagem usando a caixa de seleção localizado na parte inferior da tela). Mas se uma imagem for exibida nessas camadas, suas duas opçÔes serĂŁo ligeiramente diferentes. Talvez essa diferença seja apenas o resultado da ilusĂŁo de Ăłtica, talvez algumas partes das imagens me pareçam mais claras ou mais escuras do que realmente sĂŁo.

Definitivamente, eles nĂŁo parecem diferentes se vocĂȘ nĂŁo os exibir um ao lado do outro, mas simplesmente alternam entre duas camadas cujos valores de propriedadeopacitysĂŁo iguais aa0ea1e uma camada, cujo valor opacityĂ© encontrado pela fĂłrmula a0 + a1 — a0*a1. Aqui estĂĄ um exemplo relevante.


Variantes de tingimento de imagem com a capacidade de alternar entre uma e duas camadas translĂșcidas.Este

exemplo pode ser estendido para mais camadas. Nesse caso, primeiro calcule a transparĂȘncia da nova camada, equivalente Ă  transparĂȘncia das duas camadas inferiores. Em seguida, encontre a transparĂȘncia da camada, equivalente Ă  transparĂȘncia da nova camada e a camada imediatamente acima dela. Esta operação Ă© repetida atĂ© que todas as camadas tenham sido processadas.


Reduzindo vĂĄrias camadas translĂșcidas para uma Ășnica camada

ExperiĂȘncias semelhantes me fizeram pensar em como calcular os parĂąmetros de uma imagem de fundo opaca, que Ă© equivalente a uma camada opaca (c0) e uma camada translĂșcida sobreposta (c1cuja transparĂȘncia estĂĄ definida comoa). Nesse caso, a imagem final, que Ă© uma camada Ășnica, pode ser encontrada processando o canal de imagem original por canal, enquanto os valores de cores dos canais resultantes sĂŁo calculados pela seguinte fĂłrmula:

ch0 + (ch1 - ch0)*a

Aqui ch0- este canal Ă© a camada inferior opaca ( red, greenou blue- para o vermelho, verde e azul) ch1- Ă© o canal apropriado da camada superior semi-transparente, e o Ă­ndice a- uma medida que especifica a transparĂȘncia da mesma camada semi-transparente.

Se vocĂȘ expressar esses argumentos na forma de cĂłdigo SCSS, obtĂ©m o seguinte:

/*       */
@function res-ch($ch0, $ch1, $a) {
  @return $ch0 + ($ch1 - $ch0)*$a
}

@function res-col($c0, $c1, $a) {
  $ch: 'red' 'green' 'blue'; /*   */
  $nc: length($ch); /*   */
  $ch-list: ();

  @for $i from 0 to $nc {
    $fn: nth($ch, $i + 1);
    $ch-list: $ch-list, 
      res-ch(call($fn, $c0), call($fn, $c1), $a);
  }

  @return RGB($ch-list)
}

Aqui estĂĄ um exemplo interativo. Ao experimentar, vocĂȘ pode comparar a aparĂȘncia das duas camadas e seu equivalente, apresentado como uma Ășnica camada. Aqui vocĂȘ pode selecionar os valores de cores RGB de duas camadas, bem como o nĂ­vel de transparĂȘncia da segunda camada.


Resultados da aplicação de uma camada translĂșcida a uma camada opaca

Dependendo do dispositivo, sistema operacional e navegador, vocĂȘ verĂĄ que os painĂ©is de cores neste exemplo tĂȘm a mesma aparĂȘncia ... ou nĂŁo. A fĂłrmula estĂĄ correta, mas como exatamente as duas camadas de origem sĂŁo processadas em ambientes diferentes pode variar.


A parte esquerda da imagem é o resultado esperado da redução de duas camadas para uma. O lado direito mostra como, quando duas camadas são combinadas (na parte superior direita da imagem), a camada mostrada na parte inferior direita pode parecer diferente do esperado.Pedi

aos usuĂĄrios do Twitter que me enviassem capturas de tela feitas usando a versĂŁo de teste simplificada deste exemplo. A julgar pelos comentĂĄrios que recebi, parece que os dois painĂ©is sempre parecem iguais nos navegadores mĂłveis (Android e iOS), bem como no navegador Firefox, independentemente do sistema operacional. Quase sempre, os painĂ©is tĂȘm a mesma aparĂȘncia no Windows, embora eu tenha respostas indicando que o Chrome e o Chromium Edge Ă s vezes processam os painĂ©is de maneira diferente do esperado.

Se falarmos sobre navegadores baseados no WebKit em execução no macOS e Linux, pode-se notar que os resultados sĂŁo muito heterogĂȘneos. Na maioria dos casos, a cor dos painĂ©is Ă© um pouco diferente. Mas o uso do perfil de cores sRGB ajuda a deixar os painĂ©is com a mesma aparĂȘncia. O mais interessante começa se este exemplo for considerado em um sistema que usa dois monitores. Arrastar uma janela de um monitor para outro pode levar ao fato de que a diferença entre os painĂ©is Ă© visĂ­vel ou nĂŁo.

Deve-se notar que, em cenårios reais, a diferença é muito pequena e que é improvåvel que um par desses painéis esteja próximo um do outro. Mas mesmo se houver uma diferença, ninguém saberå sobre isso até que ele teste a pågina em diferentes ambientes. De qualquer forma, apenas um desenvolvedor da web provavelmente pode fazer isso. Além disso, hå a sensação de que as cores dos elementos opacos comuns também podem parecer diferentes ao usar diferentes dispositivos, sistemas operacionais e navegadores. Por exemplo, a cor #ffa800, que é amplamente usada em css-tricks.com, parece diferente nos meus laptops com Ubuntu e Windows. Afinal, os olhos de pessoas diferentes podem perceber as mesmas cores de maneiras diferentes.

Queridos leitores! VocĂȘ encontrou problemas com diferentes navegadores, sistemas operacionais ou dispositivos que exibem cores diferentes de pĂĄginas da web?


All Articles