¿Escala de grises con CSS y cambio de color al pasar el mouse?

Estoy buscando tomar un icono que sea de color (y que sea un enlace) y convertirlo en escala de grises hasta que el usuario coloque el mouse sobre el ícono (donde luego colorearía la imagen).

¿Es posible hacerlo, y de una manera que sea compatible con IE y Firefox?

Existen numerosos métodos para lograr esto, que detallaré con algunos ejemplos a continuación.

CSS puro (usando solo una imagen coloreada)

img.grayscale { filter: url("data:image/svg+xml;utf8,#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%); } 
 img.grayscale { filter: url("data:image/svg+xml;utf8,#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; } 
 

Firefox, Chrome, Safari, IE6-9

IE10 with inline SVG

Respondido aquí: Convierta una imagen a escala de grises en HTML / CSS

Ni siquiera necesita usar dos imágenes que suenan como una biblioteca de dolor o de manipulación de imágenes, puede hacerlo con soporte de navegador cruzado (versiones actuales) y simplemente usar CSS. Este es un enfoque de mejora progresiva que simplemente vuelve a las versiones de color en los navegadores más antiguos:

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

y el archivo filters.svg de esta manera:

      

Uso el siguiente código en http://www.diagnomics.com/

Suave transición de b / w a color con efecto de aumento (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); } 

Puede usar un sprite que tenga ambas versiones, la coloreada y la monocromática, almacenadas en ella.