Адаптивный дизайн в контексте Awesomplete связан не только с масштабированием элементов под разные экраны, но и с корректным поведением списка подсказок в условиях ограниченного пространства, сенсорного ввода и изменяющихся параметров viewport. Библиотека изначально минималистична, поэтому вся адаптивность реализуется через сочетание CSS и JavaScript-хуков.
Ключевая задача — обеспечить стабильное отображение списка подсказок поверх интерфейса вне зависимости от устройства: мобильный экран, планшет, десктоп, а также учитывать виртуальную клавиатуру, которая изменяет высоту видимой области.
Awesomplete строит список подсказок как абсолютный элемент, привязанный к input. Это означает:
Минимальная адаптивная база задаётся так:
.awesomplete {
width: 100%;
}
.awesomplete > ul {
box-sizing: border-box;
width: 100%;
}
Такой подход позволяет элементу автоматически подстраиваться под родительский контейнер, что критично для flex- и grid-раскладок.
В адаптивной верстке важно учитывать, что Awesomplete наследует ограничения родителя. Если input находится внутри блока с фиксированной шириной или padding, список подсказок будет следовать этим границам.
Частая практика — использовать обёртку:
<div class="autocomplete-wrapper">
<input class="awesomplete" />
</div>
.autocomplete-wrapper {
width: 100%;
max-width: 600px;
}
Такой слой позволяет:
Основная сложность адаптивности — виртуальная клавиатура. На мобильных устройствах viewport изменяет высоту, и список подсказок может уходить за пределы экрана.
Для решения используется ограничение максимальной высоты списка:
.awesomplete > ul {
max-height: 60vh;
overflow-y: auto;
-webkit-overflow-scrolling: touch;
}
Здесь важно:
60vh — динамическое ограничение по высоте экрана;overflow-y: auto — включение прокрутки внутри
списка;-webkit-overflow-scrolling: touch — плавный скролл на
iOS.Такой подход предотвращает ситуацию, когда подсказки оказываются недоступны из-за клавиатуры.
Awesomplete по умолчанию отображает список под input. Однако в узких или низких экранах может потребоваться динамическое изменение положения.
Через JavaScript можно отслеживать доступное пространство:
const input = document.querySelector("input.awesomplete");
input.addEventListener("awesomplete-open", function () {
const list = this.nextElementSibling;
const rect = list.getBoundingClientRect();
if (rect.bottom > window.innerHeight) {
list.style.top = "auto";
list.style.bottom = "100%";
}
});
Такой подход позволяет:
Сенсорные устройства требуют увеличенных зон взаимодействия. В Awesomplete это достигается через стили списка элементов:
.awesomplete > ul > li {
padding: 12px 16px;
font-size: 16px;
}
Ключевые моменты:
Также важно учитывать hover-эффекты, которые на мобильных устройствах
отсутствуют. Поэтому выделение активного элемента должно быть
дублировано классом .active, а не только
:hover.
Awesomplete легко адаптируется через стандартные CSS media queries:
@media (max-width: 768px) {
.awesomplete > ul {
font-size: 14px;
}
}
@media (max-width: 480px) {
.awesomplete > ul {
font-size: 13px;
max-height: 50vh;
}
}
Такой подход позволяет:
Awesomplete часто используется внутри современных layout-систем. Важно учитывать, что absolute-positioned список может вести себя непредсказуемо в overflow-контейнерах.
Рекомендации:
.container {
display: flex;
flex-direction: column;
overflow: visible;
}
или
.grid-container {
display: grid;
overflow: visible;
}
Если родитель имеет overflow: hidden, список подсказок
может быть обрезан. Это одна из наиболее частых проблем адаптивного
поведения.
При смене ориентации экрана или изменении viewport необходимо пересчитывать позицию списка:
window.addEventListener("resize", function () {
document.querySelectorAll(".awesomplete > ul").forEach(list => {
list.style.width = list.parentElement.offsetWidth + "px";
});
});
Это важно для:
На мобильных устройствах скролл страницы может влиять на позиционирование списка. Без фиксации он “прыгает” относительно input.
Часто используется стратегия привязки:
.awesomplete > ul {
position: absolute;
}
и дополнительный контроль через JavaScript при скролле:
window.addEventListener("scroll", () => {
const input = document.querySelector(".awesomplete input");
const list = input.nextElementSibling;
const rect = input.getBoundingClientRect();
list.style.top = rect.bottom + window.scrollY + "px";
list.style.left = rect.left + window.scrollX + "px";
});
Такой механизм стабилизирует отображение в сложных интерфейсах.
В модальных компонентах Awesomplete требует особого внимания к stacking context:
.modal {
position: relative;
z-index: 1000;
}
.awesomplete > ul {
z-index: 1100;
}
Без этого список может оказываться под затемнением или другими слоями интерфейса.
Также важно учитывать ограничение overflow внутри модалки, так как оно часто блокирует выход списка за границы контейнера.
На практике адаптивность Awesomplete строится на трёх режимах:
Эти режимы не задаются библиотекой напрямую, но формируются комбинацией CSS и событий JavaScript, что позволяет гибко настраивать поведение без модификации ядра Awesomplete.