Несколько месяцев назад я написал некоторый код, который делал именно то, где я хотел, чтобы заголовки работали аналогично заголовкам разделов на iOS.
Используя Jquery, я решил создать решение для прослушивания событий onScroll (и onResize для изменения размера окна), которое провело проверку всех $('table thead')
и проверило их $(this).position()
на странице.
Проверка состояла в том, была ли позиция thead
выше верхней части текущего окна просмотра.
Как только я нашел самый релевантный заголовок (самый нижний thead
, который был над окном просмотра), я создал новый table
с position: fixed
в (0, 0) и скопировал в него новый столбец для каждый столбец строк заголовков и вручную установите его свойства width
в соответствии с исходной таблицей.
Я собрал доказательство концепции, которое показывает, как все это работает .
Вот некоторый псевдокод того, как это работает:
- Проверьте, видима ли таблица
- Получить список всех
thead
разделов в таблице
- Перевернуть список
- Найти первое
thead
в массиве с верхней позицией, меньшей scrollTop
элемента body
- Если мы нашли один:
- Создание глубокой копии thead
- Сделать контейнер для стола
- Скопируйте атрибуты из исходной таблицы, чтобы скопировать стили
- Установите контейнер на
[0, originalTable.left]
- Установить ширину, равную
outerWidth
исходной таблицы
- Установите ширину каждого
td
найденного равным ширине td
из исходной таблицы
- Добавить его в DOM
- Если ничего не найдено, удалите существующий контейнер из DOM, если он был
Существуют и другие подробности, которые сделали это еще приятнее:
- Вместо (0, 0) исходная точка для фиксированной строки была изменена в зависимости от того, должна ли ее отталкивать «настоящая» строка заголовка для
tbody
ниже той, которая имеет фиксированный заголовок.
- Убедитесь, что предыдущие строки заголовка удалены перед созданием новой
- Не пересоздавать строку заголовка, если заголовок, который вы делаете, совпадает с тем, что уже есть
Этот подход работал намного лучше других, которые я пробовал, например, пытался position:absolute
объект из-за того, что Firefox и IE не очень быстро запускают обработчик onScroll, поэтому вы склонны видеть «дрожание». Я также попытался перебрать атрибут position
из thead
s, это просто закончилось скачками ширины столбца таблицы и несоответствием данных.
thead
узлы строго не требуются для этого решения, так как вы можете использовать другой селектор, чтобы определить, какие строки являются заголовками и т. Д.
Обновление : добавлен пример кода и псевдокода