2008-10-23 12 views
5

Me gustaría alinear pares de etiqueta/valor en el centro usando CSS sin usar posicionamiento absoluto o tablas (ver captura de pantalla). En esa captura de pantalla posicioné el valor (es decir, $ 4,500/wk) absoluto y luego hice flotar la etiqueta directamente contra ella. Pero absoluto no funciona tan bien en IE y he escuchado que no es una buena técnica.Pregunta de posicionamiento CSS - Tablas vs. Absoluto vs. DL

Pero, ¿cómo puedo lograr este efecto donde todas las etiquetas están justificadas sin absoluto?

alt text http://www.amherstparents.org/files/shot.jpg

+0

El siguiente comentario tiene un punto. Estos son datos tabulares, ¿por qué no usar tablas? –

+0

Si bien es cierto que se puede ver como datos tabulares, la visualización (2 conjuntos de pares clave => valor) lo hace incómodo en términos de accesibilidad si fuera una tabla. También puede verlo como una lista de claves y valores que se muestran en 2 columnas ... así que usar CSS para posicionar también es una solución. – Rahul

+0

(Por supuesto, podría hacer dos tablas y hacerlas flotar una al lado de la otra. Eso también funcionaría) – Rahul

Respuesta

9

Estoy confundido, ¿qué hay tabular acerca de esos datos? ¿Dónde están los registros? Las filas de diferentes campos en realidad no forman una tabla en el sentido tradicional. (Tampoco hackearlo para tener dos registros por fila para ese asunto)

Si estamos entreteniendo esta idea, ¿cuál es la diferencia entre la mitad izquierda de la mesa y la derecha? ¿Cuáles serían los encabezados de las columnas si hubiera alguno?

Prefiero la sugerencia de la lista de definiciones, definitivamente es una mejor opción que una tabla. Y no necesitaría dos columnas si todos los DT y DD fueran flotantes: izquierda y ancho: 25%, y en el siguiente orden: Costo, Mascotas, Dormir, Fumar, etc. Por lo tanto, puede usar 1 lista de definiciones, como realmente debería ser

Aunque es probable que necesite un claro: a la izquierda en cualquier otro DT por si el contenido de cualquiera de estos elementos se ajusta a dos líneas.

<style> 
    dl 
    { 
     float:left; 
     width:100%; 
    } 
    dt, 
    dd 
    { 
     float:left; 
     width:24%; 
     margin:0; 
     padding:0; 
    } 
    dt 
    { 
     text-align:right; 
     padding-right:.33em; 
    } 
    dd 
    { 
     text-align:left; 
    } 
</style> 
<dl> 
    <dt>Cost:</dt> 
    <dd>$4,500/wk</dd> 
    <dt>Pets:</dt> 
    <dd>No</dd> 
    <dt>Sleeps:</dt> 
    <dd>1</dd> 
    <dt>Smoking:</dt> 
    <dd>No</dd> 
</dl> 
+0

Las tablas no siempre necesitan encabezados de columna ya que a veces puede usar encabezados de fila, solo necesita recordar establecer el atributo scope = "row | column". –

+0

Gracias, eso prueba lo equivocado que sería usar una mesa.Como "Costo" en el ejemplo, no es un encabezado para la fila o la columna. ¡Solo * la mitad * de la fila! ¿Cómo va a tener sentido para un lector de pantalla? –

13

Si usted está mostrando datos tabulares no hay vergüenza en el uso de una mesa.

+0

En este caso, poner el texto en la tabla es incluso beneficioso, porque es el título de la tabla, por lo tanto es el "encabezado" de la tabla. Las otras categorías también lo son, pero ponerlo agrega valor semántico. – cdeszaq

+0

Esto no es datos tabulares. Eso no quiere decir que una tabla sea necesariamente inapropiada, pero este es un conjunto de pares etiqueta/valor, no una tabla con filas y columnas. –

3

Utilice divs de ancho fijo con la propiedad CSS text-align. No te olvides de dejar tus divs a la izquierda.

3

Digamos que usted está utilizando DL, DT y DD:

<dl> 
<dt>Cost:</dt> 
<dd>$4,500/wk</dd> 
<dt>Sleeps:</dt> 
<dd>1</dd> 
</dl> 

Se puede utilizar el siguiente CSS aproximada (no probado):

dl { width: 200px; } 
dt { width: 100px; text-align: right; float: left; clear: both; } 
dd { width: 100px; margin: 0; float: left; } 

