Пишем плагин переключения статей на мобильном

2022-Oct-28

Сегодня мы делаем интересную функцию. Материалы статьи – на экранах больших определенного размера показывается полностью. Но если экран меньше размера, то показывается только часть статьи (section) и появляются кнопки переключения – вправо, влево. При нажатии на эти кнопки листается статья по частям.

Начнем с разметки. Вот так мы делаем html. Листать мы будем section. Внутри section может быть все что угодно.

<article>
  <header>
    <h1>Скорпион</h1>
  </header>
  <img src="" alt="">
  <section class="">
    <h2>Описание</h2>
    <p></p>
  </section>
  <section class="hide-section">
    <h2>Биография Ханзо
    Хасаши</h2>
    <p></p>
  </section>
  <section class="hide-section">
    <h2>Причина вражды
    между Скорпионом и
    Куан Чи</h2>
    <p></p>
  </section>
  <footer class="button-footer">
  <button class="left">Left</button>
  <button class="right">Right</button>
</footer>
</article>

Теперь с помощью CSS, скроем footer, и подготовим класс для скрытия section.

.button-footer {
  display: none;
}

button {
  font-size: 40px;
  padding: 20px;
}

@media screen and (max-width: 800px) {
  .button-footer {
    display: block;
  }
  .hide-section {
    display: none;
  }
}

Приступим к JavaScript. На кнопки вешаем функции. И создаем дополнительные переменные – hash, section.

document.querySelector('.left').addEventListener('click', articleLeft);
document.querySelector('.right').addEventListener('click', articleRight);

let section = document.querySelectorAll('article section');
let sectionCount = section.length; // !!!
let hash = 0; // //#
if (window.location.hash) {
  hash = window.location.hash; //#2
  hash = +hash.replace('#', '');
  showSection();
}

При загрузке страницы – проверяем наличие hash. И запускаем функцию showSection.

Функция делает следующее – скрывает все section, кроме той, которая активна. Активную section нам указывает hash.

function articleLeft() {
  if (hash - 1 >= 0) {
    hash--;
  }
  else {
    hash = sectionCount - 1;
  }
  window.location.hash = hash;
  showSection();
}

function articleRight() {
  if (hash + 1 < sectionCount) {
    hash++;
  }
  else {
    hash = 0;
  }
  window.location.hash = hash;
  showSection();
}

function showSection() {
  section.forEach(elem => {
    elem.classList.add('hide-section');
  });
  section[hash].classList.remove('hide-section');
}

Осталось дописать функции переключения влево, вправо. Здесь основная сложность – следить за тем, чтобы правильно увеличивать или уменьшать hash. После этого – запускаем функцию showSection.

See the Pen Плагин для статьи сайта by Alex (@Asmodey) on CodePen.

Статьи

Кнопка "Показать пароль" на JavaScript + анимация
Задача собеседования: получаем email из строки
Cуммируем данныe в таблицах с помощью JavaScript