Параметр reposition управляет поведением всплывающего
календаря при изменении размеров окна браузера и прокрутке страницы. Его
задача — контролировать, будет ли компонент автоматически пересчитывать
своё положение относительно связанного input-элемента после того, как
первоначальная позиция уже была вычислена и установлена.
Внутри Pikaday позиционирование календаря реализовано через
абсолютное или фиксированное размещение DOM-элемента, привязанного к
полю ввода. После первичного открытия календаря библиотека вычисляет
координаты input через getBoundingClientRect(), учитывает
скролл контейнеров и окна, а затем устанавливает стили top
и left. Однако при динамических изменениях viewport эти
координаты могут устаревать.
repositionОсновная функция параметра заключается в управлении автоматическим обновлением позиции календаря при:
scroll)resize)Если reposition включён, календарь остаётся визуально
«привязанным» к input даже при изменениях layout. Если отключён —
позиция фиксируется на момент открытия и больше не корректируется.
reposition: trueПри активном режиме библиотека:
window.resize и
window.scrolltop/left к календарюЭто особенно важно для интерфейсов с динамической версткой, где элементы могут сдвигаться при прокрутке или изменении размеров блоков.
Пример конфигурации:
const picker = new Pikaday({
field: document.getElementById('date'),
reposition: true
});
reposition: falseПри отключённом режиме календарь:
scroll и resize для
перерасчёта координатЭто уменьшает количество обработчиков событий и может повысить производительность в сложных интерфейсах, но создаёт риск визуального рассинхрона.
const picker = new Pikaday({
field: document.getElementById('date'),
reposition: false
});
В Pikaday пересчёт позиции при reposition опирается на
несколько шагов:
window.scrollX,
window.scrollY)Особое значение имеет шаг проверки границ. Если календарь не помещается снизу, он может быть отображён сверху относительно input. Если не помещается справа — смещается влево.
Поведение reposition зависит не только от
JavaScript-логики, но и от CSS-окружения:
position: relative у родительских контейнеровtransform у предков (создаёт новый контекст
наложения)overflow: hidden может обрезать календарьz-index влияет на видимость при пересчётеПри включённом reposition библиотека пытается
компенсировать эти факторы, но не всегда может полностью обойти
ограничения CSS.
bound и containerПараметр reposition часто рассматривается в связке с
другими настройками:
bound: ограничивает календарь рамками
input-контейнераcontainer: задаёт DOM-элемент, внутри которого
рендерится календарьЕсли container фиксирован и не меняет положение,
необходимость в reposition может снижаться. Если же
календарь рендерится в body, динамическое пересчитывание
становится критичнее.
Включённый reposition может создавать лишнюю нагрузку в
следующих случаях:
scroll-событиямиВ таких ситуациях перерасчёт координат на каждый scroll
может приводить к лишним reflow/layout recalculation.
При необходимости сохранения reposition: true и
минимизации нагрузки обычно учитываются следующие факторы:
scroll-событий через passive
listenersНа мобильных устройствах изменение ориентации (portrait/landscape)
вызывает событие resize. При включённом
reposition календарь:
Это критично для интерфейсов, где input расположен близко к краям экрана.
Логически параметр можно представить как переключатель между двумя режимами:
Внутри Pikaday динамический режим является более универсальным, но требует больше ресурсов браузера.
При пересчёте позиции reposition не изменяет
z-index напрямую, однако при перемещении календаря между
координатами может проявляться эффект перекрытия другими элементами
интерфейса. Особенно это заметно при:
transformВ таких случаях позиционирование может корректно обновляться, но визуальное наложение остаётся проблемой CSS-слоя.
reposition определяет степень «привязанности» календаря
к input-элементу во времени. При активном значении компонент сохраняет
пространственную согласованность с интерфейсом даже при изменениях
layout, при отключённом — работает как статический попап, фиксируемый в
момент открытия.