El Comercio Digital

Webmaster Libre

Desarrollo Web con Software Libre

PNGs con transparencia en Internet Explorer

Una de las “novedosas novedades” del Internet Explorer 7 es el soporte a la transparencia de los PNG, ¡por fin! No obstante, seguro que aún nos quedan algunos años de versiones anteriores que no tragan bien con las transparencias.

Para solucionar este “pequeño” inconveniente existen algunos trucos, unos sirven para unos casos , otros para otros.

Soluciones:
Con Javascript
Con filtros propietarios para Internet Explorer y CSS

Con Javascript:

Bob Osola ideó esta solución para conseguir que las imágenes PNG contenidas en las etiquetas img se representen correctamente con su transparencia.

Utilizando un comentario condicional averiguamos si el visitante utiliza alguna versión inferior a Explorer 7

<!--[if lt IE 7]>
<script defer type="text/javascript" src="png.js"></script>
<![endif]-->

y si es así cargamos el script contenido en un archivo llamado, por ejemplo, png.js

var arVersion = navigator.appVersion.split("MSIE")
var version = parseFloat(arVersion[1])

if ((version >= 5.5) && (document.body.filters))
{
   for(var i=0; i<document.images.length; i++)
   {
      var img = document.images[i]
      var imgName = img.src.toUpperCase()
      if (imgName.substring(imgName.length-3, imgName.length) == "PNG")
      {
         var imgID = (img.id) ? "id='" + img.id + "' " : ""
         var imgClass = (img.className) ? "class='" + img.className + "' " : ""
         var imgTitle = (img.title) ? "title='" + img.title + "' " : "title='" + img.alt + "' "
         var imgStyle = "display:inline-block;" + img.style.cssText
         if (img.align == "left") imgStyle = "float:left;" + imgStyle
         if (img.align == "right") imgStyle = "float:right;" + imgStyle
         if (img.parentElement.href) imgStyle = "cursor:hand;" + imgStyle
         var strNewHTML = "<span " + imgID + imgClass + imgTitle
         + " style=\"" + "width:" + img.width + "px; height:" + img.height + "px;" + imgStyle + ";"
         + "filter:progid:DXImageTransform.Microsoft.AlphaImageLoader"
         + "(src=\'" + img.src + "\', sizingMethod='scale');\"></span>"
         img.outerHTML = strNewHTML
         i = i-1
      }
   }
}

Como todo, esta solución tiene sus pros y contras:

    Pros:

  • Se ignora como un comentario en navegadores que no sean Internet Explorer
  • Funciona con Doctypes estrictos y transicionales.
  • No rompe con la validación del W3C
  • Ligero y simple de implementar
  • Funciona con estilos en linea y externos

    Contras:

  • No funciona en navegadores anteriores a la versión 5.5 (aunque dado que el soporte para versiones anteriores ya no existe…)
  • Requiere Javascript
  • No soporta las imágenes de fondo establecidas con CSS
  • Se pierden las reglas de estilo aplicadas al elemento img en las imagenes PNG, se soluciona creando una clase que añadir a dichas imágenes que cumpla las mismas funciones.
    <img src="imagen.png" class="png" />

Filtros propietarios para Explorer y CSS

Cuando lo que queremos es aplicar imagenes PNG con transparencia como fondos por medio de CSS se hace nesario recurrir a filtros. Para no romper la validación de nuestro código incluiremos un comentario condicional, como el del anterior ejemplo para que, si el usuario usa Internet Explorer por debajo de la versión 7, se cargue una hoja de estilo adicional que aplique el truco.

<link href="estilo.css" rel="stylesheet" type="text/css" />
<title>Titulo de la Página</title>
<!--[if lt IE 7]>
<script defer type="text/javascript" src="png.js"></script>
<link href="ie.css" rel="stylesheet" type="text/css" />
<![endif]-->

Entonces, añadimos la imagen de fondo en el CSS general

#header {
background-image: url(fondo.png);
background-repeat: no-repeat;
}

y, al archivo ie.css de la siguiente forma

#header {
background: none; /* Eliminamos el fondo cargado por el CSS general */
filter: progid:DXImageTransform.Microsoft.AlphaImageLoader (src="fondo.png",
sizingMethod="image");/*Añadimos la imagen de fondo por medio de un filtro*/
background-repeat:no-repeat;
}

