Работа анимаций в Flatpickr основана на сочетании CSS-переходов и минимального JavaScript-контроля состояния календаря. Библиотека не использует тяжёлые JS-анимационные движки, а полагается на классы состояния, которые переключаются при открытии, закрытии и смене внутренних представлений (месяц, год, режим времени). Это делает поведение предсказуемым и легко переопределяемым через стили.
Основная логика анимаций в Flatpickr строится вокруг переключения состояния календаря:
Каждое состояние отражается через CSS-классы, которые добавляются и удаляются в DOM. Сам JavaScript не выполняет сложную интерполяцию значений, а только инициирует переход состояний.
Ключевой принцип:
анимация = CSS transition + класс состояния
В конфигурации Flatpickr присутствует опция:
animate: true
Она определяет, будут ли применяться переходы открытия/закрытия календаря.
flatpickr("#input", {
animate: false
});
При отключении:
Это используется в интерфейсах, где важна скорость отображения или где анимации конфликтуют с кастомными UI-компонентами.
При взаимодействии с полем ввода Flatpickr добавляет/убирает состояния календаря.
Типичная последовательность:
Часто используется комбинация:
Хотя Flatpickr не навязывает стили, стандартная тема использует следующие принципы:
.flatpickr-calendar {
opacity: 0;
transform: translateY(8px);
transition: opacity 150ms ease, transform 150ms ease;
}
.flatpickr-calendar.open {
opacity: 1;
transform: translateY(0);
}
Анимация не привязана к JavaScript-таймерам. Всё завязано на CSS transition end.
Навигация по месяцам в Flatpickr реализована через смену внутреннего состояния календаря.
При переходе:
Часто используется стратегия:
или
.dayContainer {
transition: transform 120ms ease, opacity 120ms ease;
}
При выборе даты в Flatpickr происходит обновление состояния активного элемента.
Типичный визуальный эффект:
.flatpickr-day.selected {
transition: background-color 120ms ease, border-color 120ms ease;
}
В режиме диапазона анимации становятся более заметными, так как изменяются сразу несколько состояний:
Flatpickr синхронно обновляет классы:
Это позволяет CSS плавно интерполировать фон:
.flatpickr-day.inRange {
transition: background-color 120ms ease;
}
Если включён time picker, Flatpickr применяет отдельные transition-эффекты для:
Основной принцип — минимальная анимация, чтобы избежать дерганий интерфейса:
.numInputWrapper input {
transition: color 100ms ease;
}
Хотя анимации в Flatpickr в основном CSS-ориентированные, поведение можно расширять через хуки:
Пример управления классами:
flatpickr("#input", {
onOpen: function(selectedDates, dateStr, instance) {
instance.calendarContainer.classList.add("custom-open");
},
onClose: function(selectedDates, dateStr, instance) {
instance.calendarContainer.classList.remove("custom-open");
}
});
Это позволяет добавлять:
При необходимости можно полностью переопределить визуальное поведение календаря Flatpickr через @keyframes:
@keyframes fpFadeIn {
from {
opacity: 0;
transform: translateY(10px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.flatpickr-calendar.open {
animation: fpFadeIn 180ms ease;
}
Важно учитывать, что при использовании animation вместо transition необходимо контролировать:
Flatpickr оптимизирован для лёгких UI-операций, поэтому анимации должны опираться на свойства:
Не рекомендуется использовать:
Правильный подход:
/* оптимально */
transform: translateY(0);
/* нежелательно */
top: 0;
На мобильных устройствах Flatpickr часто переключается в упрощённый режим отображения:
Это связано с тем, что touch-интерфейсы чувствительны к задержкам анимаций.
Для полного контроля анимаций можно комбинировать:
Пример гибридной схемы:
flatpickr("#input", {
animate: false,
onOpen: (d, s, i) => {
requestAnimationFrame(() => {
i.calendarContainer.classList.add("force-animate");
});
}
});
.force-animate {
transition: opacity 200ms ease, transform 200ms ease;
opacity: 1;
transform: translateY(0);
}