Выпадающий список подсказок в Awesomplete формируется динамически и
представляет собой стандартный HTML-элемент <ul> с
вложенными <li>, который вставляется в DOM рядом с
исходным <input>. Вся визуальная кастомизация
строится вокруг CSS-правил, поскольку библиотека намеренно минимизирует
вмешательство в оформление, оставляя разработчику полный контроль над
внешним видом.
После инициализации Awesomplete создаёт следующую структуру:
<div class="awesomplete">
<input />
<ul>
<li>Первый вариант</li>
<li>Второй вариант</li>
<li>Третий вариант</li>
</ul>
</div>
Ключевые моменты структуры:
.awesomplete оборачивает поле ввода;<ul> появляется только при наличии
результатов;<li> соответствует одной
подсказке;aria-selected="true".Стилизация строится вокруг нескольких устойчивых селекторов:
.awesomplete {
position: relative;
display: inline-block;
}
.awesomplete > ul {
position: absolute;
left: 0;
z-index: 1000;
min-width: 100%;
list-style: none;
padding: 0;
margin: 0;
}
.awesomplete > ul > li {
padding: 8px 12px;
cursor: pointer;
}
Awesomplete использует стандартные HTML-атрибуты и классы для отражения состояния:
[aria-selected="true"] — текущий активный элемент:hover — наведение курсора.hidden — скрытый список.visually-hidden — вспомогательные элементы
доступностиПример стилизации активного элемента:
.awesomplete > ul > li[aria-selected="true"] {
background: #2d6cdf;
color: #fff;
}
По умолчанию список управляется через display и
visibility. Встроенная логика Awesomplete добавляет/убирает
классы в зависимости от состояния ввода.
Типичный подход к кастомизации:
.awesomplete > ul {
display: none;
}
.awesomplete[aria-expanded="true"] > ul {
display: block;
}
Дополнительно можно использовать анимации:
.awesomplete > ul {
opacity: 0;
transform: translateY(-4px);
transition: opacity 0.15s ease, transform 0.15s ease;
}
.awesomplete[aria-expanded="true"] > ul {
opacity: 1;
transform: translateY(0);
}
Ключевая особенность Awesomplete — абсолютное позиционирование списка относительно контейнера.
.awesomplete {
position: relative;
}
.awesomplete > ul {
top: 100%;
left: 0;
}
Расширенные сценарии:
.awesomplete > ul {
top: calc(100% + 4px);
}
.awesomplete > ul {
max-height: 240px;
overflow-y: auto;
}
Каждый <li> можно рассматривать как интерактивный
элемент меню.
.awesomplete > ul > li {
font-size: 14px;
line-height: 1.4;
border-bottom: 1px solid rgba(0, 0, 0, 0.05);
}
.awesomplete > ul > li:last-child {
border-bottom: none;
}
.awesomplete > ul > li:hover {
background: #f2f6ff;
}
Awesomplete автоматически оборачивает совпадающие части строки в
<mark>:
<li>
<mark>Ja</mark>vascript
</li>
Стилизация маркера:
.awesomplete mark {
background: transparent;
color: #2d6cdf;
font-weight: 600;
}
Альтернативный вариант с подсветкой фоном:
.awesomplete mark {
background: #fff3a3;
color: inherit;
}
Для придания выпадающему списку «плавающего» эффекта применяются тени и радиусы:
.awesomplete > ul {
background: #fff;
border-radius: 6px;
box-shadow: 0 8px 20px rgba(0, 0, 0, 0.15);
overflow: hidden;
}
Awesomplete активно поддерживает управление с клавиатуры, поэтому важно визуально различать активный элемент:
.awesomplete > ul > li[aria-selected="true"] {
outline: none;
background: #1f4fbf;
color: #ffffff;
}
Дополнительно можно добавить индикатор слева:
.awesomplete > ul > li[aria-selected="true"]::before {
content: "";
position: absolute;
left: 0;
width: 3px;
height: 100%;
background: #ffcc00;
}
Поддержка тёмного интерфейса обычно реализуется через класс на корневом элементе:
.dark .awesomplete > ul {
background: #1e1e1e;
color: #e6e6e6;
box-shadow: 0 8px 20px rgba(0, 0, 0, 0.5);
}
.dark .awesomplete > ul > li:hover {
background: #2a2a2a;
}
На мобильных устройствах выпадающий список часто занимает всю ширину:
@media (max-width: 600px) {
.awesomplete > ul {
position: fixed;
left: 0;
right: 0;
width: 100%;
border-radius: 0;
}
}
Выпадающий список должен находиться выше других элементов интерфейса:
.awesomplete > ul {
z-index: 9999;
}
При сложных интерфейсах иногда требуется изоляция контекста:
.header, .modal {
position: relative;
z-index: 1;
}
Возможна кастомизация через дополнительные классы, добавляемые вручную:
new Awesomplete(input, {
list: ["JavaScript", "Java", "Python"]
});
И последующая стилизация:
.awesomplete.custom-dropdown > ul {
border: 2px solid #2d6cdf;
border-radius: 10px;
}
При использовании display: none анимации невозможны,
поэтому предпочтительнее управлять видимостью через прозрачность:
.awesomplete > ul {
opacity: 0;
pointer-events: none;
}
.awesomplete[aria-expanded="true"] > ul {
opacity: 1;
pointer-events: auto;
}
Для длинных подсказок применяется обрезка:
.awesomplete > ul > li {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
Стилизация выпадающего списка в Awesomplete сводится к управлению несколькими слоями:
.awesomplete);ul);li);aria-selected, :hover,
[aria-expanded]);mark).Комбинация этих уровней позволяет формировать интерфейс автодополнения любой сложности — от минималистичных полей ввода до сложных дизайн-систем с анимациями, темами и адаптивной логикой отображения.