Estou tentando pegar um ícone que é colorido (e será um link) e transformá-lo em tons de cinza até que o usuário coloque o mouse sobre o ícone (onde ele então coloriria a imagem).
É possível fazer isso de uma forma que seja compatível com o IE e o Firefox?
Respostas:
Existem vários métodos para fazer isso, que detalharei com alguns exemplos abaixo.
CSS puro (usando apenas uma imagem colorida)
img.grayscale { filter: url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'grayscale\'><feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\'/></filter></svg>#grayscale"); /* Firefox 3.5+ */ filter: gray; /* IE6-9 */ -webkit-filter: grayscale(100%); /* Chrome 19+ & Safari 6+ */ } img.grayscale:hover { filter: none; -webkit-filter: grayscale(0%); }
Exibir trecho de código
img.grayscale { filter: url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'grayscale\'><feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\'/></filter></svg>#grayscale"); /* Firefox 3.5+, IE10 */ filter: gray; /* IE6-9 */ -webkit-filter: grayscale(100%); /* Chrome 19+ & Safari 6+ */ -webkit-transition: all .6s ease; /* Fade to color for Chrome and Safari */ -webkit-backface-visibility: hidden; /* Fix for transition flickering */ } img.grayscale:hover { filter: none; -webkit-filter: grayscale(0%); } svg { background: url(http://4.bp.blogspot.com/-IzPWLqY4gJ0/T01CPzNb1KI/AAAAAAAACgA/_8uyj68QhFE/s400/a2cf7051-5952-4b39-aca3-4481976cb242.jpg); } svg image { transition: all .6s ease; } svg image:hover { opacity: 0; }
<p>Firefox, Chrome, Safari, IE6-9</p> <img class="grayscale" src="http://4.bp.blogspot.com/-IzPWLqY4gJ0/T01CPzNb1KI/AAAAAAAACgA/_8uyj68QhFE/s1600/a2cf7051-5952-4b39-aca3-4481976cb242.jpg" width="400"> <p>IE10 with inline SVG</p> <svg xmlns="http://www.w3.org/2000/svg" id="svgroot" viewBox="0 0 400 377" width="400" height="377"> <defs> <filter id="filtersPicture"> <feComposite result="inputTo_38" in="SourceGraphic" in2="SourceGraphic" operator="arithmetic" k1="0" k2="1" k3="0" k4="0" /> <feColorMatrix id="filter_38" type="saturate" values="0" data-filterid="38" /> </filter> </defs> <image filter="url("#filtersPicture")" x="0" y="0" width="400" height="377" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://4.bp.blogspot.com/-IzPWLqY4gJ0/T01CPzNb1KI/AAAAAAAACgA/_8uyj68QhFE/s1600/a2cf7051-5952-4b39-aca3-4481976cb242.jpg" /> </svg>
Você pode encontrar um artigo relacionado a esta técnica aqui .
CSS puro (usando uma escala de cinza e imagens coloridas)
Essa abordagem requer duas cópias de uma imagem: uma em escala de cinza e outra colorida. Usando o
:hover
psuedoselector CSS , você pode atualizar o plano de fundo do seu elemento para alternar entre os dois:#yourimage { background: url(../grayscale-image.png); } #yourImage:hover { background: url(../color-image.png}; }
Exibir trecho de código
#google { background: url('http://www.google.com/logos/keystroke10-hp.png'); height: 95px; width: 275px; display: block; /* Optional for a gradual animation effect */ transition: 0.5s; } #google:hover { background: url('https://graphics217b.files.wordpress.com/2011/02/logo1w.png'); }
<a id='google' href='http://www.google.com'></a>
Isso também pode ser feito usando um efeito de foco baseado em Javascript, como a
hover()
função jQuery, da mesma maneira.Considere uma biblioteca de terceiros
A biblioteca desaturate é uma biblioteca comum que permite alternar facilmente entre uma versão em tons de cinza e uma versão colorida de um determinado elemento ou imagem.
fonte
Respondido aqui: converter uma imagem em tons de cinza em HTML / CSS
Você nem precisa usar duas imagens que soam como uma chatice ou uma biblioteca de manipulação de imagens, você pode fazer isso com suporte para vários navegadores (versões atuais) e apenas usar CSS. Esta é uma abordagem de aprimoramento progressivo que apenas retorna às versões coloridas em navegadores mais antigos:
img { filter: url(filters.svg#grayscale); /* Firefox 3.5+ */ filter: gray; /* IE6-9 */ -webkit-filter: grayscale(1); /* Google Chrome & Safari 6+ */ } img:hover { filter: none; -webkit-filter: none; }
e o arquivo filters.svg como este:
<svg xmlns="http://www.w3.org/2000/svg"> <filter id="grayscale"> <feColorMatrix type="matrix" values="0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0" /> </filter> </svg>
fonte
Eu uso o seguinte código em http://www.diagnomics.com/
Transição suave de p / b para cores com efeito de ampliação (escala)
img.color_flip { filter: url(filters.svg#grayscale); /* Firefox 3.5+ */ filter: gray; /* IE5+ */ -webkit-filter: grayscale(1); /* Webkit Nightlies & Chrome Canary */ -webkit-transition: all .5s ease-in-out; } img.color_flip:hover { filter: none; -webkit-filter: grayscale(0); -webkit-transform: scale(1.1); }
fonte
Você pode usar um sprite que tenha ambas as versões - colorida e monocromática - armazenadas nele.
fonte
Aqui está uma demonstração. Até funciona no IE7:
http://james.padolsey.com/demos/grayscale/
e
http://james.padolsey.com/javascript/grayscaling-in-non-ie-browsers/
fonte