Скрывать и отображать блоки с помощью SetInterval

<div class="notification__inner">
 <p hidden class="notification__item">1</p>
 <p hidden class="notification__item">2</p>
 <p hidden class="notification__item">3</p>
</div>

const notificationItem = document.querySelectorAll('.notification__item');

notificationItem.forEach(notification => {
  setInterval(() => {
    notification.hidden = false;
  }, 2000);
});

Нужно чтобы работала как плашка уведомлений на сайте. Одна отображается, потом скрывается и вместо нее отображается вторая и так далее... До тех пор пока пользователь не нажмет на крестик, чтобы все закрыть.

Задача простая, но спустя 2-3 часов поисков и мучений - ничего не нашла и не могу понять как сделать. В данном примере, хочу что-бы блоки notification__item отображались поочередно меняя друг друга


Ответы (1 шт):

Автор решения: eccs0103

Так?

Решение

const first = document.querySelector(`p.notification__item`); // Находим первое уведомление
if (first) { // если существует
  first.hidden = false; // показываем его
  setInterval(() => { // запускаем таймер
    const selected = document.querySelector(`p.notification__item:not([hidden])`); // Находим уведомление которое показывается в данный момент
    const next = document.querySelector(`p.notification__item:not([hidden]) + p.notification__item[hidden]`); // Находим следуюшее уведомление
    if (selected) selected.hidden = true; // Скрываем уведомление которое показывается в данный момент
    (next ?? first).hidden = false; // Показываем следующее уведомление, если существет, или первое в противном случае
  }, 2000);
}
<div class="notification__inner">
  <p hidden class="notification__item">У вас 10 непрочитанных сообщений</p>
  <p hidden class="notification__item">Пользователь "Альберт Эйнштейн" хочет добавить вас в друзья</p>
  <p hidden class="notification__item">Пожертвуйте церкви 1000р и получайте вип статус на нашем сайте</p>
</div>

Решение получше

Я бы не советовал информацию хранить в тегах и скрывать их. Будут проблемы с утечкой информации, а так же с оптимизацией. Вариант получше хранить уведомления в массиве и показать в одном теге.

const notifications = [ // Все уведомления
  `У вас 10 непрочитанных сообщений`,
  `Пользователь "Альберт Эйнштейн" хочет добавить вас в друзья`,
  `Пожертвуйте церкви 1000р и получайте вип статус на нашем сайте`,
];

const pNotifications = document.querySelector(`p#notifications`); // Блок для показа
if(notifications.length > 0) { // если количество уведомлений больше 0
  let index = 0; // Создаем переменную который показывает индекс уведомления который показывается в данный момент
  setInterval(() => { // запускаем таймер
    pNotifications.innerText = notifications[index]; // В блоке стаим тект уведомления который должен показываться
    index = (index == notifications.length - 1 ? 0 : index + 1); // Увеличиваем индекс, если не в конце, или обнуляем в противном случае
  }, 2000);
}
<p id="notifications"></p>

→ Ссылка