5

Otra pregunta de "IE está haciendo algo diferente de otros navegadores" pero esta es una poco inusual en que IE7 hace lo correcto pero IE 8 y 9 no.Elementos que no se ajustan como se esperaba en IE 8/9

Aquí está la situación, tengo un diseño simple de 3 columnas. Las primeras 2 columnas son de ancho fijo y la tercera quiero que sean de ancho variable para que ocupen el espacio disponible.

Estoy enviando datos de texto en la tercera columna. Los datos de texto deben estar libres para envolver al final de un valor/frase de datos, así que lo elaboro como.

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

(Véase el ejemplo de abajo también)

todo funciona como un encanto en FF, Chrome y Internet Explorer 7, pero Internet Explorer 8 y 9 tratan a los nowrap consecutiva se extiende como 1 elemento grande nowrap (es decir, se pone todo los valores en una línea). Hay espacio en blanco entre los tramos y eso (IMO) debe ser libre para envolver. La única manera en que puedo hacer que IE8/9 se ajuste como quiero es incluir algún espacio no blanco entre los tramos que se envían.

Esta solución está bien, pero tengo curiosidad por saber:.

  • Es IE prestando el marcado correcta o incorrectamente (es decir, es mi expectativa de que los valores deben envolver incorrecta sólo por sentado que el IE tiene la culpa porque los otros navegadores lo hacen de manera diferente)
  • ¿Existe una solución más elegante que la que tengo? En un mundo ideal, me gustaría asegurarme de que la coma separadora nunca se enganche al comienzo de una nueva línea.

Gracias de antemano

<!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> 

Respuesta

5

La determinación de separaciones de palabras no se preforma la misma en diferentes navegadores o entre diferentes especificaciones. Creo que Firefox es la única versión más reciente que formateará de la manera que estás esperando. Hay ciertas situaciones de longitud en las que Chrome también saldrá del cuadro principal.

Como tal, las sugerencias manuales deben proporcionarse en el HTML para obtener resultados consistentes.

En el ejemplo específico, una forma de evitar esto es usar el carácter Unicode para Zero Width Space. Esto romperá su código sin introducir espacio adicional.

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

Si por alguna razón no se puede utilizar el código Unicode, es posible que desee probar la entidad html &thinsp; que es un espacio delgado. Sin embargo, introducirá un poco de espacio adicional en su salida html.

Aunque esto parece ser un problema donde debería haber coherencia entre los navegadores, http://www.cs.tut.fi/~jkorpela/html/nobr.html cita varios documentos técnicos y sus diferencias entre cómo deben romperse las palabras, además de las diferentes interpretaciones del navegador de esos documentos. Supongo que la estrategia general de cada navegador juega un papel en este ejemplo específico.

excepto elementos de formato previo - -, cada elemento de bloque de estructuración es considerado como un párrafo mediante la adopción de los caracteres de datos en su contenido y el contenido de sus elementos descendientes, la concatenación de ellos, y dividiendo el resultado en palabras, separadas por espacio, tabulación o caracteres de final de registro (y quizás caracteres de guión). La secuencia de palabras se compone tipográfica como un párrafo dividiéndola en líneas.

Fuente: HTML 2.0, sección Characters, Words, and Paragraphs

En HTML, hay dos tipos de guiones: el guión llanura y el guión de separación. El guion simple debe ser interpretado por un agente de usuario como solo otro personaje. El guión suave le dice al agente de usuario dónde puede ocurrir un salto de línea.

Fuente: HTML 4.0, sección Hyphenation

ver Unicode Technical Report #14: línea de rotura Propiedades (alerta detalle técnico!), Que parece permitir una "ruptura directa" entre un carácter alfanumérico y un paréntesis de apertura, por ejemplo, . Sin embargo, esta no es una buena idea en general. ¡Incluso permitiría las pausas muy deshonorables!

+0

Gracias por el consejo sobre el espacio de ancho cero. Estoy en desacuerdo sobre el espacio entre los elementos html que se debe ignorar: ¿está esto especificado en html spec/rfc? Si es así, por favor enlace. Pero ningún navegador que conozco ignora los espacios entre los elementos - es decir, Foo barra producirá "barra Foo" cuando se procesa y no "Foobar" –

+0

Dondequiera que mi cerebro haya obtenido ese detalle (circa 1999) no puedo encontrar en Internet ahora. He ajustado el texto anterior para referirme a los problemas generales relacionados con la definición de los saltos de palabras. – nosilleg

0

espero IE9/ni se pueden representar como IE8/cualquier añadiendo debajo de la línea de meta en la cabeza de html

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

entonces funciona como en la forma que nos gustaba

+0

No lo haré -1, pero esta es una solución menos que ideal. Hay una docena de maneras de arreglar esto (jquery, hojas de estilo, etc.) sin forzar a su aplicación a degradar su comportamiento a una versión que ahora tiene más de 5 años (en el momento en que esto se escribió). – Losbear

3

Gracias a la respuesta de @nosilleg, hice una gran solución usando solo CSS.

Dado que ya está utilizando clases esto es fácil, agregue esto;

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

Lo que esto hace es inserta el carácter Zero Width Space justo antes de cada uno de sus elementos nowrap, sin que editar el código HTML!
Ahora no tendrá que recordar agregar esa molesta entidad HTML cada vez que use su clase nowrap.

Funcionó en IE8 y 9 y no afectó a los otros navegadores.

Cuestiones relacionadas