Toastify — это лёгкая библиотека для создания уведомлений (toasts) в веб-приложениях на JavaScript. Она позволяет отображать кратковременные сообщения пользователю с минимальными усилиями, при этом обеспечивая гибкость в настройке позиции, стиля и поведения уведомлений.
В основе работы Toastify лежит динамическое создание HTML-элементов и управление их отображением через CSS-анимации. При этом важно понимать, как правильно использовать библиотеку, чтобы минимизировать перерисовки (reflows и repaints), что критично для производительности.
Каждое уведомление создаётся внутри контейнера:
Toastify({
text: "Пример уведомления",
duration: 3000,
gravity: "top",
position: "right",
}).showToast();
По умолчанию Toastify создаёт отдельный контейнер на
body, если его ещё нет. Для минимизации перерисовок
рекомендуется заранее создать единственный контейнер,
куда будут добавляться все уведомления, вместо того чтобы динамически
вставлять новый DOM-элемент каждый раз:
<div id="toast-container"></div>
Toastify({
text: "Уведомление в существующем контейнере",
node: document.getElementById('toast-container'),
duration: 3000
}).showToast();
Преимущества:
Если требуется показать несколько уведомлений одновременно, можно сначала подготовить их в DocumentFragment, а затем добавить в DOM:
const fragment = document.createDocumentFragment();
for (let i = 0; i < 5; i++) {
const toast = Toastify({
text: `Сообщение ${i + 1}`,
duration: 3000
}).node;
fragment.appendChild(toast);
}
document.getElementById('toast-container').appendChild(fragment);
Преимущество:
Toastify позволяет задавать стили через объект style или
через CSS-классы. Чтобы уменьшить перерисовки, лучше использовать
классы:
Toastify({
text: "Классическое уведомление",
className: "toast-success",
duration: 3000
}).showToast();
.toast-success {
background-color: #4caf50;
color: white;
padding: 12px 20px;
border-radius: 4px;
}
Почему это важно:
Для анимаций Toastify (появление, исчезновение) лучше использовать
свойства, которые обрабатываются GPU: transform и
opacity, вместо top, left,
height:
.toast-success {
transition: transform 0.3s ease, opacity 0.3s ease;
transform: translateY(-20px);
opacity: 0;
}
.toast-success.show {
transform: translateY(0);
opacity: 1;
}
Плюсы:
Создание новых DOM-элементов каждый раз — источник лишних перерисовок. Можно внедрить пул уведомлений:
const toastPool = [];
function getToast() {
return toastPool.length > 0 ? toastPool.pop() : Toastify({ duration: 3000 }).node;
}
function releaseToast(toast) {
toastPool.push(toast);
}
Преимущества пула:
appendChild или
removeChild.removeChild, можно использовать
display: none и повторно показывать элемент.const container = document.getElementById('toast-container');
const toastPool = [];
function showToast(message) {
let toast = toastPool.pop();
if (!toast) {
toast = document.createElement('div');
toast.className = 'toast';
container.appendChild(toast);
}
toast.textContent = message;
toast.classList.add('show');
setTimeout(() => {
toast.classList.remove('show');
toastPool.push(toast);
}, 3000);
}
Что реализовано:
Применение этих практик позволяет Toastify работать плавно даже при большом количестве уведомлений и минимизирует нагрузку на браузер, обеспечивая высокую производительность интерфейса.