5

Un'altra domanda "IE sta facendo qualcosa di diverso dagli altri browser", ma questo è un po 'insolito in quanto IE7 fa la cosa giusta ma IE 8 e 9 no.Elementi che non si avvolgono come previsto in IE 8/9

Ecco la situazione, ho un semplice layout a 3 colonne. Le prime 2 colonne hanno una larghezza fissa e la terza voglio essere di larghezza variabile in modo da utilizzare lo spazio disponibile.

Sto emettendo dati testuali nella terza colonna. I dati di testo dovrebbero essere liberi di avvolgere alla fine di un valore/frase di dati - quindi l'output è come.

<span class="nowrap">foo bar</span> 
<span class="nowrap">moo bahh</span> 

(si veda l'esempio qui sotto anche)

tutto funziona come un fascino in FF, Chrome e IE7, ma Internet Explorer 8 e 9 trattano il nowrap consecutivo si estende da 1 grande elemento nowrap (vale a dire che mette tutto i valori su una riga). C'è spazio bianco tra gli span e così (IMO) dovrebbe essere libero di avvolgere. L'unico modo per ottenere IE8/9 da avvolgere come voglio è includere un po 'di spazio non bianco tra gli intervalli nowrapped.

Questa soluzione è OK, ma io sono curioso di sapere:.

  • È IE il rendering del markup correttamente o non correttamente (cioè è la mia aspettativa che i valori dovrebbero avvolgere errato ho solo supporre che IE è in difetto perché gli altri browser lo fanno diversamente)
  • Esiste una soluzione più elegante di quella che ho: in un mondo ideale, vorrei assicurarmi che la virgola che si separa non venga mai spostata all'inizio di una nuova riga.

Grazie in anticipo

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html> 
<head runat="server"> 
    <style type="text/css"> 
     .leftBit {float:left; margin-right: 10px; background-color: yellow;} 
     .middleBit {float:left; width:305px; margin-right: 10px; background-color: orange;} 
     .remainder {margin-left: 420px; min-width: 200px;background-color: #DDD;} 
     .nowrap { white-space:nowrap;} 
     .clear {clear: both;} 
    </style> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 
     <div > 
      <div class="leftBit">Left bit</div> 
      <div class="middleBit">This value wraps - but I want to keep the values on the same line</div> 
      <div class="remainder"> 
       <span>Blue the colour of the sea and the sky, </span> 
       <span>Green green green green of home, </span> 
       <span>Red red red red fire engine red red red red</span> 
      </div> 
     </div> 
     <div class="clear"></div> 
    </div> 
    <div> 
     <div > 
      <div class="leftBit">Left bit</div> 
      <div class="middleBit">I don't know why these values do not wrap? They do in FF and chrome and IE7 but not IE8/9</div> 
      <div class="remainder"> 
       <span class="nowrap">Blue the colour of the sea and the sky, </span> 
       <span class="nowrap">Green green green green of home, </span> 
       <span class="nowrap">Red red red red fire engine red red red red</span> 
      </div> 
     </div> 
     <div class="clear"></div> 
    </div> 
    <div> 
     <div > 
      <div class="leftBit">Left bit</div> 
      <div class="middleBit">Here is my "work around" - I have to include some non-whiite space between the "nowrap" elements. Is this a bug or expected behaviour?</div> 
      <div class="remainder"> 
       <span class="nowrap">Blue the colour of the sea and the sky </span> , 
       <span class="nowrap">Green green green green of home </span> , 
       <span class="nowrap">Red red red red fire engine red red red red</span> 
      </div> 
     </div> 
     <div class="clear"></div> 
    </div> 
    <hr /> 
    </form> 

</body> 
</html> 

risposta

5

Determinazione interruzioni di parola non è preformato la stessa in diversi browser o tra specifiche diverse. Credo che Firefox sia l'ultima versione che formerà il tuo modo di aspettarti. Esistono alcune situazioni in cui Chrome scoppierà anche dalla casella genitore.

Come tale, è necessario fornire suggerimenti manuali nell'HTML per ottenere un risultato coerente.

Nell'esempio specifico, un modo per aggirare questo è utilizzare il carattere unicode per Zero Width Space. Questo spezzerà il tuo codice senza introdurre ulteriore spazio.

<span class="nowrap">foo bar</span>&#8203; 
<span class="nowrap">moo bahh</span> 

Se per qualche motivo non è possibile utilizzare il codice Unicode, si potrebbe desiderare di provare l'entità html &thinsp; che è uno spazio sottile. Tuttavia, introdurrà dello spazio aggiuntivo nel tuo output html.

Anche se questo sembra un problema in cui dovrebbe esserci coerenza tra i browser, http://www.cs.tut.fi/~jkorpela/html/nobr.html riporta diversi documenti tecnici e le loro differenze tra il modo in cui le parole devono essere interrotte, oltre alle diverse interpretazioni del browser di tali documenti. Sto indovinando ogni strategia generale di browser svolge un ruolo in questo specifico esempio.

Fatta eccezione per gli elementi preformattati - -, ciascun elemento di blocco strutturante è considerato come un paragrafo prendendo i caratteri di dati nel suo contenuto e il contenuto dei suoi elementi discendenti, li concatenare, e dividendo il risultato in parole, separate da spazio, tabulazione o record caratteri finali (e forse caratteri trattini). La sequenza di parole è composta come un paragrafo suddividendola in linee.

Fonte: HTML 2.0, sezione Characters, Words, and Paragraphs

In HTML, ci sono due tipi di trattini: il trattino pianura e il trattino morbido. Il trattino semplice deve essere interpretato da un agente utente come solo un altro carattere. Il trattino morbido indica all'utente agente dove può verificarsi un'interruzione di riga.

Fonte: HTML 4.0, sezione Hyphenation

vedere Unicode Technical Report #14: linea di rottura Properties (avviso tecnicismo!), Che sembra permettere una "pausa diretta" tra un carattere alfanumerico e una parentesi aperta, per esempio . Questa non è una buona idea in generale, però. Permetterebbe anche rotture molto dishono (u) rable!

+0

Grazie per la punta circa lo spazio a larghezza zero. Non sono d'accordo sullo spazio tra gli elementi HTML dovrebbe essere ignorato - è specificato in html spec/rfc? In tal caso, si prega di collegare. Ma nessun browser che conosca ignora gli spazi tra gli elementi - ad esempio Foo bar produrrà "Foo bar" quando renderizzato e non "Foobar" –

+0

Dove mai il mio cervello ha ottenuto quel dettaglio (circa 1999) non riesco a trovare ora su Internet. Ho modificato il testo sopra per fare riferimento ai problemi generali relativi alla definizione delle interruzioni di parole. – nosilleg

0

Spero IE9/affatto può essere reso come IE8/qualsiasi aggiungendo sotto la linea di meta nella testa di html

<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8"/> 

allora funziona come nella moda ci piaceva

+0

Non lo farò -1, ma questa è una soluzione tutt'altro che ideale. Ci sono una dozzina di modi per risolvere questo problema (jquery, fogli di stile, ecc.) Senza forzare la tua app a ridimensionare il suo comportamento a una versione che ha più di 5 anni (al momento in cui è stata scritta). – Losbear

3

Grazie alla risposta di @ nosilleg ho realizzato un'ottima soluzione usando solo i CSS.

Dato che stai già utilizzando le classi questo è facile, aggiungi questo;

.nowrap:before { 
    content : '\200B'; 
} 

Quello che fa è inserisce il personaggio Zero Width Space poco prima di ciascuno dei vostri nowrap elementi, senza di te modificare il codice HTML!
Ora non è necessario ricordare di aggiungere quell'entità HTML fastidiosa ogni volta che si utilizza la classe nowrap.

Ha funzionato in IE8 e 9 e non ha interessato gli altri browser.

Problemi correlati