Таблицы с фиксированным заголовком, современное состояние
Это постоянный вопрос с тех пор, как, например, навсегда: как сохранить заголовки зафиксированными сверху при прокрутке таблицы вниз?
Да, я знаю, что сеть не предназначена для отображения длинных таблиц, подобных таблицам, но когда клиент запрашивает что-то подобное (потому что он или она привыкли к этим старым документам Excel...), у вас нет выбора, кроме как соблюдать,
Это суммирует основные проблемы и попытки их решения с фиксацией заголовков таблицы:
-
<thead>
элемент может быть относительно позиционирован, но он не сдвинется с места; - с
position: absolute
или жеfixed
, голова "отсоединена" от остальной части таблицы, и ширина столбцов больше не совпадает; более того, вам нужно зарезервировать место над телом таблицы; - это можно решить, используя другую таблицу только для заголовков, оставив тело в другом, но это не решит проблему разной ширины столбцов;
- Вы можете установить столбцы с фиксированной шириной, но это не всегда применимо в зависимости от ваших потребностей - например, в случае динамического или неизвестного контента;
- Javascript может регулировать ширину столбцов, но доступ к таким свойствам, как
offsetWidth
вызывает перекомпоновку, что является довольно сложной задачей даже для таких браузеров, как Chrome или Firefox, и добавляет раздражающую задержку рендеринга даже с небольшими таблицами, но с динамическим содержимым; - вы можете создать копию таблицы, используя первую для отображения заголовков, а другую для отображения тела, но это делает DOM в два раза тяжелее и должен полагаться на Javascript для копирования изменений содержимого;
- с помощью
<div>
сdisplay: table-whatever
на самом деле ничего не решит, и лишает вас возможности добавитьrowspan
с иcolspan
s.
Возможно, мы сможем попробовать что-то новое с помощью новейших веб-технологий. Я экспериментировал с решением transform: translate
который ведет себя приемлемо хорошо ( см. здесь), и сохраняет пространство над телом таблицы, а ширина столбцов по-прежнему совпадает.
Это, конечно, не будет работать в IE8 и ниже. Но он отлично работает в Chrome, Safari и Firefox. Он не работает в Opera 12.x и ниже, но работает в Opera 15 благодаря своему новому движку рендеринга Blink. Я заметил, что это работает лучше или, по крайней мере, с translate
чем с translate3d
: он показывает немного меньше мерцания.
К сожалению, это не работает в IE9 и IE10, и заголовки остаются на своих местах. Это действительно позор, так как нет способа обнаружить это поведение (о котором я знаю).
Итак, каковы ваши самые последние решения этой проблемы? Я ищу CSS и чистые решения Javascript.
1 ответ
Недавно мне пришлось сделать именно эту вещь для клиента, и оказалось, что это почти невозможно. Я нашел действительно хорошую библиотеку под названием SlickGrid, однако, когда дело дошло до ее перевода на мобильные устройства, она просто не работала (производительность была слишком большой проблемой). Если вы не беспокоитесь о мобильном телефоне, тогда я определенно рекомендую проверить его. https://github.com/mleibman/SlickGrid