Как сделать HTML-таблицу с фиксированными заголовками (закрепить их)?

Вопрос

Существует ли какой-нибудь кроссбраузерная CSS/JavaScript метод отобразить длинную HTML-таблицу, чтобы её заголовки оставались зафиксированными и не прокручивались вместе с телом таблицы?

Я бы хотел, чтобы посетитель мог выполнять прокрутку контекста в таблице, но при этом заголовки оставались всегда видны сверху, чтобы ему было легче ориентироваться.


Ответ №1

Я думаю, что следующий код на основе jQuery должен работать в большинстве браузеров. Вот принцип работы этого метода:

  • Клонируем таблицу, которая должна иметь фиксированные заголовки, и помещаем клон над оригиналом.
  • Удаляем тело таблицы из клона.
  • Удаляем заголовки таблицы из оригинала.
  • Применяем ширину столбцов (предварительно сохранили эту ширину).

Вот код:

function scrolify(tblAsJQueryObject, height){
    var oTbl = tblAsJQueryObject;
    // для очень длинных таблиц вы можете удалить 4 следующие линии
    // и поместить таблицу в ДИВ и назначить ему высоту и свойство overflow
    var oTblDiv = $("<div/>");
    oTblDiv.css('height', height);
    oTblDiv.css('overflow','scroll');
    oTbl.wrap(oTblDiv);
    // сохраняем оригинальную ришину
    oTbl.attr("data-item-original-width", oTbl.width());
    oTbl.find('thead tr td').each(function(){
        $(this).attr("data-item-original-width",$(this).width());
    });
    oTbl.find('tbody tr:eq(0) td').each(function(){
        $(this).attr("data-item-original-width",$(this).width());
    });
    // клонируем оригинальную таблицу
    var newTbl = oTbl.clone();
    // удаляем заголовки из оригинальной таблицы
    oTbl.find('thead tr').remove();
    // удаляем тело таблицы из новой таблицы
    newTbl.find('tbody tr').remove();
    oTbl.parent().parent().prepend(newTbl);
    newTbl.wrap("<div/>");
    // заменяем исходную ширину столбца
    newTbl.width(newTbl.attr('data-item-original-width'));
    newTbl.find('thead tr td').each(function(){
        $(this).width($(this).attr("data-item-original-width"));
    });
    oTbl.width(oTbl.attr('data-item-original-width'));
    oTbl.find('tbody tr:eq(0) td').each(function(){
        $(this).width($(this).attr("data-item-original-width"));
    });
}
$(document).ready(function(){
    scrolify($('#tblNeedsScrolling'), 160); // 160 is height
});
    <div style="width:300px;border:2px solid black;">
        <table border="1" width="100%" id="tblNeedsScrolling">
            <thead>
                <tr><th>Заголовок 1</th><th>Заголовок 2</th></tr>
            </thead>
            <tbody>
                <tr><td>Ряд 1, столбец 1</td><td>Ряд 1, столбец 2</td></tr>
                <tr><td>Ряд 2, столбец 1</td><td>Ряд 2, столбец 2</td></tr>
                <tr><td>Ряд 3, столбец 1</td><td>Ряд 3, столбец 2</td></tr>
                <tr><td>Ряд 4, столбец 1</td><td>Ряд 4, столбец 2</td></tr>           
                <tr><td>Ряд 5, столбец 1</td><td>Ряд 5, столбец 2</td></tr>
                <tr><td>Ряд 6, столбец 1</td><td>Ряд 6, столбец 2</td></tr>
                <tr><td>Ряд 7, столбец 1</td><td>Ряд 7, столбец 2</td></tr>
                <tr><td>Ряд 8, столбец 1</td><td>Ряд 8, столбец 2</td></tr>           
            </tbody>
        </table>
    </div>
Пример
Заголовок 1 Заголовок 2
Ряд 1, столбец 1 Ряд 1, столбец 2
Ряд 2, столбец 1 Ряд 2, столбец 2
Ряд 3, столбец 1 Ряд 3, столбец 2
Ряд 4, столбец 1 Ряд 4, столбец 2
Ряд 5, столбец 1 Ряд 5, столбец 2
Ряд 6, столбец 1 Ряд 6, столбец 2
Ряд 7, столбец 1 Ряд 7, столбец 2
Ряд 8, столбец 1 Ряд 8, столбец 2

