{"id":182,"date":"2008-12-23T13:30:02","date_gmt":"2008-12-23T12:30:02","guid":{"rendered":"http:\/\/www.sortea2.com\/blog\/?p=182"},"modified":"2008-12-23T14:43:55","modified_gmt":"2008-12-23T13:43:55","slug":"problemas-css-en-internet-explorer","status":"publish","type":"post","link":"https:\/\/www.sortea2.com\/blog\/2008\/12\/problemas-css-en-internet-explorer\/","title":{"rendered":"Problemas CSS en Internet Explorer"},"content":{"rendered":"<p><span class=\"header\">Problemas de CSS en Internet Explorer<\/span> <\/p>\n<p>Internet Explorer tiene una manera de entender CSS muy  \u201cpeculiar\u201d que\u00a0 hace que todos los  dise\u00f1adores web tengan que dedicar gran parte de su tiempo en hacer que su  proyecto funcione particularmente en Internet Explorer. Esto es una gran  p\u00e9rdida de tiempo y puede que de dinero, pero que no hay m\u00e1s remedio que  afrontar, por esto:<\/p>\n<p> <a href=\"http:\/\/www.thecounter.com\/stats\/2008\/December\/browser.php\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.sortea2.com\/blog\/wp-content\/uploads\/estadisticas_navegadores.jpg\" alt=\"estadisticas_navegadores.jpg\" width=\"497\" height=\"146\" border=\"0\" \/><\/a><\/p>\n<p> Hay que preocuparse por el volumen de visitas que van a  llegar al website por parte de Internet Explorer, porque es tal que no se puede  despreciar.<\/p>\n<p> <span class=\"header\">Caso particular<\/span> <\/p>\n<p> Particularmente, en Sortea2, nuestra <a href=\"http:\/\/www.sortea2.com\">p\u00e1gina de sorteos<\/a>, tambi\u00e9n tuvimos que lidiar con estos problemas,  tuvimos que tomar medidas porque la p\u00e1gina, que se visualizaba correctamente en  <a href=\"http:\/\/www.mozilla-europe.org\/es\/firefox\/\">firefox<\/a>, <a href=\"http:\/\/www.opera.com\/\">opera<\/a>, etc., era impresentable en <a href=\"http:\/\/www.microsoft.com\/spain\/windows\/ie\/default.mspx\">Explorer<\/a>, las cosas normalmente se  montaban unas encima de otras y tal.<span class=\"header\"><\/p>\n<p> <span class=\"header\">Qu\u00e9 cosas dan problemas<\/span> <\/p>\n<p> Tras haber terminado el dise\u00f1o de Sortea2, he llegado a la conclusi\u00f3n de que  estas cosas son las que dan problemas:<\/p>\n<ol>\n<li>Listas.<\/li>\n<li>M\u00e1rgenes negativos para posicionar.<\/li>\n<li>Posicionamiento normal.<\/li>\n<li>Desbordamiento de divs.<\/li>\n<li>Im\u00e1genes de fondo.<\/li>\n<\/ol>\n<p>1.\u00a0 Las listas es lo  que habitualmente m\u00e1s problemas da, cuando quieres formatearlas con padding y  margin suelen tratar las cosas de diferente manera que los navegadores  normales. Por ejemplo, no puedes variar el valor de margin-left en las listas  para que est\u00e9n alineadas a la izquierda con tan solo poner: \u201cmargin-left:0px;\u201d.<br \/> Tambi\u00e9n suelen dar problemas las listas que se colocan a lo ancho (float:left;),  hay que ir probando con qu\u00e9 valores funcionan bien. Por ejemplo, en nuestro  men\u00fa horizontal, el valor float:left; hab\u00eda que ponerlo en #menu_horizontal li  a {} para que funcionase, mientras que en otros lugares se pod\u00eda colocar  directamente en #menu_horizontal li {}.<\/p>\n<p> 2. Los m\u00e1rgenes negativos no s\u00e9 exactamente por qu\u00e9 dan  tantos problemas. A veces funcionan, otras veces no, y otras veces hay que  poner valores distintos a lo habitual para que se coloque en el lugar que se  desea. El mejor ejemplo es en la parte de arriba de sortea2, en la que se ve  una diferencia de colocaci\u00f3n entre cualquier navegador y Internet Explorer,  esto es debido a que a veces los m\u00e1rgenes negativos no funcionaban y tuvimos  que intentar colocar las cosas con otros valores.<\/p>\n<p> 3. El posicionamiento normal, con \u201cposition:relative y  absolute\u201d no suele dar muchos quebraderos de cabeza, simplemente algunas veces  hay que cambiar los valores un poco para que las cosas cuadren.<\/p>\n<p> 4. El desbordamiento de divs tiene su \u201cparticularidades\u201d en  Internet Explorer cuando se quiere hacer \u201coverflow\u201d. Normalmente al desbordarlo  suele tener despu\u00e9s un tama\u00f1o extra\u00f1o que cuesta colocar. Esto nos pas\u00f3 con el  div #resultado, que se despliega en la <a href=\"http:\/\/www.sortea2.com\/sorteos\">pantalla de sorteos simples<\/a> al hacer un  sorteo, en firefox funciona perfectamente, pero en internet explorer se ve como  se contrae un poco cuando la lista de ganadores es demasiado grande y hace que  salga el scroll en el div.<\/p>\n<p> 5. Las im\u00e1genes de fondo se suelen colocar correctamente y  tal, el problema es el orden en que se cargan. Por ejemplo, al principio, en  las pesta\u00f1as que se utilizan cuando se utiliza el buscador o en la pantalla de  Mis Sorteos, utiliz\u00e1bamos un hover que consist\u00eda en otra imagen, Bien, pues  firefox y opera cargaban esa imagen antes de que terminara de cargar la p\u00e1gina,  por lo que el efecto se hac\u00eda correctamente; el problema lo daba Internet  Explorer, porque se cargaba la imagen en el momento en que se hac\u00eda el hover,  con lo que hab\u00eda que esperar un tiempo para ver el efecto. Fue tan desastroso  el resultado que optamos por subrayar esos links al pasar por encima y listo,  de camino lo dejamos igual para ambos navegadores.<\/p>\n<p> <span class=\"header\">Soluciones<\/span> <\/p>\n<p> La soluci\u00f3n por la que optamos nosotros fue: <\/p>\n<ul>\n<li>Una hoja de estilos com\u00fan, en la que las  propiedades que funcionasen en ambas estuvieran recogidas.<\/li>\n<li>Una hoja de estilos para Internet Explorer, con  todas las correcciones posibles para que se mostrase bien la p\u00e1gina.<\/li>\n<li>Una hoja de estilos para los dem\u00e1s navegadores.  Para evitar que unas propiedades se pisaran a otras, optamos por poner en una  hoja de estilos independiente todas las propiedades que daban problemas en  Explorer, pero con los valores que ser\u00edan normales.<\/li>\n<\/ul>\n<p>Ahora bien, \u00bfc\u00f3mo sabemos qu\u00e9 navegador est\u00e1 mostrando la  p\u00e1gina y por lo tanto qu\u00e9 hoja de estilo abrir?<br \/> Bien, nuestra p\u00e1gina est\u00e1 hecha con PHP, por lo que os voy a  mostrar un m\u00e9todo para hacerlo con este lenguaje (tambi\u00e9n se podr\u00eda hacer con  javascript).<\/p>\n<p> <span class=\"header\">Abrir una hoja u otra dependiendo del navegador<\/span> <\/p>\n<p> Bien, PHP recibe por parte del navegador una serie de <strong>variables de servidor<\/strong> (idioma, <strong>navegador, <\/strong>versi\u00f3n de este \u00faltimo, etc.), pues tenemos que recoger lo que diga la  variable que dice qu\u00e9 navegador est\u00e1 mostrando la p\u00e1gina:<\/p>\n<p> $idnavegador = $_SERVER[&#8216;HTTP_USER_AGENT&#8217;];<\/p>\n<p> Esto es lo que obtendr\u00edamos de firefox:<br \/> <em>Mozilla\/5.0 (Windows;  U; Windows NT 5.1; es-ES; rv:1.9.0.5) Gecko\/2008120122 Firefox\/3.0.5<\/em><\/p>\n<p> Y esto es lo que nos devuelve Internet Explorer:<br \/> <em>Mozilla\/4.0 (compatible; MSIE 6.0; Windows NT  5.1; SV1; InfoPath.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR  3.0.04506.30)<\/em><\/p>\n<p> Debe haber alguna manera universal que distinga ambos  c\u00f3digos, porque Internet Explorer da problemas igualmente en su versi\u00f3n 6 como  en su versi\u00f3n 7. <br \/> Bueno, pues vamos a buscar las diferencias entre ambas  cadenas para ver qu\u00e9 podemos sacar que nos diga que estamos en Explorer.<\/p>\n<p> En <em>Mozilla\/X.0 <\/em>no  se puede sacar mucho, la verdad, porque es casi id\u00e9ntico y con PHP no se podr\u00eda  hacer un c\u00e1lculo. Pero si nos metemos dentro del par\u00e9ntesis\u00a0 empezamos a ver cosas interesantes, y ya si  nos metemos en ver que hay despu\u00e9s del punto y coma, ya lo tenemos.<\/p>\n<p> Uno nos devuelve una U y otro nos dice MSIE X.XX, ah\u00ed est\u00e1  la diferencia; pero queremos detectar cualquier explorer, no una versi\u00f3n  determinada; bien, pues recoges la palabra MSIE y listo, con un parseo veremos  que se puede hacer f\u00e1cilmente: <\/p>\n<div id=\"codigo\"> $puntocoma = <span class=\"literales\">&quot;;&quot;<\/span>;<br \/>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <br \/> $total_length = <span class=\"funciones_php\">strlen<\/span>($idnavegador);<br \/> $puntocoma1 = <span class=\"funciones_php\">strpos<\/span>($idnavegador, $puntocoma);<br \/> $navegador = <span class=\"funciones_php\">substr<\/span>($idnavegador, ($puntocoma1 + <span class=\"numero\">2<\/span>), ($total_length &#8211;  $puntocoma1));<br \/> $navegador = <span class=\"funciones_php\">substr<\/span>($navegador, <span class=\"numero\">0<\/span>, <span class=\"numero\">5<\/span>);<\/div>\n<p> Es cierto que puede ser un poco lioso, pero es simple: se  busca el punto y coma, se coge lo que hay despu\u00e9s de \u00e9l, y luego se cogen 5  caracteres (con 4 recuerdo que dio problemas una vez) de lo que se haya sacado.  Con esto ya tenemos esto: \u201cMSIE \u201c, \u00a1era lo que quer\u00edamos!, bueno, pues ahora  con un if abrimos una hoja u otra y ya est\u00e1 todo listo. <\/p>\n<div id=\"codigo\"> <span class=\"verde\">if<\/span>  ($navegador == &quot;MSIE &quot;)<br \/> <span class=\"indented\"><span class=\"funciones_php\">echo<\/span> <span class=\"literales\">&quot;\\t&lt;link  href=&#8217;..\/css\/ie-hacks.css&#8217; rel=&#8217;stylesheet&#8217; type=&#8217;text\/css&#8217;&gt;\\n&quot;<\/span>;<\/span><br \/> <span class=\"verde\">else<\/span><br \/> <span class=\"indented\"><span class=\"funciones_php\">echo<\/span> <span class=\"literales\">&quot;\\t&lt;link  href=\\&quot;..\/css\/normal.css\\&quot; rel=\\&quot;stylesheet\\&quot;  type=\\&quot;text\/css\\&quot; \/&gt;\\n&quot;<\/span>;<\/span> <\/div>\n<p>Ya est\u00e1, ahora ponemos las propiedades que dan problemas en  ie-hacks y ya solo se ver\u00e1n en ese navegador.<\/p>\n<p> <span class=\"header\">Conclusi\u00f3n<br \/> <\/span><br \/> Internet Explorer es un navegador problem\u00e1tico y tenemos que poner nuestros  medios para hacer que esos problemas desaparezcan porque tiene una cuota de  mercado espectacular y merece la pena dedicarle tiempo.<br \/> Puede que nuestro m\u00e9todo de obtenci\u00f3n del navegador no sea  precisamente la mejor y la m\u00e1s simple, pero lo cierto es que funciona y que  jam\u00e1s ha dado ning\u00fan problema. <\/p>\n<\/p>\n<p><span class=\"header\">Consejo final<\/span> <\/p>\n<p> Como consejo final te dir\u00e9 que cada vez que hagas alg\u00fan cambio relativamente  importante en tu web, si no eres un asiduo a Internet Explorer, que la pruebes ah\u00ed  antes de seguir con otra cosa, porque luego volver atr\u00e1s para resolver  problemas antiguos es muy molesto.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Problemas de CSS en Internet Explorer Internet Explorer tiene una manera de entender CSS muy \u201cpeculiar\u201d que\u00a0 hace que todos los dise\u00f1adores web tengan que dedicar gran parte de su tiempo en hacer que su proyecto funcione particularmente en Internet Explorer. Esto es una gran p\u00e9rdida de tiempo y puede que de dinero, pero que [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[],"class_list":["post-182","post","type-post","status-publish","format-standard","hentry","category-tutoriales"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.sortea2.com\/blog\/wp-json\/wp\/v2\/posts\/182","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.sortea2.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.sortea2.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.sortea2.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sortea2.com\/blog\/wp-json\/wp\/v2\/comments?post=182"}],"version-history":[{"count":6,"href":"https:\/\/www.sortea2.com\/blog\/wp-json\/wp\/v2\/posts\/182\/revisions"}],"predecessor-version":[{"id":188,"href":"https:\/\/www.sortea2.com\/blog\/wp-json\/wp\/v2\/posts\/182\/revisions\/188"}],"wp:attachment":[{"href":"https:\/\/www.sortea2.com\/blog\/wp-json\/wp\/v2\/media?parent=182"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sortea2.com\/blog\/wp-json\/wp\/v2\/categories?post=182"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sortea2.com\/blog\/wp-json\/wp\/v2\/tags?post=182"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}