2011-02-06 8 views
16

Necesito mostrar datos tabulares usando un table, pero estará dentro de un diseño fluido; Quiero tener un relleno de todo el ancho disponible, pero no expandirlo horizontalmente más allá del ancho de pantalla máximo, de modo que el body no obtenga una barra de desplazamiento horizontal. En cambio, los elementos demasiado grandes td obtendrán la barra de desplazamiento.¿Cómo limito el ancho de la tabla al elemento contenedor (o pantalla)?

En el ejemplo hay DATA en el table, el table tiene border:1px solid black y la salida será para un fácil análisis sintáctico cuando hilo de rizo, así (de ahí el white-space:pre); El div es simplemente el asistente de diseño de CSS normal; si es posible, ¡deshagámonos de eso también!

La parte importante es que esto no será píxel fijo Tipo diseño de ancho, y la table será menor que la anchura disponible en caso los datos no necesita mucho espacio. Para resumir, una tabla simple que simplemente no se ensancha más que la pantalla. Idealmente, el table solo estiraría el elemento parental hasta que se alcance el max-width de ese elemento circundante y luego no se ensanche.

En Chrome, con algo que considero que es un truco mal, que tiene que mantener el table a la anchura máxima disponible y para mostrar las barras de desplazamiento en la td si es necesario. Sin embargo, esto no funciona para FF, ni es una solución que pueda considerarse correcta.

Siguiendo el ejemplo de que se puede encontrar en https://hydra.geht.net/table-quirx.html por un tiempo:

<head> 
<title>Obey max-width for table</title> 
<style> 
.nw    { white-space:nowrap } 
.quirx div  { width:100%; max-width:100%; white-space:pre } 
.quirx td  { max-width:90px; border:1px solid black } 
.quirx td+td { max-width:500px; overflow:auto } 
table.quirx  { width:100%; max-width:100%; border:1px solid black; border-collapse:collapse } 
td    { align:left; max-width:100% } 
</style> 
</head> 
<body> 
<table summary="" class="quirx"><tr><td colspan="3"> 
Just some info 
</td></tr><tr><td>KEY</td><td><div>DATA (which might contain long lines PRE formatted) XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX </div> 
</td></tr></table> 
</body> 
</html> 

Tenga en cuenta que el "colspan = 3" es ningún error aquí, en mi aplicación a veces una tercera columna puede aparecer, esto no puede ser conocido en el momento en que se emite el encabezado table. (Algunas cosas de estilo son redundantes, también.)

El truco anterior, es decir, que el td 's max-width juntos son más pequeñas que la pantalla habitual (590px) y el table continuación, se estira a lo dado width, que es 100% . Como el td s no se extiende más allá de la pantalla, la propiedad divoverflow interior puede funcionar como se esperaba. Sin embargo, en FF no funciona de esta manera, ni con width ni con max-width (que probablemente se deba a su estado inline). En Chrome un width:100% o similar no funciona en los elementos td ni tr. Tenga en cuenta que con max-width uno obtiene un diseño de mesa más agradable que con width (no entiendo esa diferencia).

Además del error que esto sólo funciona en Chrome, otro error es que el table utiliza la pantalla de ancho completo, incluso si eso no es necesario si sólo hay pequeñas datos que se vea.

Algunas notas acerca de que todos:

  • Creo que esto aquí es una cosa muy básica y estoy desconcertado por qué parece tan difícil de expresar con CSS
  • Un objetivo es mantenerlo libre de cualquier JavaScript, por lo que sólo CSS con hacks
  • el usuario puede cambiar el tamaño de la ventana, por ejemplo, de 800px a 1920px o incluso más amplio, y así s ancho de la table' se ajustará automáticamente (sin Javascript)
  • será mostrar bien en el texto navegadores basados ​​como Lynx y w3m, también
  • de salida no será demasiado desordenada para facilitar el análisis cuando se canaliza desde curl
  • Será mostrar más o menos correctamente en el principal 4 (IE, FF, Chrome, Safari)
  • no será romper con los demás (puede tener errores de representación, pero el contenido no debe ocultarse)

Realmente no tengo idea de cómo archivar eso. Quizás es una pregunta frecuente, pero no pude encontrar una solución yo mismo.

Respuesta

18

(Mi respuesta llega un poco más tarde que tal vez desee, pero tal vez sea útil para usted o algún otro ninguno-la-menos ...

Estoy incluyendo algunas marcas (continuación) que hice para probar el código HTML/CSS para lograr lo que yo creo que desee.

hay un estilo de celda de ancho fijo "fixedcell" y estilo de celda ancho fluido "fluidcell".

el ancho fijo he configurado en un ancho fijo (75px para este ejemplo) simple para ilustrar mejor las cosas.

Los de ancho fluido tienen ancho: auto para que llenen el ancho del espacio de tabla restante; también tienen importantemente espacio en blanco: nowrap por lo que el texto no expande la celda en altura (espacio en blanco: pre funciona también); y finalmente tienen desbordamiento: oculto por lo que el texto no se desborda el ancho y hace las cosas feas, alternativamente puede establecer desbordamiento: desplácese para que tenga una barra de desplazamiento en esas celdas cuando sea necesario.

La tabla está configurada para ser del 100% de ancho por lo que se ampliará para adaptarse a la pantalla/etc. según sea necesario. Y lo importante respecto al estilo de la tabla es table-layout: fijo, esto hace que la tabla se adhiera al diseño de la página de forma más correcta en lugar de auto-dimensionarse en función de su propio contenido (table-layout: auto) .

También agregué algunos bordes para ayudar a ilustrar los límites de la tabla y las celdas.

<html> 
<head> 
    <title>Table with auto-width sizing and overflow hiding.</title> 
    <style type="text/css"> 
     table {width:100%; border:solid 1px red; table-layout:fixed;} 
     table td {border:solid 1px green;} 
     .fixedcell {width:75px;} 
     .fluidcell {width:auto; overflow:hidden; white-space:nowrap;} 
    </style> 
</head> 
<body> 
    Table with one fluid column: 
    <table> 
     <tr> 
      <td class="fixedcell">row 1</td> 
      <td class="fluidcell">a whole bunch of content could go here and it still needs to fit nice into the cell without mucking things up</td> 
      <td class="fixedcell">fixie</td> 
      <td class="fixedcell">another</td> 
     </tr> 
    </table> 

    Table with two fluid columns: 
    <table> 
     <tr> 
      <td class="fixedcell">row 1</td> 
      <td class="fluidcell">a whole bunch of content could go here and it still needs to fit nice into the cell without mucking things up</td> 
      <td class="fluidcell">blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah</td> 
      <td class="fixedcell">fixie</td> 
      <td class="fixedcell">another</td> 
     </tr> 
    </table> 
</body> 

he comprobado en varios navegadores modernos y parecía funcionar correctamente en cada uno.

PS.Aunque las tablas son un no-no para el diseño de página en general, las tablas son correctas y se recomiendan para el diseño tabular de datos.

+0

Esto fue útil. Estoy teniendo problemas y el diseño de la mesa parece estar en juego. Gracias – huyz

+0

Esto es increíblemente útil, gracias amigo –

Cuestiones relacionadas