Model tabeli CSS jest oparty na modelu tabeli HTML
http://www.w3.org/TR/CSS21/tables.html
Tabela jest podzielona na WIERSZE, a każdy wiersz zawiera jedną lub więcej komórek. Komórki są elementami podrzędnymi ROWS, NIGDY nie są elementami podrzędnymi kolumn.
"display: table-column" NIE zapewnia mechanizmu tworzenia układów kolumnowych (np. stron gazet z wieloma kolumnami, gdzie treść może przepływać z jednej kolumny do następnej).
Zamiast tego „tabela-kolumna” TYLKO ustawia atrybuty, które mają zastosowanie do odpowiednich komórek w wierszach tabeli. Można na przykład opisać „Kolor tła pierwszej komórki w każdym wierszu jest zielony”.
Sama tabela ma zawsze taką samą strukturę jak w HTML.
W HTML (zwróć uwagę, że „td” znajdują się wewnątrz „tr”, NIE wewnątrz „col”):
<table ..>
<col .. />
<col .. />
<tr ..>
<td ..></td>
<td ..></td>
</tr>
<tr ..>
<td ..></td>
<td ..></td>
</tr>
</table>
Odpowiedni kod HTML wykorzystujący właściwości tabeli CSS (zwróć uwagę, że elementy div „column” nie zawierają żadnej treści - standard nie zezwala na zawartość bezpośrednio w kolumnach):
.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>
OPCJONALNIE : można nadać styl zarówno „wierszom”, jak i „kolumnom”, przypisując wiele klas do każdego wiersza i komórki w następujący sposób. Takie podejście zapewnia maksymalną elastyczność w określaniu różnych zestawów komórek lub pojedynczych komórek, które mają być stylizowane:
//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>
W dzisiejszych elastycznych projektach, które są używane <div>
do wielu celów, rozsądnie jest umieścić pewną klasę dla każdego elementu DIV, aby pomóc się do niego odnieść. Tutaj to, co było <tr>
w HTML, stało się class myrow
i <td>
stało się class mycell
. To właśnie ta konwencja sprawia, że powyższe selektory CSS są przydatne.
WSKAZÓWKA DOTYCZĄCA WYDAJNOŚCI : umieszczenie nazw klas w każdej komórce i użycie powyższych selektorów wieloklasowych zapewnia lepszą wydajność niż użycie selektorów kończących się na *
, takich jak .row1 *
lub nawet .row1 > *
. Powodem jest to, że selektory są dopasowywane jako pierwsze , więc gdy szukane są pasujące elementy, .row1 *
najpierw robi to *
, co dopasowuje wszystkie elementy, a następnie sprawdza wszystkich przodków każdego elementu , aby sprawdzić, czy któryś z przodków ma class row1
. Może to być powolne w przypadku złożonego dokumentu na wolnym urządzeniu. .row1 > *
jest lepsze, ponieważ badany jest tylko bezpośredni rodzic. Ale o wiele lepiej jest natychmiastowo wyeliminować większość elementów za pomocą .row1 .cell1
. (.row1 > .cell1
jest jeszcze ściślejszą specyfikacją, ale to pierwszy krok wyszukiwania robi największą różnicę, więc zwykle nie jest warta bałaganu i dodatkowego procesu myślowego, czy zawsze będzie to bezpośrednie dziecko, dodając selektor dziecka >
).
Kluczową kwestią do usunięcia ponownej wydajności jest to, że ostatnia pozycja w selektorze powinna być jak najbardziej szczegółowa i nigdy nie powinna *
.