Библиотека Awesomplete строит интерфейс автодополнения на минимальном наборе HTML-элементов и CSS-классов, оставляя разработчику полную свободу стилизации. Вся визуальная логика основана на нескольких ключевых классах, которые описывают состояние компонента, список подсказок и активный элемент.
Основная идея архитектуры заключается в разделении трёх уровней:
Такой подход позволяет переопределять внешний вид без вмешательства в JavaScript-логику библиотеки.
.awesompleteКорневой элемент, который оборачивает input и список подсказок, получает класс:
.awesomplete
Этот контейнер создаётся автоматически при инициализации библиотеки и служит основой для позиционирования выпадающего списка.
Типичная роль контейнера:
position: relative);z-index.Пример структуры DOM:
<span class="awesomplete">
<input />
<ul></ul>
</span>
Контейнер часто используется для глобальных модификаций внешнего вида компонента, например:
ulВнутри контейнера создаётся элемент:
ul (без обязательного дополнительного
класса)
Этот список содержит все доступные варианты автодополнения.
Основные особенности:
.awesomplete.Часто применяется стилизация через селектор:
.awesomplete > ul
Список является ключевым визуальным компонентом, определяющим поведение выпадающего меню.
liКаждое предложение автодополнения представлено элементом:
li
Эти элементы генерируются динамически на основе массива данных или результата фильтрации.
Основные характеристики:
Типичная стилизация:
.awesomplete li {
cursor: pointer;
}
.activeОдним из ключевых классов является:
.active
Он назначается элементу li, который в данный момент
выбран пользователем с клавиатуры (стрелки вверх/вниз).
Роль состояния .active:
Пример стилизации:
.awesomplete li.active {
background: #e0e0e0;
color: #000;
}
Важно, что .active не связан с hover-состоянием напрямую
— они могут перекрываться, но логика управляется JavaScript.
Список подсказок управляется через комбинацию CSS и атрибутов состояния.
На уровне CSS часто используются:
display: none для скрытого состояния;display: block для активного;visibility и
opacity.Библиотека также опирается на ARIA-атрибуты:
aria-expanded="true|false" на input;aria-hidden на списке (в некоторых реализациях);aria-selected на элементах li.Типичный подход:
.awesomplete > ul {
display: none;
}
.awesomplete[aria-expanded="true"] > ul {
display: block;
}
Такой механизм обеспечивает не только визуальную, но и семантическую синхронизацию состояния.
Awesomplete активно использует ARIA для доступности интерфейса.
Ключевые связи:
input[aria-expanded] отражает открытость списка;li[aria-selected="true"] соответствует активному
элементу;ul может иметь role="listbox";li — role="option".CSS может учитывать эти состояния напрямую:
.awesomplete li[aria-selected="true"] {
background: #d0d0ff;
}
Это позволяет синхронизировать визуальное и семантическое состояние без дополнительных классов.
Внутри элементов li часто используется разметка для
подсветки совпадений (например, <mark> или
<strong> в зависимости от конфигурации).
Типичная стилизация:
.awesomplete mark {
background: yellow;
color: inherit;
}
Это усиливает визуальное восприятие совпадающих частей строки и не требует изменения логики фильтрации.
Контейнер .awesomplete обычно имеет:
.awesomplete {
position: relative;
}
А список:
.awesomplete > ul {
position: absolute;
top: 100%;
left: 0;
right: 0;
z-index: 1000;
}
Это обеспечивает:
Ключевая особенность Awesomplete — минимальная жёсткость CSS. Почти все стили могут быть переопределены.
Основные точки кастомизации:
.awesomplete — контейнер;.awesomplete > ul — список;.awesomplete li — элементы;.active — выбранный элемент;[aria-expanded="true"] — состояние открытия.Пример полной переопределяющей схемы:
.awesomplete > ul {
border: 1px solid #ccc;
border-radius: 4px;
background: white;
}
.awesomplete li {
padding: 8px 12px;
}
.awesomplete li.active {
background: #007bff;
color: white;
}
Хотя библиотека не навязывает тему, часто применяются обёртки:
.awesomplete.dark.awesomplete.lightили модификации через родительский контейнер:
.dark .awesomplete > ul {
background: #222;
color: #fff;
}
Такой подход позволяет внедрять компонент в дизайн-системы без изменения исходной логики.
Часто встречаются следующие проблемы:
1. Перекрытие z-index Список может оказываться под
другими элементами интерфейса из-за отсутствия явного
z-index.
2. Сброс position Удаление
position: relative у контейнера ломает привязку списка.
3. Конфликт с глобальными стилями ul и
li Reset-стили могут неожиданно изменять внешний
вид списка.
4. Игнорирование ARIA-состояний Стилизация только
через .active без учета [aria-selected]
приводит к рассинхронизации состояния и доступности.
5. Слишком агрессивные селекторы Глобальные правила
типа ul li {} могут ломать компонент.
Набор CSS-классов Awesomplete формирует компактную, но функционально завершённую систему интерфейса автодополнения. Каждый класс отражает конкретное состояние или структурную роль, а взаимодействие между ними обеспечивает поведение выпадающего списка без дополнительной сложности в JavaScript-слое.