El modelo de tabla CSS se basa en el modelo de tabla HTML
http://www.w3.org/TR/CSS21/tables.html
Una tabla se divide en FILAS y cada fila contiene una o más celdas. Las celdas son hijos de FILAS, NUNCA son hijos de columnas.
"display: table-column" NO proporciona un mecanismo para hacer diseños en columnas (por ejemplo, páginas de periódicos con múltiples columnas, donde el contenido puede fluir de una columna a la siguiente).
Más bien, "table-column" SOLO establece atributos que se aplican a las celdas correspondientes dentro de las filas de una tabla. Por ejemplo, se puede describir "El color de fondo de la primera celda de cada fila es verde".
La tabla en sí siempre está estructurada de la misma manera que en HTML.
En HTML (observe que "td" s están dentro de "tr" s, NO dentro de "col" s):
<table ..>
<col .. />
<col .. />
<tr ..>
<td ..></td>
<td ..></td>
</tr>
<tr ..>
<td ..></td>
<td ..></td>
</tr>
</table>
HTML correspondiente usando propiedades de tabla CSS (tenga en cuenta que los divs de "columna" no contienen ningún contenido; el estándar no permite contenido directamente en columnas):
.mytable {
display: table;
}
.myrow {
display: table-row;
}
.mycell {
display: table-cell;
}
.column1 {
display: table-column;
background-color: green;
}
.column2 {
display: table-column;
}
<div class="mytable">
<div class="column1"></div>
<div class="column2"></div>
<div class="myrow">
<div class="mycell">contents of first cell in row 1</div>
<div class="mycell">contents of second cell in row 1</div>
</div>
<div class="myrow">
<div class="mycell">contents of first cell in row 2</div>
<div class="mycell">contents of second cell in row 2</div>
</div>
</div>
OPCIONAL : tanto las "filas" como las "columnas" se pueden diseñar asignando varias clases a cada fila y celda de la siguiente manera. Este enfoque ofrece la máxima flexibilidad para especificar varios conjuntos de celdas, o celdas individuales, que se van a diseñar:
//Useful css declarations, depending on what you want to affect, include:
.mycell {
}
.row1 {
}
.row1 .mycell {
}
.row1 .cell1 {
}
.cell1 {
}
.mytable .row1 {
}
.mytable .row1 .mycell {
}
.mytable .row1 .cell1 {
}
.mytable .cell1 {
}
<div class="mytable">
<div class="column1"></div>
<div class="column2"></div>
<div class="myrow row1">
<div class="mycell cell1">contents of first cell in row 1</div>
<div class="mycell cell2">contents of second cell in row 1</div>
</div>
<div class="myrow row2">
<div class="mycell cell1">contents of first cell in row 2</div>
<div class="mycell cell2">contents of second cell in row 2</div>
</div>
</div>
En los diseños flexibles de hoy, que se usan <div>
para múltiples propósitos, es aconsejable poner algo de clase en cada div, para ayudar a referirse a él. Aquí, lo que solía estar <tr>
en HTML se convirtió class myrow
y se <td>
convirtió en class mycell
. Esta convención es lo que hace que los selectores CSS anteriores sean útiles.
NOTA DE RENDIMIENTO : poner nombres de clase en cada celda y usar los selectores de clases múltiples anteriores es un mejor rendimiento que usar selectores que terminan en *
, como .row1 *
o incluso .row1 > *
. La razón es que los selectores se hacen coincidir primero en último lugar , por lo que cuando se buscan elementos coincidentes, .row1 *
primero lo hace *
, lo que hace coincidir todos los elementos, y luego verifica todos los antepasados de cada elemento , para encontrar si algún antepasado tiene class row1
. Esto puede ser lento en un documento complejo en un dispositivo lento. .row1 > *
es mejor, porque solo se examina al padre inmediato. Pero es mucho mejor eliminar inmediatamente la mayoría de los elementos a través de .row1 .cell1
. (.row1 > .cell1
es una especificación aún más estricta, pero es el primer paso de la búsqueda lo que marca la mayor diferencia, por lo que generalmente no vale la pena el desorden y el proceso de pensamiento adicional sobre si siempre será un hijo directo, de agregar el selector de niños >
.)
El punto clave para eliminar el rendimiento es que el último elemento de un selector debe ser lo más específico posible y nunca debe serlo *
.