Библиотека Choices.js использует собственный набор CSS-стилей, который отвечает за внешний вид выпадающих списков, мультивыбора, тегов и интерактивных состояний компонентов. Визуальная часть отделена от логики, поэтому корректное подключение стилей является обязательным условием полноценной работы интерфейса.
Основной файл стилей содержит:
Без подключения CSS библиотека сохраняет функциональность, но интерфейс становится нефункциональным с точки зрения UX: элементы теряют визуальную иерархию и интерактивную читаемость.
Наиболее простой вариант интеграции заключается в подключении готового файла стилей, поставляемого вместе с библиотекой.
При использовании CDN подключение выполняется через стандартный
<link>:
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/choices.js/public/assets/styles/choices.min.css">
Данный файл содержит минимизированную production-версию стилей и подходит для быстрого старта или простых проектов без сборки.
При локальной установке через менеджеры пакетов CSS находится в директории:
node_modules/choices.js/public/assets/styles/choices.min.css
Подключение осуществляется через импорт в основной файл стилей приложения:
@import "node_modules/choices.js/public/assets/styles/choices.min.css";
В современных сборщиках, таких как Webpack, Vite или Rollup, предпочтительным способом считается импорт CSS непосредственно в JavaScript-модуль.
import 'choices.js/public/assets/styles/choices.min.css';
Такой подход обеспечивает:
В Vite и аналогичных системах стили обрабатываются как часть графа модулей, что позволяет избежать ручного подключения в HTML.
Внутренняя организация стилей построена на классовой системе, которая отражает состояние компонента.
Основные классы:
.choices — корневой контейнер компонента.choices__inner — внутренняя область инпута.choices__list — список элементов.choices__item — отдельный элемент списка.choices__item--selectable — выбираемый элемент.choices__item--selected — выбранное значение.is-open — состояние раскрытого списка.is-focused — состояние фокуса.is-disabled — неактивное состояниеКаждый класс отвечает за конкретное визуальное состояние, что позволяет гибко переопределять внешний вид без изменения JavaScript-логики.
Кастомизация внешнего вида выполняется через переопределение CSS-классов. Базовая структура допускает расширение без модификации исходных файлов библиотеки.
Пример изменения контейнера:
.choices {
border-radius: 10px;
border: 1px solid #d0d0d0;
}
Изменение внутренней области:
.choices__inner {
min-height: 44px;
padding: 6px 12px;
background-color: #ffffff;
}
Стили выбранных элементов:
.choices__item--selectable {
font-weight: 500;
color: #333;
}
Choices.js не навязывает фиксированную цветовую схему, что позволяет интегрировать компонент в любые дизайн-системы.
Для построения темизации обычно используется подход CSS-переменных:
:root {
--choices-bg: #ffffff;
--choices-border: #cccccc;
--choices-text: #222222;
--choices-focus: #2684ff;
}
Переопределение базовых классов через переменные:
.choices__inner {
background-color: var(--choices-bg);
border-color: var(--choices-border);
color: var(--choices-text);
}
.choices.is-focused {
border-color: var(--choices-focus);
}
Такой подход упрощает переключение тем и интеграцию с системами дизайна, основанными на токенах.
Поддержка тёмной темы реализуется через медиа-запросы или классовую модель приложения.
Медиа-запрос:
@media (prefers-color-scheme: dark) {
.choices__inner {
background-color: #1e1e1e;
color: #f1f1f1;
border-color: #333;
}
.choices__list--dropdown {
background-color: #1e1e1e;
}
}
Классовый вариант:
.theme-dark .choices__inner {
background-color: #1e1e1e;
color: #f1f1f1;
border-color: #333;
}
Второй подход обеспечивает более контролируемое переключение темы в рамках приложения.
Выпадающий список является отдельным визуальным слоем, который позиционируется поверх интерфейса.
Основные элементы:
.choices__list--dropdown {
border-radius: 8px;
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);
margin-top: 4px;
overflow: hidden;
}
Элементы списка:
.choices__list--dropdown .choices__item {
padding: 10px 12px;
cursor: pointer;
}
Состояние наведения:
.choices__list--dropdown .choices__item--selectable:hover {
background-color: #f2f6ff;
}
Режим мультивыбора добавляет визуальные элементы в виде тегов.
Контейнер тегов:
.choices__list--multiple {
display: flex;
flex-wrap: wrap;
gap: 6px;
}
Отдельный тег:
.choices__item--selectable {
background-color: #2684ff;
color: #ffffff;
border-radius: 6px;
padding: 4px 8px;
font-size: 12px;
}
Кнопка удаления:
.choices__button {
margin-left: 6px;
cursor: pointer;
}
Система классов состояния позволяет визуально отражать поведение компонента без JavaScript-манипуляций DOM-стилями.
Состояние фокуса:
.choices.is-focused .choices__inner {
border-color: #2684ff;
}
Состояние открытия:
.choices.is-open .choices__list--dropdown {
display: block;
}
Состояние отключения:
.choices.is-disabled {
opacity: 0.5;
pointer-events: none;
}
Анимации раскрытия и взаимодействия задаются через CSS-переходы.
.choices__list--dropdown {
transition: opacity 0.2s ease, transform 0.2s ease;
transform: translateY(-4px);
opacity: 0;
}
.choices.is-open .choices__list--dropdown {
transform: translateY(0);
opacity: 1;
}
Использование переходов вместо JavaScript-анимаций снижает нагрузку на основной поток и улучшает отзывчивость интерфейса.
При использовании SCSS структура стилей может быть включена как модуль:
@import "choices.js/public/assets/styles/choices";
Далее возможно расширение через вложенность:
.choices {
&__inner {
border-radius: 8px;
}
&.is-open {
border-color: #2684ff;
}
}
Подобная организация упрощает масштабирование стилей в крупных проектах.
Choices.js использует уникальную нейминг-систему классов, что снижает риск конфликтов с глобальными стилями приложения.
Для дополнительной изоляции применяется:
При необходимости усиленной изоляции компонент может быть помещён в контейнер с собственным namespace:
.form-field .choices__inner {
font-size: 14px;
}
Адаптация под различные интерфейсные плотности выполняется через изменение padding и font-size:
.choices__inner {
min-height: 36px;
font-size: 13px;
}
.choices__item {
padding: 6px 10px;
}
Для компактных интерфейсов используется уменьшение отступов, для десктопных панелей — увеличение интерактивных зон.