← Назад в «Блог»
3 649

Делаем всплывающую панель на javascript

В это статье мы создадим всплывающую панель на javascript. Для хранения состояния будет использовать localStorage.

Сначала покажу, как работает:

Делаем всплывающую панель на javascript 1
Код для версии с анимацией в конце статьи, анимацю пока не объявнил.

Весь код для копирования в конце статьи.

Ссылка на codepen

Зачем нам что-то хранить? Пару дней назад на моем сайте происходил редизайн. Я хотел уведомить пользователя о том, чтобы он не пугался поехавшей верстки и просто очистил кеш нажатием ctrl+f5.

А если пользователь зайдет 10 раз? Каждый раз показывать ему это, зачем? Он уже знает. Для этого мы будем записывать в хранилище то, что пользователь уже просмотрел наше сообщение. В следующий раз оно уже не будет показываться.

html

Первым делом — html. Мы создаем фиксированную панель внизу экрана с текстом и кнопками. Так же добавляем класс для скрытия панели.

<div class="notification js-notification hidden">
  <div class="container">
     <div class="notification-text">
	 Мы используем куки-файлы. Продолжая использовать наш сайт, вы соглашаетесь с этим.
     </div>
     <button class="notification-btn js-notification-btn">OK</button>
  </div> 
</div>

.js-notification мы добавляем для того, чтобы не использовать для javascript те классы, на которых висит оформление. Мы можем забыть об этом и поменять классы — интерактив сломается. Видя приставку js-, мы не будем менять класс зная, что на нем функционал в js.

.hidden мы добавили сразу же. Дело в том, что пока мы не поняли, смотрел он уже наше сообщение или нет, панель должна быть скрыта, чтобы она не показывалось в самом начале, пока javascript просматривает хранилище. Панель покажется быстрее, чем сообразит javascript.

css

.container {
    max-width: 1170px;
    width: 100%;
    margin: 0 auto;
    padding: 0 25px;
    box-sizing: border-box;
}
.notification .container {
    display: flex;
    align-items: center;
    justify-content: space-between;
}
.notification {
    position: fixed;
    bottom: 15px;
    right: 15px;
    z-index: 200;
    background-color: #000;
    color: #fff;
    width: 100%;
    max-width: 600px;  
    border-radius: 16px;
    padding: 0 20px;  
}
.notification.hidden {
    display: none; 
}
.notification-text {
    max-width: 70%;
}
.notification-btn {
    padding: 10px 15px; 
    border: none;
    border-radius: 3px;
    color: #fff;
    cursor: pointer;
    background-color: transparent;
    font-size: 50px;
    margin-left: auto;
}

По css ничего сложного. Думаю многие поймут и справятся. Если будут вопросы — пишите в комментариях или в личку.

javascript

Часто, чтобы написать какой-то код, нужно проговорить его вслух:


«Пользователь заходит на сайт, проверить есть ли в хранилище запись, если ее там нет — добавить класс с панели, если она там есть, ничего не делать. При клике на кнопку, добавлять запись в хранилище и добавлять класс, скрывающий панель.»

Вот и готовая схема кода. Мой руководитель, занимаясь с ученицей, писал на листке такие конструкции:

Если (записи в хранилище нет) {
  удалить класс у блока
}

клик по кнопке ({
  добавить запись в хранилище
  добавить класс, скрывающий панель
})

Когда сложная ситуация, помогает разобраться.

Я немного отвлекся, приступим к js:

// Переменные для панели и кнопки
var panel = document.querySelector('.js-notification'),
    panelButton = panel.querySelector('.btn');

Заметьте, переменная panelButton написана по-другому. Она начинается не с document, а с panel (первая переменная), это означает я ищу этот элемент не во всем документе, а только в панели. То есть буду искать ее среди потомков элемента с классом «.js-notification».

Напишем проверку хранилища. Я буду хранить наше сообщение под именем «cookie-message»:

именем «cookie-message»:

if (localStorage['cookie-message'] == undefined) {
  panel.classList.remove('hidden');
}

Если в хранилище нет записи — добавляем класс hidden

И последнее — клик по кнопке:

panelButton.addEventListener('click', function() {
  localStorage['cookie-message'] = true;
  panel.classList.add('hidden');
});

Добавляем событие клика. После клика записываем значение «cookie-message» в хранилище на true и добавляем панели класс, который ее скроет.

Мы установили true, в итоге в следующее посещение проверка на undefined в предыдущем блоке даст false и удаление скрывающего класса не сработает.

Все вместе:

var panel = document.querySelector('.js-notification'),
    panelButton = panel.querySelector('.btn');

   if (localStorage['cookie-message'] == undefined) {
    panel.classList.remove('hidden');
   }
   
   panelButton.addEventListener('click', function() {
      localStorage['cookie-message'] = true;
      panel.classList.add('hidden');
   });

Итоговый код

В итоговый код я добавил строки анимации появления/скрытия. Я объясню их в статье позже.

html

<div class="notification js-notification hidden">
  <div class="container">
     <div class="notification-text">
	 Мы используем куки-файлы. Продолжая использовать наш сайт, вы соглашаетесь с этим.
     </div>
     <button class="notification-btn js-notification-btn">OK</button>
  </div> 
</div>

css

.container {
    max-width: 1170px;
    width: 100%;
    margin: 0 auto;
    padding: 0 25px;
    box-sizing: border-box;
}
.notification .container {
    display: flex;
    align-items: center;
    justify-content: space-between;
}
.notification {
    position: fixed;
    bottom: 30px;
    right: 0;
    z-index: 200;
    background-color: #000;
    color: #fff;
    width: 100%;
    max-width: 600px;  
    border-radius: 16px;
    padding: 0 20px;  
    transition: .3s all;
    opacity: 1;
    transform: translateY(0)    
}
.notification.hidden {
    opacity: 0;
    z-index: -1;
    transform: translateY(25px)
}
.notification-text {
    max-width: 70%;
}
.notification-btn {
    padding: 10px 15px; 
    border: none;
    border-radius: 3px;
    color: #fff;
    cursor: pointer;
    background-color: transparent;
    font-size: 50px;
    margin-left: auto;
}

Javascript

document.addEventListener('DOMContentLoaded', function() {
    var panel = document.querySelector('.js-notification'),
        panelButton = panel.querySelector('.js-notification-btn');

    if (localStorage['cookie-message'] == undefined) {
        setTimeout(function(){
            panel.classList.remove('hidden');
        },2000)
    }

    panelButton.addEventListener('click', function() {
        localStorage['cookie-message'] = true;
        panel.classList.add('hidden');
    });    
})
Полезно
11
1
Непонятно
6
Поделиться
Отправить
Линкануть
Вотсапнуть

Канал о фрилансе

Там я делюсь фишками о фрилансе: деньги, клиенты, автоматизация, фриланс. Раньше это был закрытый материал с платным доступом. Сейчас он открыт. Иногда подписчикам будет открываться платные материалы.

Подписаться
← Назад в «Блог»

2 комментария

Спасибо за код! 🙂

P.s.: у Вас плавающий блок с переключалкой языков сильно наезжает на шапку.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *