Как приблизить макет таблицы с помощью CSS, когда структура не разделена
У меня есть некоторый HTML, который я хочу использовать для отображения атрибутов display: table css. К сожалению, я не могу изменить HTML (или JS), только CSS (длинная история). Это проблема, потому что структура существующего HTML вызывает проблемы для макета таблицы. Вот упрощенная версия HTML и CSS:
<style>
.like-table { display: table;}
.like-tr { display: table-row;}
.like-th { display: table-cell; border: 1px solid gray;}
.useless-div-1 { }
.useless-div-2 { }
.like-td { display: table-cell; border: 1px solid gray;}
</style>
<div class="like-table">
<div class="like-tr">
<div class="like-th">1</div>
<div class="like-th">22</div>
<div class="like-th">3</div>
</div>
<div class="useless-div-1"><div class="useless-div-2">
<div class="like-tr">
<div class="like-td">111</div>
<div class="like-td">2</div>
<div class="like-td">3</div>
</div>
<div class="like-tr">
<div class="like-td">11</div>
<div class="like-td">2</div>
<div class="like-td">333</div>
</div>
</div></div>
</div>
К сожалению, это делает ширину столбцов заголовка и тела различной ширины:
Если я уберу открытые и закрывающие теги "useless-div-*":
<div class="like-table">
<div class="like-tr">
<div class="like-th">1</div>
<div class="like-th">22</div>
<div class="like-th">3</div>
</div>
<div class="like-tr">
<div class="like-td">111</div>
<div class="like-td">2</div>
<div class="like-td">3</div>
</div>
<div class="like-tr">
<div class="like-td">11</div>
<div class="like-td">2</div>
<div class="like-td">333</div>
</div>
</div>
Затем он хорошо отрисовывает, выравнивая ширину столбца заголовка и тела:
Итак, могу ли я что-нибудь сделать с CSS, чтобы первый набор HTML вел себя как второй? Помните, я не могу изменить HTML или JavaScript - только CSS! Пожалуйста, не спрашивайте, почему...
1 ответ
Так как вы упаковываете table-row
элементы по useless-div
Вы могли бы просто установить display
собственностью useless-div
в table-row-group
:
.useless-div { display: table-row-group; }
В макетах таблиц CSS все элементы должны иметь одинаковые структурные свойства.
Вот демоверсия JSBin.
Обновить
После того, как я почесал голову за последние 5 часов, я понял, что невозможно справиться с этим текущим способом.
Итак, я решил написать новые стили для создания гибкой таблицы CSS. Но сначала я должен упомянуть несколько вещей:
- Чтобы столбцы были выровнены по вертикали, необходимо задать определенную ширину ячеек.
- В следующем примере я установил границы для лучшего отображения таблицы. из-за этого я использовал
box-sizing
свойство заставлять браузер вычислять ширину каждой ячейки, включая ее отступы и границы. Если вам не нужноborder
, удали его иborder-box
собственность также.
Подход
.like-table {
width: 400px; /* You could declare a specific width. Your choice */
margin: 0 auto;
}
.like-th, .like-td {
float: left; /* <-- Float the cells to stick together */
width: 33.33%; /* <-- I applied the same width on each cell. */
/* I've explained how to set specific width for each column in the following */
border: 1px solid gray; /* Add border around each cell */
-webkit-box-sizing: border-box; /* Force browser to calculate width+borders */
-moz-box-sizing: border-box;
box-sizing: border-box;
}
.like-tr:after { /* Clearfix hack */
content: ' ';
font: 0/0 a;
display: block;
clear: both;
}
Примечание. Чтобы применить определенную ширину к каждому столбцу (слева + центр + право), сначала установите width
в каждой ячейке, как я делал выше, затем используйте следующие селекторы, чтобы переопределить примененную ширину для левого и правого столбцов:
.like-table .like-td:first-child, /* Selectors for the left column */
.like-table .like-th:first-child {
width: 100px; /* <-- Override the width for the left column */
border-right: 0; /* You might also want to remove right borders */
}
.like-table .like-td:last-child, /* Selectors for the right column */
.like-table .like-th:last-child {
width: 100px; /* <-- Override the width for the right column */
border-left: 0; /* You might also want to remove left borders */
}
JSBin Demo # 1. (ширина жидкости)
JSBin Demo # 2. (фиксированная ширина)