Поведение поля ввода в Tom Select может быть расширено через механизм
автоматического изменения ширины инпута в зависимости от введённого
текста. Плагин input_autogrow обеспечивает динамическое
масштабирование текстового поля внутри компонента, устраняя
фиксированную ширину и делая интерфейс более адаптивным при работе с
тегами или поисковыми запросами переменной длины.
В стандартной реализации HTML input имеет фиксированную ширину, из-за чего длинные значения либо обрезаются визуально, либо требуют горизонтального скролла. В контексте Tom Select это особенно заметно в режиме множественного выбора, где поле ввода располагается рядом с уже выбранными тегами. Autogrow решает эту проблему за счёт вычисления ширины текста и подстройки input в реальном времени.
Плагин активируется через конфигурацию plugins при
инициализации Tom Select. Он не требует дополнительных зависимостей и
работает на основе внутреннего измерения ширины текста.
new TomSelect("#select-tags", {
plugins: {
input_autogrow: {}
}
});
При включении плагина библиотека создаёт скрытый измерительный элемент, который используется для вычисления реальной ширины текста с учётом текущего шрифта, отступов и межсимвольных интервалов.
Механизм автогроу основан на синхронизации содержимого input с невидимым DOM-элементом. Каждый ввод символа вызывает пересчёт ширины:
scrollWidth или вычисленная ширина через
layout engine.style.width.Таким образом, ширина поля всегда соответствует визуальной длине текста.
В режиме множественного выбора input располагается после списка выбранных токенов. Без автогроу поле часто занимает фиксированное минимальное пространство, что создаёт ощущение «пустоты» или, наоборот, визуального обрыва ввода.
При включённом input_autogrow:
Это обеспечивает визуальную целостность строки ввода и предотвращает переполнение контейнера.
В одиночном выборе эффект менее выражен, однако полезен при поисковых полях, где ввод может быть длинным (например, фильтры, email, сложные запросы).
Особенности:
Автоматическое расширение требует ограничений, иначе input может выйти за пределы контейнера.
Типовые подходы ограничения:
.ts-control input {
max-width: 100%;
}
или через конфигурацию контейнера:
.ts-controlflex-wrap для переноса теговПлагин не управляет max-width напрямую, он только вычисляет «естественную» ширину текста.
Точность автогроу зависит от совпадения вычислений с реальным рендерингом текста. На результат влияют:
Если CSS меняется динамически, измерительный элемент автоматически пересчитывает ширину при следующем вводе, но не всегда мгновенно отражает внешние изменения без триггера обновления.
В кастомных темах Tom Select часто изменяются базовые размеры элементов. В таких случаях автогроу может давать небольшие визуальные расхождения.
Типичные причины:
Решение заключается в синхронизации CSS input и измерительного элемента, так как плагин предполагает одинаковую модель рендеринга для обоих.
Изменения значения через API Tom Select:
const control = selectInstance;
control.setValue(["a", "b"]);
не всегда вызывают пользовательский input event. В таких случаях автогроу пересчитывается при следующем взаимодействии с полем.
Для принудительного обновления применяется вызов ререндера:
refreshItems()При загрузке опций с сервера и последующем автозаполнении input возможна кратковременная рассинхронизация ширины. Это связано с тем, что DOM ещё не завершил layout-вычисления.
Типичный сценарий:
В сложных интерфейсах это может проявляться как «прыжок» ширины.
input_autogrow корректно работает с большинством
встроенных расширений:
remove_button — не влияет на вычисление шириныclear_button — может вызывать краткий reset inputdropdown_input — расширяет поле внутри выпадающего
менюoptgroup_columns — не влияет на input-логикуКонфликты возникают только при кастомных плагинах, которые изменяют DOM-структуру control-области.
Пересчёт ширины выполняется на событиях ввода, что делает его чувствительным к частым обновлениям. В большинстве случаев нагрузка минимальна, однако при больших формах с множеством Tom Select инстансов возможны микрозадержки.
Оптимизационные моменты:
При отсутствии текста input возвращается к минимальной ширине, заданной стилями Tom Select. Это значение служит базовой точкой отсчёта и предотвращает схлопывание поля до нуля.
Минимальная ширина обычно определяется через:
Автогроу меняет восприятие ввода в сторону более «живого» интерфейса. Поле становится адаптивным к содержимому, снижая визуальный шум и улучшая читаемость длинных последовательностей тегов или значений.
В формах с высокой плотностью ввода это особенно заметно при работе с: