Callout-анимации применяются для визуального выделения интерфейсных элементов: уведомлений, всплывающих подсказок, ошибок форм, подсветки новых функций, акцентов на изменениях состояния. Основная цель — направить внимание на конкретную область экрана без разрушения контекста текущего интерфейса.
В контексте JavaScript-анимаций Velocity.js используется как высокопроизводительный слой над DOM-манипуляциями и CSS-трансформациями, обеспечивая предсказуемую работу анимаций даже при высокой частоте обновлений состояния.
Callout обычно состоит из трёх логических частей:
<div class="callout" id="callout-1">
<div class="callout-content">
Новое сообщение
</div>
</div>
Базовое состояние элемента чаще всего задаётся через CSS:
.callout {
opacity: 0;
transform: translateY(10px) scale(0.98);
pointer-events: none;
}
.callout.is-active {
pointer-events: auto;
}
Callout-анимации почти всегда включают комбинацию:
Velocity.js заменяет классическую работу с transition на
управляемую последовательность анимаций.
Velocity(document.getElementById("callout-1"), {
opacity: 1,
translateY: 0,
scale: 1
}, {
duration: 220,
easing: "easeOutQuad"
});
Ключевая особенность подхода — объединение нескольких свойств в одну атомарную анимацию без рассинхронизации.
Скрытие строится на обратной анимации с уменьшением визуального веса элемента:
Velocity(document.getElementById("callout-1"), {
opacity: 0,
translateY: 10,
scale: 0.98
}, {
duration: 180,
easing: "easeInQuad"
});
После завершения анимации часто выполняется деактивация элемента:
Velocity(document.getElementById("callout-1"), "finish");
document.getElementById("callout-1").classList.remove("is-active");
Callout-анимации часто работают не изолированно, а в цепочке:
Velocity.js поддерживает очереди (queue), что позволяет выстраивать сложные сценарии без callback-хаоса.
const el = document.getElementById("callout-1");
Velocity(el, { opacity: 1, translateY: 0 }, { duration: 200 })
.then(() => Velocity(el, { scale: 1.05 }, { duration: 120 }))
.then(() => Velocity(el, { scale: 1 }, { duration: 120 }))
.then(() => Velocity(el, { opacity: 0 }, { duration: 200 }));
Такой подход используется для создания эффекта «привлечения внимания», когда элемент не просто появляется, а живёт короткий анимационный цикл.
Callout часто привязывается к целевому элементу интерфейса (кнопке, полю ввода, карточке).
const target = document.querySelector(".btn-save");
const callout = document.getElementById("callout-1");
const rect = target.getBoundingClientRect();
callout.style.top = `${rect.top - 40}px`;
callout.style.left = `${rect.left}px`;
После позиционирования запускается анимация появления.
Ключевой момент — анимация не должна конфликтовать с изменением layout, поэтому рекомендуется:
Callout часто используется как индикатор важности. Для этого применяется повторяющаяся анимация:
Velocity(document.getElementById("callout-1"), {
scale: 1.08
}, {
duration: 300,
loop: 2,
easing: "easeInOutSine"
});
Или более мягкий вариант через чередование состояний:
Velocity(document.getElementById("callout-1"), "callout-pulse", {
duration: 400,
loop: true
});
Такая модель применяется для уведомлений без обязательного взаимодействия.
В реальных интерфейсах callout-анимации завязаны на состояние:
Пример реализации через простую машину состояний:
const callout = document.getElementById("callout-1");
function showCallout() {
Velocity(callout, { opacity: 1, translateY: 0 }, { duration: 200 });
}
function hideCallout() {
Velocity(callout, { opacity: 0, translateY: 10 }, { duration: 180 });
}
Velocity.js не исключает использование CSS, но при callout-анимациях важно разграничение ответственности:
Корректный паттерн:
.callout {
transform-origin: top center;
}
Velocity(callout, {
opacity: 1,
scale: 1
}, { duration: 200 });
Callout-анимации часто появляются в массовом количестве (например, система уведомлений). В этом случае критичны следующие принципы:
Velocity.js уже оптимизирует работу через requestAnimationFrame, но архитектурные ошибки могут свести это на нет.
1. Tooltip-callout
Короткое появление при hover или focus:
Velocity(callout, "fadeIn", { duration: 120 });
2. Notification-callout
Автоматическое исчезновение:
Velocity(callout, { opacity: 1 }, { duration: 150 })
.then(() => Velocity(callout, { opacity: 0 }, { delay: 2000 }));
3. Error-callout
Резкий вход с акцентом:
Velocity(callout, {
opacity: 1,
translateX: [-10, 0]
}, {
duration: 180,
easing: "easeOutBounce"
});
4. Highlight-callout
Подсветка элемента без изменения позиции:
Velocity(callout, {
boxShadowBlur: 20
}, { duration: 250 });
Callout-анимации часто привязываются к:
Пример:
form.addEventListener("submit", () => {
Velocity(callout, { opacity: 1 }, { duration: 150 });
});
В таких сценариях важна минимальная задержка между событием и визуальной реакцией, иначе эффект теряет информативность.