⚙️
Front-end patterns
  • Введение
  • Шаблоны
    • Эффекты CSS
      • Overlay
      • Анимация display:none
      • Текст
        • Фон текста градиент с анимацией
      • Элементы формы
        • Вертикальное выравнивание placeholder по вертикали
      • Ссылки
        • Градиент как основной цвет
        • Линия под ссылкой ездит слева направо при наведении
      • Скрывать блок .clipped
    • Модальное окно
      • Dialog
    • Элементы формы
      • Select
      • Radio
      • CheckBox
      • Ввод текста (input)
        • Телефон (tel)
        • Почта (email)
      • Кнопка
    • Вкладки/Списки
      • Вкладки или Табы (tabs)
      • Аккордеон (Accordion)
    • Навигация
      • Основная и дополнительная навигация на сайте
        • Анимирование основной навигации
      • Пропустить навигацию
      • Хлебные крошки (Breadcrumbs)
      • Кнопка основной навигации (Бургер)
    • Структуры
      • Контейнер
      • Столбцы
      • Прогресс
      • Горизонтальная прокрутка карточек
      • Цитата
    • Тэги (семантика)
      • Текст
      • Логика
    • Увеличить скорость загрузки страницы
    • Шрифты
  • JS
    • Прокрутка страницы
    • Анимация элементов
  • A11Y
    • Фокус с клавиатуры
    • No sort
  • WordPress
    • Решения и подсказки
    • Плагины
    • Натягиваем сайт
      • Пустая тема
      • Делаем главную (пустую) страницу
      • Подключаем стили и js
      • Заменяем содержимое файлов (header, footer, page)
    • Свой плагин
      • Шаблон
      • Административная часть
      • Пользовательская часть
      • Локализация плагина
  • Ghost
    • Создание своей темы
      • Фалы шаблона
        • Partials
          • footer.hbs
          • header.hbs
          • post_card.hbs
        • index.hbs
        • default.hbs
        • post.hbs
      • Переменные
      • Циклы, условия и функции
  • Visual Studio
  • Gulp
    • Deploy on GitHub
    • Плагин
    • Моя сборка
      • Изображения
  • Регулярные выражения
  • Алгоритмы
    • Поиск
    • Сортировка
    • Поиск в ширину (глубину)
    • Типы данных
  • Конструкторы сайтов
Powered by GitBook
On this page
  • Описание
  • Код
  • Дополнительные параметры

Was this helpful?

  1. JS

Анимация элементов

Анимация (появление) элементов при прокручивании страницы на чистом JS. Данный плагин разрабатывается собственными силами. danila.korotkov@gmail.com для предложений или замечаний.

Статья в разработке

Описание

В случае, если на экране, в один момент времени, элементов не больше одного, то они будут появляться один за другим (по ходу появления) без задержки. Если элементов больше чем один, то они будут появляться с задержкой (устанавливается в код js, параметр timer).

Если есть необходимость изменить порядок появления, например сделать чтобы два элемента появлялись одновременно, то пользуйтесь параметром - "data-inviewport-id". (см. Дополнительные параметры).

Здесь будет наглядный пример

Код

Код (позже будет добавлен в виде отдельных файлов):

Для работы необходимо добавить к элементу страницы минимальный код:
 <div class="container" data-inviewport="scale-in">
 
   const inViewport = (entries, observer) => {
      let i = 0;
      entries.forEach(entry => {
         let timer = 0.3 // Стандартное время задержки при появлении нескольких элементов одновременно
         
         if (entry.target.getAttribute('data-inviewport-once')) var once = entry.target.getAttribute('data-inviewport-once');
         if (entry.target.getAttribute('data-inviewport-timer')) timer = entry.target.getAttribute('data-inviewport-timer');

         if (entries.length > 1) { // На экране больше чем один элемент
            let turn;
            
            if (entry.target.getAttribute('data-inviewport-id')) turn = entry.target.getAttribute('data-inviewport-id'); // Задан ли номер для выполнения
            else {
               turn = i;
               i++;
            } 

            let time = timer * 1000 * turn;
            if (once) { // Требуется ли повторение
               if (entry.isIntersecting) setTimeout(()=> entry.target.classList.add("is-inViewport"), time);
            }  
            else setTimeout(()=> entry.target.classList.toggle("is-inViewport", entry.isIntersecting), time);
         }
         else { // Таймер срабатывания не задан
            if (once) { // Требуется ли повторение
               if (entry.isIntersecting) entry.target.classList.add("is-inViewport");
            }  
            else entry.target.classList.toggle("is-inViewport", entry.isIntersecting);
         } 
      });
   };

   const Obs = new IntersectionObserver(inViewport);
   const obsOptions = {}; //See: https ://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API#Intersection_observer_options

      // Attach observer to every [data-inviewport] element:
   const ELs_inViewport = document.querySelectorAll('[data-inviewport]');
      ELs_inViewport.forEach(EL => {
      Obs.observe(EL, obsOptions);
   });
[data-inviewport="scale-in"] {
   transform: translateX(20px);
}
[data-inviewport="scale-in"].is-inViewport {
   transform: translateX(0px);
   transition: transform 1s;
}

[data-inviewport="flash"] {
   opacity: 0;
}
[data-inviewport="flash"].is-inViewport {
   opacity: 100%;
   transition: opacity 1s;
}

Дополнительные параметры

Параметр

Значение

data-inviewport="flash"

Тип анимации (обязательный).

data-inviewport-once="true"

Требуется ли повторять анимацию каждый раз, когда элемент появляется на странице.

data-inviewport-timer="0.5"

Время задержки в секундах перед началом анимации. Работает задержка при условии, что анимированных элементов на экрана в момент вызова(показа) больше одного.

data-inviewport-id="1"

Номер под которым будет срабатывать анимация (если не указывать, то этот номер будет порядковым). Начинается отчет с элемента с номером - 0!

PreviousПрокрутка страницыNextA11Y

Last updated 4 years ago

Was this helpful?