Dado um PNG transparente exibindo uma forma simples em branco, é possível alterar de alguma forma a cor disso por meio de CSS? Algum tipo de sobreposição ou o que não?
Você pode definir a background-colorpropriedade CSS. Você pode criar partes não transparentes que serão corrigidas e partes transparentes da imagem que serão preenchidas com qualquer cor que você desejar via CSS. É isso que você deseja alcançar?
jakub.g
2
@ qbk, vale a pena responder, não apenas um comentário. E você me venceu por 1 segundo, tecnicamente.
precisa
2
Você pode usar elementos psuedo com um modo de mesclagem para recolorir qualquer ícone que seja 100% preto ou 100% branco (o fundo permanece transparente). Veja minha resposta aqui: stackoverflow.com/a/39796437/1472114
chrscblls
Respostas:
569
Você pode usar filtros com -webkit-filtere filter: Os filtros são relativamente novos para os navegadores, mas são suportados em mais de 90% dos navegadores, de acordo com a seguinte tabela CanIUse: https://caniuse.com/#feat=css-filters
Você pode alterar uma imagem para escala de cinza, sépia e muito mais (veja o exemplo).
Agora você pode alterar a cor de um arquivo PNG com filtros.
@datatype_void Às vezes você não controla a imagem inicial. Então, parece que você concorda que meu argumento é válido, você não pode obter nenhuma cor começando em preto ou branco. Ah, e eu joguei por mais de 5 minutos para chegar a essa conclusão.
AsGoodAsItGets
5
também especificar que você pode fazer coisas como esta: .gifcorrect{ filter: invert(28%) sepia(100%) hue-rotate(-180deg) saturate(3); }o que significa que você pode ir de preto e transparente ou em tons de cinza com a cor e funciona mesmo em gifs animados
tatsu
140
Encontrei este ótimo exemplo de codepen que você insere seu valor de cor hexadecimal e ele retorna o filtro necessário para aplicar essa cor a png
Edição: Estou usando Font-Awesome no meu projeto mais recente. Você pode até inicializá-lo. Basta colocar isso no seu <head>:
<linkhref="//netdna.bootstrapcdn.com/font-awesome/3.2.1/css/font-awesome.min.css"rel="stylesheet"><!-- And if you want to support IE7, add this aswell --><linkhref="//netdna.bootstrapcdn.com/font-awesome/3.2.1/css/font-awesome-ie7.min.css"rel="stylesheet">
E então vá em frente e adicione alguns links de ícones como este:
O Font-Awesome usa nomes de classes diferentes na nova versão, provavelmente porque isso reduz drasticamente os arquivos CSS e evita classes css ambíguas. Então agora você deve usar:
+1 para pensar fora da caixa. Atualmente, existem aplicativos on-line fáceis de usar para ajudar a criar uma fonte da web a partir de uma imagem (svg).
Yvan vander Sanden
Se <a class="icon-thumbs-up"> </a> é o nome da classe antiga e <a class="fa fa-thumbs-up"> </a> é o novo, eu não acho torna o CSS menor, vejo um espaço em branco adicional entre fa e fa-thumbs-up, adicione pelo menos 1 byte adicional nesse arquivo CSS, se não me engano?
Brandito 28/05
Font Awesome foi ótimo em seu dia, infelizmente, seu bloqueio de renderização, o que deixa o Google e seus usuários infelizes. Primeiro, resolvemos isso removendo fontes não usadas dos arquivos de fonte CSS e binário, reduzindo os dados pela metade. Agora, estamos removendo completamente e substituindo por um simples sprite, que não é um bloqueio de renderização (o processo DOM e CSSOM é mais rápido, torna os elementos da página mais rápidos) e reduz os dados em outros 75%, para 6 KB. FA é de cerca de 100 KB. Máscaras CSS podem ajudar no nosso caso, mas provavelmente desnecessárias.
YK
25
Consegui fazer isso usando o filtro SVG. Você pode escrever um filtro que multiplique a cor da imagem de origem pela cor que deseja alterar. No trecho de código abaixo, cor de inundação é a cor para a qual queremos alterar a cor da imagem (que é vermelha nesse caso.) FeComposite diz ao filtro como estamos processando a cor. A fórmula para feComposite com aritmética é (k1 * i1 * i2 + k2 * i1 + k3 * i2 + k4) em que i1 e i2 são cores de entrada para in / in2 de acordo. Portanto, especificar apenas k1 = 1 significa que ele fará apenas i1 * i2, o que significa multiplicar as duas cores de entrada.
Nota: Isso funciona apenas com HTML5, pois está usando SVG embutido. Mas acho que você poderá fazer isso funcionar com um navegador mais antigo colocando o SVG em um arquivo separado. Ainda não tentei essa abordagem.
Cara, você está sendo roubado nesta resposta. Qualquer pessoa que queira colorir imagens além do filtro: a rotação de matiz pode fazer - esse é o caminho.
MaxPRafferty
23
A tag img possui uma propriedade background como qualquer outra. Se você tiver um PNG branco com uma forma transparente, como um estêncil, poderá fazer o seguinte:
Quero que a parte branca seja colorida de maneira diferente, não a parte transparente.
Wesley
2
melhor solução que encontrei até agora. Pena que só irá funcionar se você usar um sólido background-color em seus sites
Jules Colle
8
@Wesley, você precisa inverter a imagem então (para que o bit branco fique transparente e o restante branco), o que você pode fazer usando o seu editor de imagens e máscaras favoritos.
Charles Goodwin #
5
@CharlesGoodwin Isso só funciona, então a imagem é colocada em um fundo branco.
O WebKit agora suporta máscaras alfa em CSS. As máscaras permitem sobrepor o conteúdo de uma caixa com um padrão que pode ser usado para eliminar partes dessa caixa na exibição final. Em outras palavras, você pode recortar para formas complexas com base no alfa de uma imagem.
[...]
Introduzimos novas propriedades para fornecer aos designers da Web muito controle sobre essas máscaras e como elas são aplicadas. As novas propriedades são análogas às propriedades de imagem de fundo e de borda que já existem.
Isso faz parte de algum padrão (ainda por vir), pois eu não encontrei nenhuma informação não relacionada ao Webkit ou apenas o sabor da Apple? Parece que a W3 está sugerindo SVG para tais casos de uso: w3.org/TR/SVG/masking.html
feeela
3
Infelizmente, isso parece ser apenas o webkit e o blog engana usando imagens compostas em vez de exemplos reais. Esta resposta é um pouco de arenque vermelho.
A pergunta era sobre colorir uma imagem branca com fundo transparente. hue-rotatenão funciona em branco.
Synetech
17
Acho que tenho uma solução para isso que é a) exatamente o que você procurava há 5 anos eb) é um pouco mais simples do que as outras opções de código aqui.
Com qualquer png branco (por exemplo, ícone branco em fundo transparente), você pode adicionar um seletor :: after para recolorir.
.icon {
background: url(img/icon.png);/* Your icon */
position: relative;/* Allows an absolute positioned psuedo element */}.icon::after{
position: absolute;/* Positions psuedo element relative to .icon */
width:100%;/* Same dimensions as .icon */
height:100%;
content:"";/* Allows psuedo element to show */
background:#EC008C; /* The color you want the icon to change to */
mix-blend-mode: multiply;/* Only apply color on top of white, use screen if icon is black */}
Re-hospedei a imagem do imgur, estava tendo alguns problemas para carregá-la.
Chscblls
Na versão mais recente do Chrome, parece que o plano de fundo (transparente) também está sendo definido para a cor. No exemplo vinculado, quando passo o mouse, vejo apenas um quadrado rosa opaco ... Funciona bem no Firefox.
logidelic
1
@chrscblls O link está morto.
Steven Lu
15
A linha mais simples que funcionou para mim:
filter: opacity(0.5) drop-shadow(000 blue);
Você pode ajustar a opacidade de 0 a 1 para tornar a cor mais clara ou mais escura.
Agradável. Isso evita todas as limitações das outras soluções aqui.
cdonner
3
repeat gota-sombra 2-3 vezes para torná-lo mais forte
djdance
1
SOLUÇÃO GENIUS, parece um pouco confuso no CSS, mas com um comentário, é perfeitamente compreensível. Obrigado!
Richard KeMiKaL GeNeRaL Denton 03/12/19
não funcionará para obter cores exatas, é sempre algum tipo de mistura entre a cor original e a nova.
swisswiss 17/02
essa abordagem distorce levemente a imagem e piora toda vez que o sombreamento é aplicado. Como fazer uma cópia de uma cópia, os resultados são diferentes do original.
SMAG 21/02
8
Descobri isso enquanto pesquisava no Google, achei melhor trabalhar para mim ...
Isso funciona, votei em cima. Mas apenas para o registro, ele tem alguns problemas, como não pode dimensionar a imagem de fundo, não pode posicionar a imagem e se repete.
Como exigia uma cor específica, o filtro não funcionava para mim.
Em vez disso, criei uma div, explorando várias imagens de plano de fundo do CSS e a função gradiente linear (que cria a própria imagem). Se você usar o modo de mesclagem de sobreposição, sua imagem real será combinada com a imagem "gradiente" gerada que contém a cor desejada (aqui, # BADA55)
Não funcionou para mim. Eu não posso dizer por quê, eu copiar colado exatamente
Vic Seedoubleyew
@VicSeedoubleyew, o snippet funciona bem. Inspecione sua div usando ferramentas de desenvolvimento para garantir que seu CSS esteja realmente sendo aplicado. Além disso, verifique se o URL da sua imagem é válido se você não estiver usando o que eu forneci. EDIT: Se o snippet não funcionar, você pode estar usando um navegador desatualizado ou que não suporta a função gradiente linear.
Rolznz 17/05/19
5
Respondendo porque estava procurando uma solução para isso.
a caneta na resposta @chrscblls funciona bem se você tem um fundo branco ou preto, mas o meu não. Além disso, as imagens foram geradas com ng-repeat, então eu não poderia ter o URL deles no meu css E você não pode usar :: after nas tags img.
Então, imaginei uma solução e pensei que poderia ajudar as pessoas se elas também tropeçarem aqui.
Então, o que eu fiz é praticamente o mesmo com três diferenças principais:
como o URL está na minha tag img, coloquei (e um rótulo) em outra div na qual :: after funcionará.
o 'modo mistura-mistura' é definido como 'diferença' em vez de 'multiplicar' ou 'tela'.
Eu adicionei um :: before com exatamente o mesmo valor, para que o :: after fizesse a 'diferença' da 'diferença' feita pelo :: before e o cancelasse.
Para alterá-lo de preto para branco ou branco para preto, a cor do plano de fundo precisa ser branca. Do preto às cores, você pode escolher qualquer cor. Do branco às cores, você precisará escolher a cor oposta à desejada.
Não há necessidade de um conjunto de fontes inteiro, se você precisar apenas de um ícone, além disso, sinto que é mais "limpo" como um elemento individual. Portanto, para esse fim, em HTML5, você pode colocar um SVG diretamente dentro do fluxo do documento. Em seguida, você pode definir uma classe na folha de estilo .CSS e acessar sua cor de plano de fundo com a fillpropriedade
Observe que, no exemplo, eu usei :hoverpara ilustrar o comportamento; se você quiser apenas mudar de cor para o estado "normal", remova o pseudoclasse.
Para literalmente mudar a cor, você pode incorporar uma transição CSS com um filtro -webkit-onde, quando algo acontece, você chamaria o -webkit-filtro de sua escolha. Por exemplo:
Ao alterar uma imagem de preto para branco ou de branco para preto, o filtro de rotação da tonalidade não funciona, porque preto e branco não são tecnicamente cores. Em vez disso, as alterações de cor preto e branco (de preto para branco ou vice-versa) devem ser feitas com a propriedade de filtro invertido.
background-color
propriedade CSS. Você pode criar partes não transparentes que serão corrigidas e partes transparentes da imagem que serão preenchidas com qualquer cor que você desejar via CSS. É isso que você deseja alcançar?Respostas:
Você pode usar filtros com
-webkit-filter
efilter
: Os filtros são relativamente novos para os navegadores, mas são suportados em mais de 90% dos navegadores, de acordo com a seguinte tabela CanIUse: https://caniuse.com/#feat=css-filtersVocê pode alterar uma imagem para escala de cinza, sépia e muito mais (veja o exemplo).
Agora você pode alterar a cor de um arquivo PNG com filtros.
Fonte
fonte
.gifcorrect{ filter: invert(28%) sepia(100%) hue-rotate(-180deg) saturate(3); }
o que significa que você pode ir de preto e transparente ou em tons de cinza com a cor e funciona mesmo em gifs animadosEncontrei este ótimo exemplo de codepen que você insere seu valor de cor hexadecimal e ele retorna o filtro necessário para aplicar essa cor a png
Gerador de filtros CSS para converter de preto para cor hexadecimal alvo
por exemplo, eu precisava do meu png para ter a seguinte cor # 1a9790
então você deve aplicar o seguinte filtro a você png
fonte
filter: invert(1%) sepia(1%) saturate(1%) hue-rotate(1deg) brightness(1000%) contrast(80%);
Você pode dar uma olhada nas fontes Icon. http://css-tricks.com/examples/IconFont/
Edição: Estou usando Font-Awesome no meu projeto mais recente. Você pode até inicializá-lo. Basta colocar isso no seu
<head>
:E então vá em frente e adicione alguns links de ícones como este:
Aqui está a folha de dicas completa
--editar--
O Font-Awesome usa nomes de classes diferentes na nova versão, provavelmente porque isso reduz drasticamente os arquivos CSS e evita classes css ambíguas. Então agora você deve usar:
EDIT 2:
Acabei de descobrir que o github também usa sua própria fonte de ícone: Octicons É gratuito para download. Eles também têm algumas dicas sobre como criar suas próprias fontes de ícones .
fonte
Consegui fazer isso usando o filtro SVG. Você pode escrever um filtro que multiplique a cor da imagem de origem pela cor que deseja alterar. No trecho de código abaixo, cor de inundação é a cor para a qual queremos alterar a cor da imagem (que é vermelha nesse caso.) FeComposite diz ao filtro como estamos processando a cor. A fórmula para feComposite com aritmética é (k1 * i1 * i2 + k2 * i1 + k3 * i2 + k4) em que i1 e i2 são cores de entrada para in / in2 de acordo. Portanto, especificar apenas k1 = 1 significa que ele fará apenas i1 * i2, o que significa multiplicar as duas cores de entrada.
Nota: Isso funciona apenas com HTML5, pois está usando SVG embutido. Mas acho que você poderá fazer isso funcionar com um navegador mais antigo colocando o SVG em um arquivo separado. Ainda não tentei essa abordagem.
Aqui está o trecho:
fonte
A tag img possui uma propriedade background como qualquer outra. Se você tiver um PNG branco com uma forma transparente, como um estêncil, poderá fazer o seguinte:
fonte
Sim :)
fonte
Na maioria dos navegadores , você pode usar filtros:
nos
<img>
elementos e nas imagens de fundo de outros elementose defina-os estaticamente em seu CSS ou dinamicamente usando JavaScript
Veja as demonstrações abaixo.
<img>
elementosVocê pode aplicar esta técnica a um
<img>
elemento:Imagens de fundo
Você pode aplicar esta técnica a uma imagem de plano de fundo:
Javascript
Você pode usar o JavaScript para definir um filtro em tempo de execução:
fonte
hue-rotate
não funciona em branco.Acho que tenho uma solução para isso que é a) exatamente o que você procurava há 5 anos eb) é um pouco mais simples do que as outras opções de código aqui.
Com qualquer png branco (por exemplo, ícone branco em fundo transparente), você pode adicionar um seletor :: after para recolorir.
Veja este código (aplicando a troca de cores ao passar o mouse): http://codepen.io/chrscblls/pen/bwAXZO
fonte
A linha mais simples que funcionou para mim:
Você pode ajustar a opacidade de 0 a 1 para tornar a cor mais clara ou mais escura.
fonte
Descobri isso enquanto pesquisava no Google, achei melhor trabalhar para mim ...
HTML
CSS
http://jsfiddle.net/a63b0exm/
fonte
Como exigia uma cor específica, o filtro não funcionava para mim.
Em vez disso, criei uma div, explorando várias imagens de plano de fundo do CSS e a função gradiente linear (que cria a própria imagem). Se você usar o modo de mesclagem de sobreposição, sua imagem real será combinada com a imagem "gradiente" gerada que contém a cor desejada (aqui, # BADA55)
fonte
Respondendo porque estava procurando uma solução para isso.
a caneta na resposta @chrscblls funciona bem se você tem um fundo branco ou preto, mas o meu não. Além disso, as imagens foram geradas com ng-repeat, então eu não poderia ter o URL deles no meu css E você não pode usar :: after nas tags img.
Então, imaginei uma solução e pensei que poderia ajudar as pessoas se elas também tropeçarem aqui.
Então, o que eu fiz é praticamente o mesmo com três diferenças principais:
Para alterá-lo de preto para branco ou branco para preto, a cor do plano de fundo precisa ser branca. Do preto às cores, você pode escolher qualquer cor. Do branco às cores, você precisará escolher a cor oposta à desejada.
https://codepen.io/spaceplant/pen/oZyMYG
fonte
Não há necessidade de um conjunto de fontes inteiro, se você precisar apenas de um ícone, além disso, sinto que é mais "limpo" como um elemento individual. Portanto, para esse fim, em HTML5, você pode colocar um SVG diretamente dentro do fluxo do documento. Em seguida, você pode definir uma classe na folha de estilo .CSS e acessar sua cor de plano de fundo com a
fill
propriedadeViolino de trabalho: http://jsfiddle.net/qmsj0ez1/
Observe que, no exemplo, eu usei
:hover
para ilustrar o comportamento; se você quiser apenas mudar de cor para o estado "normal", remova o pseudoclasse.fonte
Para literalmente mudar a cor, você pode incorporar uma transição CSS com um filtro -webkit-onde, quando algo acontece, você chamaria o -webkit-filtro de sua escolha. Por exemplo:
fonte
Ao alterar uma imagem de preto para branco ou de branco para preto, o filtro de rotação da tonalidade não funciona, porque preto e branco não são tecnicamente cores. Em vez disso, as alterações de cor preto e branco (de preto para branco ou vice-versa) devem ser feitas com a propriedade de filtro invertido.
.img1 { filter: invert(100%); }
fonte
Fonte: https://codepen.io/taryaoui/pen/EKkcu
fonte