Slim Select строится вокруг идеи минимального вмешательства в
исходный <select>-элемент при одновременном создании
собственной управляемой DOM-обёртки. В результате библиотека не заменяет
HTML-элемент полностью, а расширяет его поведение через дополнительную
структуру узлов, синхронизируемую с оригинальным select.
Исходный элемент сохраняется в DOM и продолжает играть роль источника
данных и состояния, однако становится скрытым от пользователя через
стилизацию (display: none или аналогичные техники). Вся
визуальная часть формируется отдельным контейнером.
После вызова инициализации Slim Select создаёт основной контейнер,
который оборачивает исходный <select>.
Типичная структура:
<div class="ss-main">
<select class="ss-hidden">
<option value="1">Option 1</option>
<option value="2">Option 2</option>
</select>
<div class="ss-single-selected">
...
</div>
<div class="ss-content">
...
</div>
</div>
<select>Исходный <select> не удаляется из DOM. Он:
<option> и
<optgroup><select class="ss-hidden">
<option value="a">A</option>
<option value="b" selected>B</option>
</select>
Этот элемент выполняет критически важную функцию:
Slim Select всегда обновляет его при любом изменении выбора.
Блок .ss-single-selected формируется только для
одиночного выбора.
<div class="ss-single-selected">
<span class="placeholder">Select option</span>
<span class="ss-arrow"></span>
</div>
Контейнер .ss-content отвечает за список доступных
опций.
<div class="ss-content">
<div class="ss-search">
<input type="text" />
</div>
<div class="ss-list">
<div class="ss-option">Option 1</div>
<div class="ss-option ss-selected">Option 2</div>
</div>
</div>
<div class="ss-search">
<input type="text" autocomplete="off">
</div>
Функции:
Состояние input синхронизируется с внутренним фильтром Slim Select.
<div class="ss-list">
<div class="ss-option" data-value="1">Option 1</div>
<div class="ss-option ss-disabled">Disabled option</div>
</div>
Каждый элемент .ss-option представляет один
<option> из исходного select.
При использовании <optgroup> структура
усложняется:
<div class="ss-optgroup">
<div class="ss-optgroup-label">Group 1</div>
<div class="ss-option">A</div>
<div class="ss-option">B</div>
</div>
Группы сохраняют иерархию оригинального select, но визуально становятся управляемыми блоками.
Slim Select активно использует классы для управления состоянием интерфейса.
Любое изменение в интерфейсе приводит к обновлению сразу нескольких уровней:
ss-option,
ss-single-selected)<select>Выбор элемента:
click ss-option
→ update internal state
→ update select.value
→ rerender selected display
→ close dropdown
При multiple: true структура изменяется.
<div class="ss-values">
<div class="ss-value">
<span class="ss-value-text">Option 1</span>
<span class="ss-value-delete"></span>
</div>
</div>
.ss-single-selected.ss-valuesSlim Select минимизирует количество операций:
Ключевая особенность — частичное обновление DOM, а не полная перерисовка.
При изменении данных через API:
.ss-list пересобирается.ss-option генерируются заново или обновляютсяЭто позволяет быстро обрабатывать большие наборы данных без полной пересборки компонента.
DOM Slim Select можно рассматривать как три слоя:
<select><option><optgroup>.ss-main.ss-content.ss-option.ss-valueSlim Select реализует модель:
select (source of truth)
↓ sync
internal state (JS)
↓ render
custom DOM UI
Любое взаимодействие проходит через эту цепочку, что делает структуру предсказуемой и контролируемой при работе с динамическими формами и сложными интерфейсами.