2011-06-12 30 views
6

Estoy tratando de crear un diseño basado exclusivamente en HTML y CSS que presenta el contenido principal de una página a la izquierda (que se expande al ancho total ancho, menos el recuadro) y una caja más pequeña a la derecha, digamos para navegación o información de algún tipo. Este es un ejemplo del código que está causando el problema, con los problemas descritos en ella:Floating Div Madness on Window Resize

<!DOCTYPE HTML> 

<html lang="en" dir="ltr"> 

<head> 
<title>Floating Div Madness upon Window Resize</title> 
<style> 
    * {margin:0; padding:0} 
    body {margin:20px; font-size:0px; color:#000000} 
    div.page {margin-right:120px; background-color:#AAAAFF; float:left} 
    div.wide {width:300px; background-color:#AAFFAA} 
    div.box {width:100px; margin-left:-100px; background-color:#FFAAAA; float:left} 
    h1 {font-size:x-large} 
    p {padding-bottom:5px; font-size:small} 
</style> 
</head> 

<body> 

<div class="page"> 
    <h1>MAIN PAGE</h1> 
    <p>This is the main portion of the page (light blue). It is currently floated left with a right margin of 120px, to account for the box (light red) as well as the white space between it and the box (light red). All may look well on the surface, but...</p> 
    <p>Resize the window in Firefox (I tested both 3.5 and 4) and the white margin of the body can be cut off, not only on the right side, but on the bottom of the page, too.</p> 
    <p>Remove enough text and this div will shrink to fit it, no longer taking up the entire width of the page (minus the box).</p> 
    <div class="wide"> 
    <p>If I nest another, non-floating div with a fixed width (light green), something even stranger happens when I resize the window, this time in Internet Explorer 6 (maybe in other versions, too): The text in the page div (light blue) is squished, I think by the margin of the box (light red). The fixed width div (light green) is unaffected by this.</p> 
    </div> 
</div> 

<div class="box"> 
    <h1>BOX</h1> 
    <p>(this could be navigation, or anything else)</p> 
</div> 

</body> 

</html> 

me gustaría mantener la caja (rojo claro) más adelante en el código por razones semánticas, pero esto es opcional. Aquí están algunas de las cosas más exitosas que ya he intentado, y por qué no parecen funcionar:

  1. Posicionamiento absoluto: Esto parece tan bien como mi propio código cuando los navegadores no cambian de tamaño. Se ocupa de la desaparición del margen del cuerpo en Firefox hasta cierto punto. Sin embargo, cuando el tamaño de la ventana sea lo suficientemente pequeño, el recuadro (rojo claro) irá por encima o por debajo del divisor de la página principal (azul claro), dependiendo del índice z que tenga más alto o más bajo.

  2. Floating only the box: Esto implica cambiar el HTML y colocar el cuadro (rojo claro) antes que el resto del contenido en el código. Esto expande automáticamente la página principal div (azul claro), algo que no he encontrado una manera de hacer (sin una cantidad dada de contenido) usando el método float. Sin embargo, los márgenes del cuerpo todavía se eliminan en Firefox, el texto todavía se debilita en IE, y el recuadro (rojo claro) todavía irá por debajo (de nuevo dependiendo del índice z) del div principal de la página (azul claro) cuando la ventana se vuelve lo suficientemente pequeña

  3. Asignación de ancho mínimo a todo: Esto fue muy exitoso para detener el problema de IE, pero requiere algo de trabajo CSS en una página que es más compleja que esta y que admitirá diferentes tipos de medios. Y, aún no aborda el margen del cuerpo en Firefox o me da una manera de expandir el div de la página principal (azul claro) sin contenido, ya que todavía está flotando.

  4. Cambiar el margen del cuerpo a un borde: Esto tampoco resuelve el problema de Firefox; ya sea un borde o un margen, se corta en la parte derecha e inferior de la página cuando utilizo flotadores.

  5. Agregue el margen a la casilla: Esto tampoco funciona para Firefox. Puedo obtener un margen inferior en el contenido de la página principal (azul claro) para permanecer en su lugar (esto es algo que me parece especialmente curioso), pero un margen derecho en la caja (rojo claro) aún se corta.

Cualquier ayuda sería muy apreciada, ya que no puedo encontrar ningún sitio o mensajes que responden a estos problemas, mucho menos que describe la existencia de estos problemas; Ciertamente he dedicado muchas horas a buscar y probar soluciones.

+3

¿Qué navegadores y versiones te preocupan? Noté esto en su texto: ''Esta vez en Internet Explorer 6 '' - usted * no debería * ser compatible con Internet Explorer 6 a menos que tenga una razón sólida para hacerlo. http://ie6countdown.com/ + http://gs.statcounter.com/#browser_version-ww-monthly-201005-201105 – thirtydot

+0

@ thirtydot Sí, hay algunas buenas razones por las que trato de hacer que esto funcione tan bien como posible en Internet Explorer 6. La intranet principal que estoy diseñando es, para excusas buenas, malas y feas, aún usando IE 6; el administrador es bastante inflexible sobre esto y no se actualizará. Además de IE 6, estoy interesado en los usuarios que visitarán las páginas desde fuera de la intranet; más que probable, tendrán navegadores más modernos. Es por eso que también me preocupa el problema en Firefox 3.5 y 4 que, como el problema de IE 6, no puedo encontrar ninguna documentación para nada. – JBT

+0

Como regla general, no debe hacer flotar un elemento sin especificar su ancho explícitamente. Tu div.page hace esto. Si de alguna manera no puedes utilizar explícitamente un ancho, deberías encontrar otro diseño que no flote en la forma en que tratas de hacer las cosas (por ejemplo, anida el elemento flotante dentro del elemento sin ancho dado). – Frug

Respuesta

1

Buenos días, señor, parece que tiene problemas para construir diseños.

Según tengo entendido, quiere un diseño de 2 columnas. La columna izquierda automáticamente se expande al ancho de w/e, está en menos el ancho de las columnas de la derecha menos 20 píxeles para el margen. La columna derecha es un ancho fijo y contendrá un menú o estructuras html surtidas ...

En la columna izquierda tiene texto y, entre otras cosas, un cuadro de ancho fijo, el cuadro de ancho fijo en esta columna siempre debe permanecer dentro eso. Esto significa que queremos un ancho mínimo que sea el ancho de la caja de ancho fijo + 20 px de margen + el ancho de la columna derecha.

Lo hice haciendo un contenedor alrededor de todo el contenido, aplicando un ancho mínimo a eso y haciendo un contenedor ficticio para resolver el problema del ancho mínimo en IE6.

Aquí es un ejemplo práctico de cómo se ve: http://jsfiddle.net/uXyPu/

que no tienen una versión de Internet Explorer 6 o Firefox 3.5 corriendo a probarlo, pero estoy bastante seguro de que esto funcionará.

Como nota al margen, utilizó un margen en la etiqueta del cuerpo, no lo haga. Como regla base, mantenga su cuerpo completamente expandido, como máximo aplique un relleno. Aparte de esto, evitar los márgenes es una buena manera de evitar una gran cantidad de problemas en IE6 mientras mantiene su diseño compatible con los navegadores modernos. Y no use relleno/margen en absoluto en los elementos flotantes ...

El señor en el primer comentario sobre su pregunta tenía razón al evitar ie6 por completo, espero que haya preguntado mucho para hacer este proyecto para que la empresa pueda de hecho, empiezas a pensar en su abuso de ie6 ...

+0

Gracias por el esfuerzo valiente pero, después de probar esto, todavía tiene algunos de los problemas que encontré antes y pensé que debería dejarle saber cuál.Si bien no aplasta el texto en IE6, el recuadro (rojo) aún flota en la parte superior de la página principal div (azul). Y, sin explicación, el recuadro (rojo) continúa topando contra el lado del navegador en Firefox (incluso FF7) cuando se cambia de tamaño. En el mejor de los casos, podría agregar un margen a la derecha del recuadro (rojo), pero luego comenzó a chocar contra el div principal de la página (azul); ¡agregar bordes y/o márgenes no detuvo este nuevo problema! – JBT

+0

Bueno, el problema de Firefox lo puedo explicar fácilmente ... El ancho mínimo debería haber sido puesto en la etiqueta del cuerpo, mi error. Ahora cuando el contenedor se aplasta, simplemente se desborda sobre el contenedor del cuerpo, lo que significa que tocará el lado derecho. Esto está arreglado aquí; http://jsfiddle.net/sg3s/uXyPu/11/ Quería probar esta vez, pero tengo problemas de conectividad de red con mis máquinas :( – sg3s

+0

¡Esto parece un ganador! Supongo que tendré que modificar la configuración de ancho como 420px es un poco pequeño, incluso para sistemas que ejecutan IE6. Sin embargo, esto parece funcionar en todos los navegadores compatibles con estándares que probé y razonablemente bien en IE6. ¡Muchas gracias por todo el tiempo que ha dedicado a trabajar en esto! – JBT

0

Moví la caja del lado derecho hacia arriba del resto del código, le di un flotador a la derecha, luego le di a la página principal un ancho en un porcentaje.

Editar:

Quizás esto es mejor. Totalmente posicioné la caja lateral con la parte superior: 20px; derecha: 20px; y le dio a la página principal un margen-derecha: 120px, por lo que no queda debajo del div lateral.

probar el nuevo código:

<!DOCTYPE HTML> 

<html lang="en" dir="ltr"> 

<head> 
<title>Floating Div Madness upon Window Resize</title> 
<style> 
    * {margin:0; padding:0} 
    body { 
    margin:20px; 
    font-size:0px; 
    color:#000000; } 
    div.page { 
    background-color:#AAAAFF; 
    margin-right: 120px; } 
    div.wide { 
    width: 300px; 
    background-color:#AAFFAA; } 
    div.box { 
    position: absolute; 
    top: 20px; 
    right: 20px; 
    width:100px; 
    background-color: #FFAAAA; } 
    h1 {font-size:x-large} 
    p { 
    padding-bottom:5px; 
    font-size:small } 
</style> 
</head> 

<body> 

<div class="page"> 
    <h1>MAIN PAGE</h1> 

    <p>Resize the window in Firefox (I tested both 3.5 and 4) and the white margin of the body can be cut off, not only on the right side, but on the bottom of the page, too.</p> 
    <p>Remove enough text and this div will shrink to fit it, no longer taking up the entire width of the page (minus the box).</p> 
    <div class="wide"> 
    <p>If I nest another, non-floating div with a fixed width (light green), something even stranger happens when I resize the window, this time in Internet Explorer 6 (maybe in other versions, too): The text in the page div (light blue) is squished, I think by the margin of the box (light red). The fixed width div (light green) is unaffected by this.</p> 
    </div> 
</div> 

<div class="box"> 
    <h1>BOX</h1> 
    <p>(this could be navigation, or anything else)</p> 
</div> 

</body> 

</html> 
+0

Lo siento, ahora noto que cubriste esto en la pregunta ... – Teak

-2

utilizar una tabla ...

<!DOCTYPE HTML> 
<html> 
<head> 
</head> 

<body> 
    <table width="100%"> 
    <tr> 
     <td valign="top"> 
      page content 
     </td> 
     <td width="100" valign="top"> 
      <div class="box"> 
       menu content 
      </div> 
     </td> 
    </tr> 
    </table> 
</body> 
</html> 
+0

No es necesario usar una mesa en esta situación, querido señor ~ _ ~ (Traeré mi solución en un momento) – sg3s

+0

Sí, pero se puede usar, es una solución de trabajo jajaja. –

+0

Agregando el texto y el CSS necesario en las tablas y eliminando el espacio entre celdas/espaciado, la idea funcionó en IE6. Para solucionarlo en Firefox, agregué un margen derecho al recuadro (rojo) y luego, debido a que sobresalía más allá del borde esta vez, eliminé por completo el borde derecho de la página. A pesar de ser una solución desordenada y no semántica, funciona; Gracias. Fui con un diseño diferente (más cercano a mi código original) hace algún tiempo y mordí la bala sobre compatibilidad, para gran disgusto del administrador, pero espero poder solucionarlo más tarde. De todos modos, todavía estoy buscando una solución más semántica, si es que hay una. – JBT