Библиотека Noty не реализует анимации самостоятельно — она делегирует их CSS. Это означает, что вся логика появления и скрытия уведомлений строится на добавлении и удалении CSS-классов. Такой подход даёт полный контроль над визуальным поведением уведомлений.
В конфигурации Noty используются два ключевых параметра:
Дополнительно:
animation-durationЛюбая кастомная анимация строится на основе
@keyframes:
@keyframes fadeInCustom {
from {
opacity: 0;
transform: translateY(-20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
@keyframes fadeOutCustom {
from {
opacity: 1;
transform: translateY(0);
}
to {
opacity: 0;
transform: translateY(-20px);
}
}
Классы, которые будут использоваться Noty:
.noty-animation-open {
animation: fadeInCustom 0.5s ease forwards;
}
.noty-animation-close {
animation: fadeOutCustom 0.4s ease forwards;
}
Конфигурация уведомления:
new Noty({
text: 'Уведомление с кастомной анимацией',
animation: {
open: 'noty-animation-open',
close: 'noty-animation-close'
}
}).show();
Важно:
Можно комбинировать эффекты:
animation: {
open: 'animated fadeInDown faster',
close: 'animated fadeOutUp faster'
}
В этом случае Noty просто добавляет строку классов в DOM-элемент.
Альтернативный подход — использовать transition вместо
@keyframes.
.noty-transition {
opacity: 0;
transform: scale(0.9);
transition: all 0.3s ease;
}
.noty-transition.noty-open {
opacity: 1;
transform: scale(1);
}
.noty-transition.noty-close {
opacity: 0;
transform: scale(0.9);
}
Тогда потребуется вручную управлять состояниями через дополнительные классы или использовать встроенные хуки Noty.
Noty предоставляет события жизненного цикла:
onShowonCloseafterShowafterCloseПример:
new Noty({
text: 'Анимация через JS',
callbacks: {
onShow: function() {
this.barDom.classList.add('custom-enter');
},
onClose: function() {
this.barDom.classList.add('custom-exit');
}
}
}).show();
CSS:
.custom-enter {
animation: slideIn 0.4s ease forwards;
}
.custom-exit {
animation: slideOut 0.4s ease forwards;
}
Позиция влияет на направление анимации:
top → логично анимировать сверху внизbottom → снизу вверхleft/right → горизонтальные движенияПример универсальной анимации:
@keyframes slideInTop {
from {
transform: translateY(-100%);
}
to {
transform: translateY(0);
}
}
@keyframes slideInBottom {
from {
transform: translateY(100%);
}
to {
transform: translateY(0);
}
}
Использование:
new Noty({
layout: 'topRight',
animation: {
open: 'slide-in-top',
close: 'fade-out'
}
});
Для плавности рекомендуется использовать:
transform вместо top/leftopacity для появленияПлохо:
top: -100px;
Хорошо:
transform: translateY(-100px);
Это активирует GPU и делает анимацию более плавной.
Можно объединять несколько трансформаций:
@keyframes complexIn {
0% {
opacity: 0;
transform: scale(0.8) rotate(-5deg);
}
100% {
opacity: 1;
transform: scale(1) rotate(0);
}
}
Точная настройка плавности:
animation: fadeInCustom 0.5s cubic-bezier(0.68, -0.55, 0.27, 1.55);
Популярные варианты:
ease-in-out — стандартcubic-bezier(0.25, 1, 0.5, 1) — плавное ускорениеcubic-bezier(0.68, -0.55, 0.27, 1.55) — эффект
“пружины”Добавление задержки:
animation: fadeInCustom 0.5s ease 0.2s forwards;
Это полезно при:
Ключевые рекомендации:
width, height,
marginwill-change только при необходимости.noty-animation-open {
will-change: transform, opacity;
}
box-shadow) во время
анимацииМожно использовать готовые библиотеки:
animation: {
open: 'animate__animated animate__fadeInDown',
close: 'animate__animated animate__fadeOutUp'
}
Важно:
Разные типы можно визуально разделять:
.noty_type__success {
animation: successPop 0.4s ease;
}
.noty_type__error {
animation: errorShake 0.5s ease;
}
Пример shake-анимации:
@keyframes errorShake {
0%, 100% { transform: translateX(0); }
25% { transform: translateX(-5px); }
75% { transform: translateX(5px); }
}
Важно синхронизировать:
timeout уведомленияЕсли анимация закрытия длится 500ms:
timeout: 3000
Noty автоматически учитывает закрытие, но при сложных сценариях возможны задержки.
Полезные приёмы:
animation-durationoutline для проверки позицииforwards в animation → элемент возвращается
в исходное состояниеОрганизация:
/* Базовые */
.noty-anim-fade-in {}
.noty-anim-fade-out {}
/* Направления */
.noty-anim-slide-top {}
.noty-anim-slide-bottom {}
/* Типы */
.noty-anim-success {}
.noty-anim-error {}
Комбинирование:
animation: {
open: 'noty-anim-fade-in noty-anim-slide-top',
close: 'noty-anim-fade-out'
}
Такой подход масштабируется и упрощает поддержку проекта.