7 комментария

  • qnikast:

    Пройдите 1 регистрацию, сделайте 2 действия
    и получайте от 8950 рублей каждые сутки в автоматическом режиме.

    Мы гарантируем:
    - Первый заработок в течении 60 минут.
    - Стабильный доход 24 часа в сутки.
    - Поступление денег без задержек.
    - Для России, стран СНГ и Европы.
    - Без вложений и установки ПО.
    - Специально для новичков и людей без опыта.

    Ознакомтесь с условиями у нас на сайте. ( http://www.prosto.zarplatt.ru )

  • vnikast:

    Пройдите 1 регистрацию, сделайте 2 действия
    и получайте от 8950 рублей каждые сутки в автоматическом режиме.

    Мы гарантируем:
    - Первый заработок в течении 60 минут.
    - Стабильный доход 24 часа в сутки.
    - Поступление денег без задержек.
    - Для России, стран СНГ и Европы.
    - Без вложений и установки ПО.
    - Специально для новичков и людей без опыта.

    Ознакомтесь с условиями на нашем сайте. ( prosto.zarplatt.ru )

  • nElenast:

    Наш сервис предоставляет настоящие лайки на фотографии заказчиков, которые готовы платить за качество.

    Именно для этого мы и набираем удалённых сотрудников, которые будут выполнять работу, то есть ставить лайки и получить за это деньги.

    Чтобы стать нашим удалённым сотрудником и начать ставить лайки, зарабатывая при этом 45 рублей за 1 поставленный лайк,

    Вам достаточно просто зарегистрироваться на нашем сервисе. > oplata-vklike.tk <

    Вывод заработанных средств ежедневно в течении нескольких минут.

  • vElenast:

    Наш сервис предоставляет настоящие лайки на фото заказчиков, которые готовы платить за качество.

    Именно для этого мы и набираем удалённых сотрудников, которые будут выполнять работу, то есть ставить лайки и зарабатывать за это деньги.

    Чтобы стать нашим удалённым сотрудником и начать ставить лайки, зарабатывая при этом 45 рублей за 1 поставленный лайк,

    достаточно просто зарегистрироваться на нашем сервисе. > oplata-vklike.tk <

    Вывод заработанных средств ежедневно в течении нескольких минут.

  • lElenast:

    Наш сервис предоставляет настоящие лайки на фотографии заказчиков, которые готовы платить за качество.

    Именно для этого мы и набираем удалённых сотрудников, которые будут выполнять работу, то есть ставить лайки и получить за это деньги.

    Чтобы стать нашим удалённым сотрудником и начать ставить лайки, зарабатывая при этом 45 рублей за 1 поставленный лайк,

    достаточно просто зарегистрироваться на нашем сервисе. > http://www.oplata-vklike.tk <

    Вывод заработанных средств ежедневно в течении нескольких минут.

  • pElenast:

    Наш сервис предоставляет настоящие лайки на фото заказчиков, которые готовы платить за качество.

    Именно для этого мы и набираем удалённых сотрудников, которые будут выполнять работу, то есть ставить лайки и зарабатывать за это деньги.

    Чтобы стать нашим удалённым сотрудником и начать ставить лайки, зарабатывая при этом 45 рублей за 1 поставленный лайк,

    достаточно просто зарегистрироваться на нашем сервисе. > http://www.oplata-vklike.tk <

    Вывод заработанных средств ежедневно в течении нескольких минут.

  • rannast:

    Ведущая компания в России и странах СНГ по продаже авиабилетов «Airline»

    Крупнейшая международная компания по продаже А/В билетов
    срочно набирает сотрудников на постоянную основу для несложной
    работы через интернет, с ежедневными выплатами до 11 000 руб.

    Работая в нашей компании Вы получаете:

    - Соблюдение трудового кодекса
    - Полный соцпакет, оплачиваемый отпуск, больничный, санаторий.
    - Каждый наш сотрудник на дому гарантированно получает высокий доход. руб. в день.
    - Гарантированные стабильные выплаты заработанных денег.
    - Выплаты происходят ежедневно на банковские карты или электронные кошельки.

    Пройдите регистрацию у нас на сайте. > http://airline-rabota.tk/ <

    Без вложений, опыт и профессиональные навыки не требуются!

Добавить комментарий


(обязательно)