Перейти до вмісту

Сортування таблиці HTML: 5 причин лишити таблицю

Сортування таблиці HTML: 5 причин лишити таблицю

Прайс, історія замовлень, список клієнтів: хтось просить сортування й фільтр, і відповідь зазвичай «поставимо грід-бібліотеку». Через пів року таблиця стає чорною скринькою, сторінка везе двісті кілобайт скрипта, а скрінрідер оголошує div там, де була таблиця.

Код: Oat-Table, ліцензія MIT.

Сортування таблиці HTML такої міни не потребує. Oat Table додає сортування, фільтр і вибір рядків навколо елемента <table>, і таблиця лишається таблицею.

Розмітка вже несе сенс

<th scope="col"> каже скрінрідеру, до якого стовпця належить комірка. <time datetime="2026-05-15"> каже парсеру, що означає видима дата. Нативний чекбокс у формі надсилає значення без серіалізатора.

Грід-бібліотека перезбирає все це на JavaScript, і кожне перезбирання щось втрачає: зв’язок заголовка з коміркою, стилі друку, вставку списку в таблицю.

Сортування це атрибут, а не віджет

<th scope="col" data-sort> робить стовпець сортованим як текст. number або date змінюють порівняння, auto визначає тип сам.

Коли видимий текст відформатований, комірка несе значення окремо: $42,128 сортується за 42128. Це все налаштування. Ні описів колонок в окремому файлі, ні функції рендера, ні віртуального DOM.

Скрипт обгортає текст заголовка в кнопку й оновлює aria-sort, тому керування доступне з клавіатури, а стан оголошується. Саме цей крок самописні рішення пропускають.

Фільтр ховає рядки, а не перезавантажує дані

Поле з data-table-filter порівнює текст рядка й ховає те, що не підійшло. Рядок може оголосити власний рядок пошуку, і тоді «Ada» знаходить запис, у якого видимий текст починається з назви компанії.

Лічильник потрапляє в <output aria-live="polite">, тому скрінрідер чує «12 рядків» після кожного натискання, не втрачаючи фокус.

Вибір рядків іде нативними чекбоксами, і «вибрати всі» діє лише на видимі рядки. Відфільтрували регіон, вибрали всі, і дія застосувалася до регіону. У бібліотеці така поведінка зазвичай стає багом.

Що бачить відвідувач на поганому зв’язку

Таблиця є в HTML, тому вона малюється раніше, ніж розбирається скрипт, і працює, якщо скрипт не завантажився. На телефоні з однією смужкою сигналу ця різниця вирішує, чи придатний список.

Прогресивне покращення це ще й стратегія тестування: у сторінки є стан без JavaScript, тому зламаний бандл дає деградовану сторінку, а не порожню.

Як перевірити відкат

Вимкніть JavaScript і завантажте сторінку. Таблиця має намалюватися, надрукуватися й знаходитися пошуком по сторінці. Потім заблокуйте запит скрипта і повторіть: сторінка, яка втрачає вміст через один файл, має єдину точку відмови посеред релізу.

Скільки це коштує

Одна таблиця стилів, один скрипт, жодних залежностей у рантаймі й розмітка, яку ви написали б і так. Для проєкту по 30–50 $ за годину економія не в завантаженні, а в тижні зв’язування, який не потрапляє в рахунок.

Де бібліотека все одно виграє

Правка комірок на місці, віртуалізація на десять тисяч рядків, зведені таблиці, перетягування колонок, вивантаження з оформленням. Це функції продукту, а не оздоблення таблиці, і там бібліотека відпрацьовує свою вагу.

Що перевірити перед вибором

Порахуйте рядки в реальному документі й подивіться, чи є в таблиці правка комірок або зведені підсумки. Якщо немає ні того ні другого, бібліотека додає вагу без функції.

Потім відкрийте сторінку з вимкненим JavaScript. Список, який без скрипта перетворюється на порожнє місце, коштує дорожче, ніж здається: він зникає в частини відвідувачів і в частини релізів.

Якщо таблиця потрібна лише для читання, сортування по кліку часто не потрібне взагалі: достатньо посилання на відсортовану адресу, і така адреса живе в закладках.

Прайс на сорок рядків таким продуктом не є. Нативна таблиця означає, що наступний розробник прочитає сторінку, не відкриваючи документацію.

Поруч: веб-розробка про те, як рахується обсяг фронтенду, і SEO про те, що вміст таблиці дає пошуку. Якщо сторінку читає перекладена аудиторія, цю перевірку закриває читабельність тексту.