Sin duda, ninguna de las dos soluciones son lo ideal pero hacen el trabajo que, a fin de cuentas es lo que queremos ¿no?

CSS, Codigo, Javascript

Si te ha gustado este post no olvides suscribirte al feed para estar al tanto de las novedades

14 Respuestas a “PNGs con transparencia en Internet Explorer”

Agrega tu comentario

  1. xalportadorx dice:

    jo muchas gracias hace mucho que necesitaba algo así ;)

  2. A mí me pasa algo extraño, al intentar poner el fondo png en formato css, para una tabla, la tabla toma el tamaño de la imagen de fondo.

    y la imagen es de 100×100 px por ende no se lee lo que esta en la tabla, tuve que agrandar la imagen de fondo, pero la idea es que la imagen se repita, para llenar la tabla

  3. nefty dice:

    Acerca del problema de Joaquin Souyris, el png como fondo dentro del css para que se repita no funciona. Quisiera saber si usted sabe como lograr que el png no se estire a la propiedad definida en el filtro como “sizingMethod” podria ser como “AUTO” de tal forma que se estire o repita y sea por x-axis o y-axis.

    Porfavor agradeceria comentarios..

  4. me gutaria utilizarlo…tengo la version ultima de explorer..como podria usarlo..y como podria yo…buscar diseños…crear los propios?

    por favor me gustaria saber

    saludoz

    chauzzzzzzz

  5. fredy dice:

    Tengo los siguiente problemas y lo he probado con JS y CSS:
    - Algunos funciona la transparencia y en otras se pierde la imagen (cuando se usa el CSS, con el blank.gif.
    - Cuando uso con JS no puedo usarlo como una imagen con un link.
    - Y cómo hacer el efecto de agrandar la imagen al pasar el mouse y este a la vez sea un link, usando PNG con transparencia.

  6. La verdad es que no funciona para imágenes de fondo. Puedes probar ie7, la librería javascript de Dean Edwards a ver si te va algo mejor.

  7. moraalberto dice:

    Tengo un problema que me urge resolver con un sitio en el que trabajo, la mayoría de las imágenes como botones y algunos fondos están en png y como ya sabemos en explores con versiones inferiores a la 7 me aparecen con un fondo gris o celeste, todas son con trasnparencias y no fueron incertadas como css, todas fueron incertadas como layers. ME URGE, NECESITO CORREGIRLO. CÓMO PUEDO HACERLO? SALUDOS Y GRACIAS.

  8. WalteR Bove dice:

    Me funciona perfecto, puse la imagen.png transparente como fondo y se visualiza bien en IE. Pero a raíz de esto, los links que quedan por arriba ya no funcionan. Que puede estar pasando?

  9. Parece que eso es consecuencia del hack, prueba a emplear la libreria de Dean Edwars que le recomendé a fredy aunque mucho me temo que tiene mala solución…

  10. gustavo dice:

    Y como seria si la imagen png no esta de fondo sino con un link sobre ella? gracias

  11. pepe dice:

    esta chimbada no sirve para puta madre no sean tan incapaces

  12. Ariel dice:

    Me has salvado!!! muchas gracias la opcion en JS me sirvio de sobremanera

    les recomiendo ieTester para probar su sitios en todos los ie
    http://www.my-debugbar.com/wiki/IETester/HomePage

Trackbacks/Pingbacks

  1. SigT dice:

    Siglink.14…

    Una vez más, el listado de enlaces teóricamente semanales que nunca se sabe que día de la semana del año aparecerán™.

    Aprovecho para comentar que los Siglinks como tales, desaparecen. Si el hombre es un animal de costumbres, yo lo debo de s…

  2. [...] Fuente: Webmasterlibre [...]

Feed RSS de los comentarios de este post.

Deja tu comentario

Por favor, procura que tus comentarios aporten algo al tema del artículo. Los comentarios ofensivos y el spam serán eliminados.

Si tu comentario no aparece al momento puede que esté en la cola de moderación o en Akismet, lo reviso cada día pero si ves que pasa un tiempo prudencial y no aparece dímelo

Este post tiene 2 años. Puedes dejar un comentario de todas formas y volver más tarde para comprobar si hay novedades sobre el tema.

Información:

Webmaster Libre es un blog de Alma Fernández Página alojada en Redcoruna