Home > Web Programming, Web Tips & Tricks > IE6: LI height bug

IE6: LI height bug

December 9th, 2009 Lascia un commento Vai ai commenti

IE6: spazzatura, ancora usata però!Appena risolto un altro problema di incompatibilità di quello stron*o di IE6, il peggior browser che il mondo informatico e web abbia mai visto: non per problemi prestazionali, ma per problemi di compatibilità con le direttive del W3C!

Uno di questi problemi l'ho chiamato "LI Height bug" ovvero problema della gestione delle altezze di liste (UL>LI), gestite visivamente via CSS, per creare un menù di navigazione verticale.

 

Esempio menù (LI)

Per prima cosa vi do il codice minimale per la creazione di un menù di navigazione verticale fatto con le liste, se volete altri esempi chiedete ai ragazzi: menù verticale css.

Considerate che #menuList è l'id di un elemento di tipo UL.

#main #menu #menuList{
    list-style: none;
    padding: 0 0 0 0;
    margin: 0 0 10px 0;
}
#main #menu #menuList li{
    padding: 0 0 0 0;
    margin: 0 0 3px 0;
    height: 25px;
}
#main #menu #menuList a{
    display: block;
    background-image: url(img/_menuBg.gif);
    background-position: top;
    background-repeat: no-repeat;
    text-decoration: none;
    
    font-family: "Times New Roman", Times, serif;
    font-size: 15px;
    text-transform: uppercase;
    color: white;
    letter-spacing: -1px;
    padding: 6px 0 0 20px;
}
/* i6 suck... */
#main #menu #menuList li
{
height: auto !important; /* altri browser */
height: 1%; /* per IE */

}

Soluzione del problema

Grazie a quel genio di capobecchino, sono riuscito a capire che il problema del mio menù su IE6 era relativo a un problema di compatibilità risolvibile con un bordo, o almeno il buon @capobecchino ha testato inserendo un bordo di 1px sul <li> e si è risolto.

Ma perchè devo rovinare il mio layout con un bordo? Chiacchierando con lui mi sono ricordato un mio vecchio post, dove segnalavo problemi di gestione delle altezze dei DIV da parte di IE6 "Min height in IE". Vuoi vedere che il problema è il medesimo? Vuoi vedere che il mio LI fa i capricci con IE6 perchè essendo in modalità visiva display:block è uguale uguale a un DIV?

Ed in pochi nanosecondi è uscita la soluzione: IE6 ha problemi con la gestione dell'height dei DIV, o meglio degli elementi con display:block! E' sufficiente dare una dimensione al LI, che tanto IE6 se ne frega, e il gioco è fatto, non dimenticandosi di dire agli altri browser intellingenti di non considerare tale istruzione usando l'attributo !important dei CSS.

/* i6 suck... */
#main #menu #menuList li
{
height: auto !important; /* altri browser */
height: 1%; /* per IE */

}

Tutto chiaro? Concludo con una pillola del maestro capobecchino:

mi sa che se dono il mio cervello a google, superiamo bing come analisi logica :P
 

 

Il problema IE6

Se ne parla spesso nei geek blog dei webmaster: la piaga IE6 affligge ancora il nostro lavoro e purtroppo, in Italia, l'incidenza sui navigatori – ovvero la quantità di utilizzatore di Internet Explorer 6 - varia ancora tra il 15 e il 25 %. Un dato assolutamente non sottovalutabile con un semplice "E' un problema loro" in quanto quota troppo incidente. Utenti che navigano male nel sito possono facilmente trasformarsi in clienti persi!

Cosa fare? Cercare di applicare tutte le possibili soluzioni perchè il sito si veda bene anche con IE6, testandolo magari con IE6 StandAlone. Inserire nel sito un avviso di aggiornare il browser. La tecnica potrebbe essere questa, ma a voi ogni soluzione venga in mente, basta sia non bloccante, altrimenti il clienti se ne va!

