У меня недавно была похожая проблема, и я решил ее, используя смесь разных решений.
Первый и самый простой - использовать две таблицы: одну для заголовков и одну для тела. Это работает, но заголовки и столбцы тела не выровнены. И, так как я хотел использовать авторазмер, который поставляется с таблицами начальной загрузки Twitter, я закончил тем, что создал функцию Javascript, которая изменяет заголовки, когда: тело отображается; окна изменяются; изменяются данные в столбце и т. д.
Вот часть кода, который я использовал:
<table class="table table-striped table-hover" style="margin-bottom: 0px;">
<thead>
<tr>
<th data-sort="id">Header 1</i></th>
<th data-sort="guide">Header 2</th>
<th data-sort="origin">Header 3</th>
<th data-sort="supplier">Header 4</th>
</tr>
</thead>
</table>
<div class="bodycontainer scrollable">
<table class="table table-hover table-striped table-scrollable">
<tbody id="rows"></tbody>
</table>
</div>
Заголовки и тело разделены на две отдельные таблицы. Один из них находится внутри DIV с необходимым стилем для создания вертикальных полос прокрутки. Вот CSS, который я использовал:
.bodycontainer {
//height: 200px
width: 100%;
margin: 0;
}
.table-scrollable {
margin: 0px;
padding: 0px;
}
Я прокомментировал высоту здесь, потому что я хотел, чтобы таблица достигла нижней части страницы, какой бы ни была высота страницы.
Атрибуты сортировки данных, которые я использовал в заголовках, также используются в каждом тд. Таким образом, я мог бы получить ширину и отступ каждого тд и ширину строки. Используя атрибуты сортировки данных, я с помощью CSS устанавливаю соответственно отступы и ширину каждого заголовка и строки заголовка, которая всегда больше, поскольку у нее нет полосы прокрутки. Вот функция, использующая coffeescript:
fixHeaders: =>
for header, i in @headers
tdpadding = parseInt(@$("td[data-sort=#{header}]").css('padding'))
tdwidth = parseInt(@$("td[data-sort=#{header}]").css('width'))
@$("th[data-sort=#{header}]").css('padding', tdpadding)
@$("th[data-sort=#{header}]").css('width', tdwidth)
if (i+1) == @headers.length
trwidth = @$("td[data-sort=#{header}]").parent().css('width')
@$("th[data-sort=#{header}]").parent().parent().parent().css('width', trwidth)
@$('.bodycontainer').css('height', window.innerHeight - ($('html').outerHeight() -@$('.bodycontainer').outerHeight() ) ) unless @collection.length == 0
Здесь я предполагаю, что у вас есть массив заголовков, называемых @headers.
Это не красиво, но это работает. Надеюсь, это кому-нибудь поможет.