Визуальная система оформления строится поверх стандартного HTML
<select> и полностью управляется набором CSS-классов,
которые библиотека добавляет динамически при инициализации компонента.
Основная идея заключается в разделении логики и представления:
JavaScript отвечает за поведение, а внешний вид формируется через
переопределяемые стили.
После инициализации исходный элемент скрывается, а вместо него создаётся структура DOM, включающая контейнер управления, поле ввода и выпадающий список. Каждый из этих элементов получает предсказуемые классы, что позволяет строить как минималистичные, так и сложные визуальные системы.
Ключевой принцип: оформление не является фиксированным, а представляет собой набор переопределяемых слоёв.
Внутренняя структура компонента опирается на несколько базовых классов:
.ts-wrapper — корневой контейнер.ts-control — область ввода и выбранных значений.ts-dropdown — выпадающий список.ts-option — отдельный элемент списка.ts-item — выбранный элемент (tag/chip).ts-input — поле ввода внутри controlКаждый класс отражает конкретную зону интерфейса и может быть переопределён без влияния на логику.
Пример базового переопределения:
.ts-wrapper {
width: 100%;
}
.ts-control {
border: 1px solid #ccc;
padding: 8px;
border-radius: 6px;
}
.ts-dropdown {
border: 1px solid #ccc;
margin-top: 4px;
background: #fff;
}
.ts-option {
padding: 6px 10px;
cursor: pointer;
}
.ts-option.active {
background: #f0f0f0;
}
Оформление в Tom Select сильно зависит от состояния компонентов. Состояния задаются через модификаторы классов и позволяют визуально отражать поведение.
Основные состояния:
focus — активное взаимодействиеactive — выделенный элемент в спискеselected — выбранный элементdisabled — недоступное состояниеdropdown-open — открытый списокПример стилизации состояний:
.ts-wrapper.focus .ts-control {
border-color: #4a90e2;
box-shadow: 0 0 0 2px rgba(74,144,226,0.2);
}
.ts-option.active {
background: #e6f2ff;
}
.ts-wrapper.disabled .ts-control {
background: #f5f5f5;
opacity: 0.6;
pointer-events: none;
}
Состояния играют ключевую роль в построении доступного интерфейса, так как позволяют визуально различать интерактивные и статические элементы.
Наиболее распространённый подход к кастомизации заключается в полном переопределении стандартных классов. Такой подход не требует изменения JavaScript-логики и позволяет интегрировать компонент в любой дизайн-системный контур.
Пример темной темы:
.ts-wrapper {
font-family: sans-serif;
}
.ts-control {
background: #1e1e1e;
border: 1px solid #333;
color: #f1f1f1;
}
.ts-dropdown {
background: #2a2a2a;
border: 1px solid #333;
}
.ts-option {
color: #ddd;
}
.ts-option.active {
background: #3a3a3a;
}
.ts-item {
background: #444;
color: #fff;
border-radius: 4px;
padding: 2px 6px;
}
Такой подход обеспечивает консистентность интерфейса без изменения поведения компонента.
Многоуровневое оформление появляется при использовании режима множественного выбора. В этом случае каждый выбранный элемент отображается как отдельный визуальный блок.
Эти блоки формируются через класс .ts-item и могут
содержать кнопки удаления, текст и дополнительные индикаторы.
Пример стилизации тегов:
.ts-item {
display: inline-flex;
align-items: center;
background: #e8e8e8;
padding: 2px 8px;
margin: 2px;
border-radius: 12px;
font-size: 12px;
}
.ts-item .remove {
margin-left: 6px;
cursor: pointer;
opacity: 0.6;
}
.ts-item .remove:hover {
opacity: 1;
}
Поведение удаления и взаимодействия не зависит от оформления, что позволяет менять внешний вид без риска сломать логику.
Tom Select легко интегрируется с популярными дизайн-системами за счёт полной управляемости CSS.
.ts-control {
border-radius: 0.375rem;
border: 1px solid #ced4da;
padding: 0.375rem 0.75rem;
}
.ts-dropdown {
border-radius: 0.375rem;
box-shadow: 0 0.5rem 1rem rgba(0,0,0,0.15);
}
.ts-option:hover {
background: #f8f9fa;
}
.ts-control {
border: none;
border-bottom: 1px solid #aaa;
border-radius: 0;
padding: 6px 0;
}
.ts-dropdown {
border: none;
box-shadow: none;
}
Такой подход позволяет адаптировать компонент под любые интерфейсные стандарты без изменения логики.
В некоторых сборках и кастомных реализациях используется подход с CSS variables, позволяющий централизованно управлять стилями.
:root {
--ts-border: #ccc;
--ts-bg: #fff;
--ts-text: #222;
--ts-hover: #f2f2f2;
}
.ts-control {
border: 1px solid var(--ts-border);
background: var(--ts-bg);
color: var(--ts-text);
}
.ts-option:hover {
background: var(--ts-hover);
}
Такой способ особенно эффективен при динамическом переключении тем.
Оформление включает не только цвета и отступы, но и геометрию
компонента. Контейнер .ts-wrapper часто используется как
точка управления размерами.
.ts-wrapper {
width: 320px;
}
.ts-control {
min-height: 38px;
display: flex;
align-items: center;
flex-wrap: wrap;
}
При мультивыборе важно учитывать перенос элементов и переполнение строки, что напрямую влияет на визуальную устойчивость интерфейса.
Выпадающий список является наиболее сложной частью оформления, так как он сочетает прокрутку, навигацию и динамическое обновление.
.ts-dropdown {
max-height: 240px;
overflow-y: auto;
z-index: 1000;
}
.ts-dropdown .ts-option {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
Дополнительные визуальные улучшения часто включают тени и сглаживание краёв:
.ts-dropdown {
box-shadow: 0 6px 20px rgba(0,0,0,0.12);
border-radius: 6px;
}
Система оформления в Tom Select чувствительна к порядку загрузки стилей. Базовые стили библиотеки должны загружаться до пользовательских, иначе переопределения могут не примениться.
Правильная структура подключения:
<link rel="stylesheet" href="tom-select.css">
<link rel="stylesheet" href="custom-theme.css">
При необходимости увеличения специфичности используются комбинированные селекторы:
.ts-wrapper .ts-control {
border-color: #999;
}
Распространённый подход — добавление пользовательских классов к корневому элементу для создания тематических вариаций.
new TomSelect("#select", {
controlInput: null,
onInitialize() {
this.wrapper.classList.add("theme-dark");
}
});
.theme-dark .ts-control {
background: #111;
color: #eee;
}
.theme-dark .ts-dropdown {
background: #1a1a1a;
}
Этот метод позволяет изолировать темы без конфликтов между стилями.
Оформление должно учитывать разные экраны, особенно при использовании в мобильных интерфейсах.
@media (max-width: 600px) {
.ts-wrapper {
width: 100%;
}
.ts-dropdown {
max-height: 180px;
}
}
Адаптивность напрямую влияет на удобство работы с компонентом в условиях ограниченного пространства.
Глубокая кастомизация требует учета того, что часть классов создаётся динамически. Это означает:
Тем не менее архитектура Tom Select изначально ориентирована на расширяемость, что делает систему оформления предсказуемой при грамотной организации стилей