<html>
<head>
<script type="text/javascript">
function detectBrowser()
{
var browser=navigator.appName;
var b_version=navigator.appVersion;
var version=parseFloat(b_version);
if (navigator.appVersion.indexOf("MSIE 7") < 0 && navigator.appVersion.indexOf("MSIE 8") < 0)
  {
  alert("Attenzione, il tuo browser IE è molto vecchio. Per godere appieno della qualità dei siti internet e bloccare software dannoso di consigliamo di aggiornarlo: http://www.microsoft.com/windows/Internet-explorer/default.aspx\n\n" + navigator.appVersion);
  }
}
</script>
</head>
<body onload="detectBrowser();">
</body>
</html>

Lo script proposto verifica che se il browser non sia MSIE 7 o MSIE 8, allora deve essere aggiornato. E' una versione dimostrativa e  non risolutiva: se esce MSIE 9 è da aggiornare. Purtroppo il numero della versione non è un dato atomico ma deve essere estratto da una stringa: se volete procedere voi con la creazione dello script definitivo i commenti sono a vostra disposizione.

4.0 (compatible; MSIE 6.0; Windows NT 5.1; GTB6; .NET CLR 1.1.4322; InfoPath.1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; FDM; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; .NET4.0E)

Una interessante discussione in merito al tema IE6, la trovate sul sito Design Multimedia.

 

foto di Morg

 

Approfondimenti online

La tecnologia informatica ha fatto passi da gigante. In modo particolare Google, che con il suo analizzatore di testo, è in grado di proporre collegamenti contestuali a quanto hai appena letto. Questi i link pubblicitari proposti da Adsense.

1 Tweet

  1. December 9th, 2009 at 14:07 | #1

    Già, IE6 se ne frega degli !important … bello il nome del commento, anche io ne ho qualcuno dove insulto zio bill e co. :-D

    Un piccolo consiglio, forse sarebbe meglio sfruttare:

    $_SERVER['HTTP_USER_AGENT']

    Si sa mai, l’utonto avesse anche i .js disabilitati…

    byezzzzzzzz

  2. December 9th, 2009 at 14:09 | #2

    @Joel sicuramente sempre meglio usare controlli lato server, quando è possibile e quando c’è un’azione che non è sincrona. Ottimo consiglio.

  3. December 11th, 2009 at 09:57 | #3

    Molto bene un hack css in più non fa male, presto lo troverò, approvo l’iniziativa dell’alert anche se penso di presentarla in maniera diversa magari con un banner.

  4. December 11th, 2009 at 09:58 | #4

    @DesMM assolutamente si! Ma anche un bel popover (tanto per rompere le palle), magari con un cookie “settimanale”. Cmq la soluzione che trovi qua penso risolva l’80% dei problemi di compatibilità… infatti ne avevo già parlato e mi ero dimenticato!

  5. December 13th, 2009 at 08:28 | #5

    Bravo, buono a sapersi :)

  6. December 13th, 2009 at 08:53 | #6

    Mi ricordavo di averne sentito parlare, ma non ricordavo dove; ora mi sono ricordato che ne ho scritto addirittura sul mio blog ;)
    http://www.dozarte.com/wordpress/2008/12/07/non-preoccupiamoci-piu-di-explorer-6/
    Si tratta di una libreria javascript che dovrebbe far comportare IE6 come se fosse IE7, mettendo una pezza ai vari bug CSS e HTML.
    Bello, no?

  7. December 14th, 2009 at 09:45 | #7

    @DoZ l’idea non è male. Il fatto di avere un signore JS che mi rismacchina tutto il CSS sinceramente non lo apprezzo molto: sicuramente però è comodo! Grazie della segnalazione. A buon rendere.

  8. December 15th, 2009 at 18:34 | #8

    http://tinyurl.com/ya65qld IE6: LI height bug

    This comment was originally posted on Twitter

  9. December 16th, 2009 at 10:12 | #9

    Ciao, piacere di conoscerti… curiosando sono entrato qui, ho letto e così, sempre per curiosità, ho fatto delle prove, ma non ho capito dov’è il problema.

    Cioè, ho creato un menù prendendo quel codice, ho aggiunto un colore di background al li (altrimenti non potevo capire il problema dell’altezza differente), ho aperto ie8, ie6 e ff.

    Il risultato a video, però, è lo stesso su tutti e 3 i browsers. Così ho eliminato il suck (come lo chiami tu), l’altezza è aumentata, ma è aumentata in egual misura su tutti e 3 i browsers. Quindi, ripeto, non ho capito il problema. :-o

    • December 16th, 2009 at 10:23 | #10

      Purtroppo non posso mandarti il caso specifico sul quale ho lavorato. Comunque il problema salta fuori con gli elementi in display:block in quanto IE6 spesso non è in grado di calcolare in modo corretto l’altezza automatica. Alla fine il suck lo sui se ti serve. Se dai test tutto ti compare perfetto sei apposto, no?

  10. December 16th, 2009 at 11:27 | #11

    ciao merlinox, ti segnalo una soluzione proposta da un mio utente:
    http://www.italianwebdesign.it/bug-di-explorer-6-sugli-elementi-di-lista/#comment-20783
    credo sia molto veloce, si tratta della stessa cosa?

    • December 16th, 2009 at 11:29 | #12

      Dovrei provarlo, ma così a pelle non mi sembra una soluzione. Il problema è il medesimo, ma passare un elemento da block a inline, ne cambia completamente il comportamento visivo… o no?

  11. December 16th, 2009 at 12:11 | #13

    Ah, ok ok… quindi è un altro menù che però usa display:block.

    Cmq, nel menù di esempio di qui, se metto il suck l’altezza è di un tot identico su tutti e 3 i browser su cui ho testato, se tolgo il suck l’altezza è di un tot differente, ma sempre identico su tutti e 3 i browser, quindi non capivo perchè scrivere quelle ultime due righe di css specificando che è solo per un browser, quando invece cambia l’altezza su tutti. Io però ho creato una pagina di prova dove c’è solo il menù, quindi nessuna interferenza da altre cose.

  12. TheStylist
    December 16th, 2009 at 12:15 | #14

    IE6 è morto e sepolto… Inutile perderci altro tempo dietro.

    • December 16th, 2009 at 12:19 | #15

      Se hai un sito @TheStylist perchè non condividi con noi gli obiettivi dello stesso e la % di accessi via IE6?

  13. December 16th, 2009 at 12:37 | #16

    @merlinox: sì il display: inline in effetti non c’entra.devo approfondire ma credo che la tua sia la soluzione più corretta :)

    @theStylist: condivido, ma quando avrai da fare un sito che è visitato principalmente da utenti ie6 impossibilitati ad aggiornare (vedi università, etc) devi essere in grado, altrimenti sei un webdesigner di seconda categoria ;) (provocazione ;) )

  14. December 16th, 2009 at 12:51 | #17

    @Lauryn @theStylist non è un discorso di %, un discorso di decidere se (per risparmiare un’ora) si sceglie di presentare un prodotto non ottimale a una fascia di utenti.

  15. December 16th, 2009 at 13:16 | #18

    forse volevi dire theStylist :D io condivido la tua opinione :D

  16. December 16th, 2009 at 13:49 | #19

    @Lauryn hai ragione scusa!

  17. kiby
    December 16th, 2009 at 14:41 | #20

    @Merlinox ciao, sono l’utente che ha postato la soluzione su italianwebdesign.it.
    Volevo dirti che non cambia assolutamente il comportamento visivo. Il display: inline serve appunto quando si inserisco gli elementi “a” in una lista a livello di blocco in cui si è definita la larghezza.
    La soluzione proposta la trovi sul libro “css guida completa” quando spiega i menù verticale e quindi i problemi relativi ad ie6. Trovi questa soluzione anche su internet in moltissimi siti e se non ricordo male anche su html.it (devo riguardarci però!).
    Io l’ho sempre utilizzata e non mi ha mai dato problemi.
    Con questa soluzione poi non utilizzo nessun hack particolare e quindi a mio avviso è una soluzione più idonea.
    Per quanto riguarda l’altezza invece basta settarla a 0.

    Cmq… sono ben disponibile ad apprendere altre soluzioni però cerco sempre di utilizzare quelle con meno hack possibili!!

    Ciao

  18. December 16th, 2009 at 14:45 | #21

    Grazie @kiby di essere passato. La mia risposta era di “In linea di massima” e non in un caso specifico, mi scuso se non l’ho spiegato bene.
    Le soluzioni / hack sono molte. Solitamente si mantiene l’utilizzo del display:block nei link per permettere loro che tutta l’area definita sia cliccabile, ma sono certo che non devo dirlo a te :)
    Appena posso provo la tua soluzione.

  19. kiby
    December 16th, 2009 at 14:59 | #22

    @Merlinox Non devi scusarti di nulla.
    Il display:inline fa appunto quello nel caso specifico che ti ho indicato.
    Un’altra soluzione se è possibile utilizzarla è quella di definire la larghezza del menù verticale e mettere in float:left sia l’elemento ul che il li specificando sempre a quest’ultimi la larghezza. In questo modo non devi neanche utilizzare degli hack per ie6.
    Altra soluzione al problema è quella di utilizzare il display:block e la width sia sull’elemento li che sull’elemento a. Non si imposta nessun float negli elementi.
    Anche questo stratagemma non ha bisogno di ulteriori hack per funzionare su ie6.

    Se vuoi posso spedirti per e-mail i vari esempi così puoi provarli, sperimentarli e magari dedicarci un post!! ;)

    Ciao

  20. kiby
    December 16th, 2009 at 14:59 | #23

    Dimenticavo… è un piacere leggere il tuo blog!! :D

  21. December 16th, 2009 at 15:00 | #24

    @kiby ultimamente, come vedi, faccio addirittura fatica a scrivere qui. Se scrivi il post ne sono onorato!

  22. kiby
    December 16th, 2009 at 15:10 | #25

    @Merlinox
    Io dovrei scrivere il post?? Sono io ad esserne onorato!! Nel caso scrivo tutto per bene e te lo spedisco per e-mail. Penserai poi tu ad ottimizzarlo e nel caso renderlo pubblico.
    Ti ringrazio moltissimo per l’offerta!! :D :D

    P.S: ho notato una dimenticanza in un mio commento: “… mettere in float:left sia l’elemento ul che il li..” e anche all’elemento a!! :)

    Ciao

  23. December 16th, 2009 at 15:13 | #26

    Grazie mille @kiby , per il post intendevo che lo pubblicassi nel tuo blog :)
    Qui ci scrivo solo io, almeno qui :)

  24. kiby
    December 16th, 2009 at 15:19 | #27

    Merlinox :
    Grazie mille @kiby , per il post intendevo che lo pubblicassi nel tuo blog
    Qui ci scrivo solo io, almeno qui

    Si si.. avevo capito… era solo per dirti che se volevi potevo scrivere qualcosa e poi te lo passavo se lo ritenevi degno di nota. Io al momento non ho nessun blog. Presto scriverò su un blog di un amico di queste tematiche.. però sarà tutto attivo per il prossimo anno!! :D

  25. December 16th, 2009 at 15:26 | #28

    @kiby apri un blog, non fa mai male. Magari parti easy con un tumblr o con blogspot!

  26. kiby
    December 16th, 2009 at 15:30 | #29

    Merlinox :
    @kiby apri un blog, non fa mai male. Magari parti easy con un tumblr o con blogspot!

    Ci penserò sopra!! :D

  27. January 6th, 2010 at 16:49 | #30

    ciao merlinox, a distanza di tempo mi ritrovo con in mano la Guida completa ai Css di Gianluca Troiani e confermo quanto dice kiby.
    L’hack è molto semplice: basta indicare in un css solo per ie6 le due seguenti regole:

    .menu li {
    display:inline;
    }
    .menu a {
    height: 0;
    }

    La soluzione non riguarda un menu orizzontale come potrebbe sembrare, il display: inline non comporta che gli elementi si posizionino “inline”.

    Anche la tua soluzione comunque funziona bene infatti l’ho usata recentemente, grazie!

  28. January 7th, 2010 at 10:11 | #31

    Grazie Lauryn, sempre puntuale!

  1. December 18th, 2009 at 12:27 | #1

Additional comments powered by BackType