Табы на JS. Модуль для верстальщика.

Arrow Up

Блог

Табы js

Табы на JS. Модуль для верстальщика.

Табы — это один из популярных элементов интерфейса, который позволяет организовать контент на веб-странице. Данный элемент делает контент более удобным для восприятия. Табы помогают пользователям переключаться между различными секциями информации, не перегружая экран лишними данными. В этой статье мы рассмотрим, как создать табы с использованием HTML и JavaScript, а также немного истории и применения табов в веб-дизайне.

Немного истории

Концепция табов восходит к интерфейсам, используемым в настольных приложениях. Первые табы появились в 1980-х годах, когда разработчики начали использовать их для организации информации в пределах одного окна. Однако их широкое применение в веб-разработке началось только в конце 1990-х годов, с появлением технологий HTML и JavaScript.

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

С тех пор табы стали стандартом в веб-дизайне, особенно с распространением AJAX и динамического контента, который позволил обновлять содержимое без перезагрузки страницы.

Табы имеют ряд достоинств, которые делают их популярным выбором для веб-разработчиков

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

  • Позволяют разместить большое количество информации на небольшом пространстве, что делает их идеальными для веб-страниц с ограниченным пространством.

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

  • Могут быть оформлены в различных стилях и цветах, что делает их визуально привлекательными и улучшает общий вид веб-страницы.

Существует несколько типов табов, которые могут быть использованы на веб-страницах

  • Горизонтальные — наиболее распространенный тип, который размещается в верхней части страницы и содержит несколько вкладок.

  • Вертикальные — размещаются на боковой панели страницы и содержат несколько вкладок.

  • Динамические табы могут быть созданы с помощью JavaScript и позволяет пользователю создавать новые вкладки или удалять существующие.

  • Адаптивные табы адаптируются к размеру экрана, чем обеспечивают правильное отображение на мобильных устройствах.

Пишем код:

Сначала создаем разметку для наших табов, в которой кнопки никак не привязаны к вкладками. Делаем это для того, чтобы можно было разносить вкладки, как угодно, согласно любого дизайн-макета. Это может быть необходимым, когда используется перемещение блоков при адаптиве.

    <!-- Навигация по вкладкам -->

    <div class="tabs-nav">
      <button data-tab="tab_1">Вкладка 1</button>
      <button data-tab="tab_2">Вкладка 2</button>
      <button data-tab="tab_3">Вкладка 3</button>
    </div>


    <!-- Вкладки -->

    <div class="tabs-panel" data-panel="tab_1">
      <p>Содержимое вкладки 1.</p>
    </div>

    <div class="tabs-panel" data-panel="tab_2">
      <p>Содержимое вкладки 2.</p>
      <p>Содержимое вкладки 2.</p>
    </div>

    <div class="tabs-panel" data-panel="tab_3">
      <p>Содержимое вкладки 3.</p>
      <p>Содержимое вкладки 3.</p>
      <p>Содержимое вкладки 3.</p>
    </div>

В CSS мы используем класс is-active, для управления активным табом и содержимым в текущий  момент. Управление происходит посредством JavaScript. 

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

/* Скрываем все вкладки по умолчанию */
.tabs-panel {
  display: none; 
}
/* Показываем активную вкладку */
.tabs-panel.is-active {
  display: block; 
  animation: fadeIn 0.5s ease-in-out; /* Анимация появления */
}
/* Кнопка */
.tabs-nav button{
  cursor: pointer;
  transition: all 0.5s ease-in-out;
}
/* Активная кнопка */
.tabs-nav button.is-active{
  background-color: grey;
  color: white;
}
/* Анимация */
@keyframes fadeIn {
  from {
    opacity: 0;
  }
  to {
    opacity: 1;
  }
}

В JavaScript мы описываем функцию в виде класса. Используя данный класс, при создании нового экземпляра, вы можете задать атрибуты с которыми собираетесь работать. По умолчанию для кнопок установлен атрибут [data-tab], а для содержимого [data-panel]. Также при при создании экземпляра, вы можете установить индекс открытой вкладки. По умолчанию активной будет вкладка с нулевым индексом.

class Tabs {
    constructor(options = {}) {
      // Дефолтная конфигурация
      const defaultConfig = {
        button: "data-tab",
        panel: "data-panel",
        index: 0,
      };
  
      this.options = Object.assign(defaultConfig, options);
  
      this.buttons = document.querySelectorAll(`[${this.options.button}]`);
      this.panels = document.querySelectorAll(`[${this.options.panel}]`);
      this.listener();
    }
    // Отслеживание нажатий на кнопки
    listener() {
      this.showTab(this.searchId(this.options.index));
      this.buttons.forEach((btn) => {
        btn.addEventListener("click", (e) => this.tabsChanger(e));
      });
    }
    // Находим Id для вкладки
    searchId(index) {
      const PL = this.panels.length;
      if (index <= PL - 1) {
        return this.panels[index].getAttribute(`${this.options.panel}`);
      } else {
        return this.panels[0].getAttribute(`${this.options.panel}`);
      }
    }
    // Находим вкладку которую нужно показать
    tabsChanger(e) {
      const tabId = e.currentTarget.getAttribute(`${this.options.button}`);
      this.showTab(tabId);
    }
    showTab(tabId) {
      // 1. Деактивируем все кнопки
      this.buttons.forEach((button) => button.classList.remove("is-active"));
  
      // 2. Скрываем все вкладки
      this.panels.forEach((panel) => panel.classList.remove("is-active"));
  
      // 3. Активируем нужную кнопку
      this.buttons.forEach((btn) => {
        if (btn.getAttribute(`${this.options.button}`) == tabId) {
          btn.classList.add("is-active");
        }
      });
      // 4. Показываем нужную вкладку
      this.panels.forEach((panel) => {
        if (panel.getAttribute(`${this.options.panel}`) == tabId) {
          panel.classList.add("is-active");
        }
      });
    }
  }

Для использования данной функции используйте следующий код:

window.addEventListener("DOMContentLoaded", function () {
  const tabInPage = document.querySelector("[data-tab]");
  tabInPage && new Tabs({
      button: "data-tab",
      panel: "data-panel",
      index: 0,
    });
});

Ссылки:

Пример кода вы можете скачать с нашего репозитория на GitHub: https://github.com/Webpolka/Tabs

Перейти на странцу с примером https://webpolka.github.io/Tabs/

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

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