Edit: Como Chris Marasti-Georg señaló :

Además, si lo desea 2 columnas, uso 2 listas de definición, y flotar

+0

Además, si desea 2 columnas, use 2 listas de definiciones y haga flotarlas. –

+0

¡Gracias por el guiño! * pulgares arriba * Me gusta esta respuesta mejor. –

2

@jon es correcto, si se trata de datos tabulares, puede utilizar una tabla. Sin embargo, si realmente no desea utilizar una tabla, creo que esto es lo que quiere:

CSS

.label { 
    min-width: 20%; 
    text-align: right; 
    float: left; 
} 

HTML

<div class="pair"> 
    <div class="label">Cost</div> 
    <div class="value">$4,500/wk</div> 
</div> 
<div class="pair"> 
    <div class="label">Sleeps</div> 
    <div class="value">1</div> 
</div> 
<div class="pair"> 
    <div class="label">Bedrooms</div> 
    <div class="value">9</div> 
</div> 

EDITAR @ Chris Marasti-Georg señala que las listas de definiciones serían más apropiadas aquí. Estoy de acuerdo, pero creo que quería mostrar que lo mismo se puede hacer fácilmente con cualquier elemento de nivel de bloque, y no hay nada en el estilo predeterminado de listas de definición que se necesita para lograr este objetivo.

+0

¿Por qué falsificar una lista de definición cuando existe? –

+0

buena pregunta. Las listas de definiciones serían más apropiadas aquí. Voy a actualizar para tomar nota de eso. – pkaeding

+0

Como he señalado en una pregunta similar, simplemente no estoy de acuerdo con que esta sea semánticamente una lista de definiciones. Es un conjunto de pares etiqueta/valor, para los cuales no hay un elemento HTML estándar. Ni las listas de definiciones, los divs ni las tablas son intrínsecamente más apropiados para este contexto. –

0

¿Qué le parece usar una tabla para diseñar la tabla y luego usar CSS para colocar esa tabla donde desee en su página?

2

La expansión en el poste de Rahul:

CSS

#list { width: 450px; } 
#left { float: left; background: lightgreen; } 
#right { float: right; background: lightblue; } 
dl { width: 225px; } 
dt { width: 100px; text-align: right; float: left; clear: both; } 
dd { width: 100px; margin: 0; float: left; padding-left: 5px; } 

HTML

<div id="list"> 
    <dl id="left"> 
     <dt>Cost:</dt> 
     <dd>$4,500/wk</dd> 
     <dt>Sleeps:</dt> 
     <dd>1</dd> 
     <dt>Bedrooms:</dt> 
     <dd>9</dd> 
     <dt>Baths:</dt> 
     <dd>6</dd> 
    </dl> 
    <dl id="right"> 
     <dt>Pets:</dt> 
     <dd>No</dd> 
     <dt>Smoking:</dt> 
     <dd>No</dd> 
     <dt>Pool:</dt> 
     <dd>No</dd> 
     <dt>Waterfront:</dt> 
     <dd>No</dd> 
    </dl> 
</div> 

Probé esto bajo FF 3.0.1, IE6 y IE7. El color de fondo está simplemente allí para ayudarlo a visualizar dónde comienzan y terminan las columnas.

+0

Usando el enfoque de @pkaeding, no es necesario dividir esto arbitrariamente en dos 'dl's. Simplemente coloca el elemento '.pair' a la izquierda y dale un ancho del 50% y obtendrás el efecto de dos columnas gratis. –

0

Una nota rápida sobre la implementación de este uso de tablas, hay varias construcciones que harán que este sea accesible. El más sencillo de los cuales sería simple de usar TH para las etiquetas y TD para los valores. This site tiene una buena discusión, y profundiza en cosas como los encabezados de las celdas, etc.

0

Siempre he tratado listas de definición como para ser utilizado para las definiciones de los objetos, no para los pares clave/valor. (9 no es una definición de 'dormitorios'). Sin embargo, este constructo en particular (listas de pares clave/valor) ha estado causando argumentos durante años ya que no existe un marcado semántico nativo que lo refleje adecuadamente.

Vaya por un DL si no es anal acerca de lo que es una definición. O ve por una mesa. Una tabla con pares clave/valor en filas, si el ámbito del encabezado/celda está configurado correctamente, es perfectamente válida. He estado haciendo esto recientemente, y parece ser la representación más semánticamente precisa.

Cuestiones relacionadas