Генератор вкладок CSS

Далее

Вкладки используются повсеместно, в панелях настроек, на сайтах документации и в галереях продуктов. В стандартном HTML нет отдельного элемента вкладки, поэтому разработчики создают собственные. Этот генератор собирает простую панель вкладок на HTML + CSS: акцентный цвет активной вкладки, скругление углов кнопок и состояние при наведении. Вставьте разметку в свой проект и подключите переключение вкладок с помощью собственного JavaScript.

Как создать вкладки

  1. 1

    Выберите акцентный цвет

    Цвет фона и текста активной вкладки. Выберите цвет, подходящий вашему бренду.

  2. 2

    Задайте скругление углов

    Скругляет верхние углы кнопок вкладок. Большие значения дают более мягкий вид.

  3. 3

    Измените подписи

    Результат содержит три кнопки: «Overview», «Details» и «Settings». Переименуйте их под свой контент.

  4. 4

    Скопируйте код

    Разметка вкладок поставляется с собственным блоком <style>. Вставьте оба элемента в свою страницу.

  5. 5

    Добавьте переключение вкладок

    Генератор создает только визуальную часть. Подключите кнопки к своему JavaScript или UI-библиотеке, чтобы показывать и скрывать панели.

Правильная доступная разметка

<div class="tabs">
  <div role="tablist" aria-label="Product info">
    <button role="tab" id="tab-1" aria-selected="true"  aria-controls="panel-1" tabindex="0">Overview</button>
    <button role="tab" id="tab-2" aria-selected="false" aria-controls="panel-2" tabindex="-1">Specs</button>
    <button role="tab" id="tab-3" aria-selected="false" aria-controls="panel-3" tabindex="-1">Reviews</button>
  </div>
  <section role="tabpanel" id="panel-1" aria-labelledby="tab-1">...</section>
  <section role="tabpanel" id="panel-2" aria-labelledby="tab-2" hidden>...</section>
  <section role="tabpanel" id="panel-3" aria-labelledby="tab-3" hidden>...</section>
</div>

Ключевые атрибуты:

  • role="tablist" оборачивает кнопки.
  • role="tab" на каждой кнопке, вместе с aria-selected и aria-controls.
  • tabindex использует паттерн roving tabindex: только активная вкладка имеет 0, остальные, -1. Клавиши-стрелки перемещают фокус между ними.
  • role="tabpanel" на каждой панели, а aria-labelledby указывает на её вкладку.
  • hidden на неактивных панелях (а не только display: none, именно этот атрибут учитывают вспомогательные технологии).

Правила работы с клавиатурой

Клавиша Действие
Tab Вход в список вкладок / выход из него
ArrowLeft Предыдущая вкладка (циклически к последней)
ArrowRight Следующая вкладка (циклически к первой)
Home Первая вкладка
End Последняя вкладка
Enter / Space Активировать вкладку в фокусе (при ручной активации)

Автоматическая активация (переключение вкладок при изменении фокуса) против ручной (активация вкладки при нажатии клавиши Enter при изменении фокуса), WAI-ARIA поддерживает оба способа. Автоматический режим удобнее для пользователей с нормальным зрением; ручной, более подходящий в случаях, когда содержимое вкладок требует значительных ресурсов для отображения.

Подчеркнутый стиль

[role="tablist"] {
  display: flex;
  border-bottom: 1px solid #e5e7eb;
}
[role="tab"] {
  padding: 0.75rem 1rem;
  background: transparent;
  border: 0;
  color: #6b7280;
  position: relative;
  cursor: pointer;
}
[role="tab"][aria-selected="true"] {
  color: #111827;
}
[role="tab"][aria-selected="true"]::after {
  content: "";
  position: absolute;
  left: 1rem; right: 1rem; bottom: -1px;
  height: 2px;
  background: #2563eb;
}

Капсульный стиль

[role="tab"] {
  padding: 0.5rem 0.9rem;
  border-radius: 9999px;
  border: 0;
  background: transparent;
}
[role="tab"][aria-selected="true"] {
  background: #2563eb;
  color: #fff;
}

Видимый фокус

Всегда отображайте кольцо фокуса, когда фокус приходит с клавиатуры:

[role="tab"]:focus-visible {
  outline: 2px solid #60a5fa;
  outline-offset: 2px;
}

JavaScript

Приблизительно:

const tabs = document.querySelectorAll('[role="tab"]');
tabs.forEach(tab => {
  tab.addEventListener('click', () => activate(tab));
  tab.addEventListener('keydown', e => {
    const i = [...tabs].indexOf(tab);
    if (e.key === 'ArrowRight') tabs[(i + 1) % tabs.length].focus();
    if (e.key === 'ArrowLeft')  tabs[(i - 1 + tabs.length) % tabs.length].focus();
    if (e.key === 'Home') tabs[0].focus();
    if (e.key === 'End')  tabs[tabs.length - 1].focus();
  });
});

function activate(tab) {
  tabs.forEach(t => {
    const panel = document.getElementById(t.getAttribute('aria-controls'));
    const active = t === tab;
    t.setAttribute('aria-selected', active);
    t.setAttribute('tabindex', active ? '0' : '-1');
    panel.hidden = !active;
  });
  tab.focus();
}

Всего тридцать строк, без единой зависимости.

Вкладки против аккордеонов

На узких экранах ряды вкладок становятся тесными. Типичный приём: вкладки на десктопе, аккордеон на мобильных устройствах. Чтобы менять визуальное оформление без изменения ARIA-ролей, используйте контейнерный или медиазапрос.

Часто задаваемые вопросы

Для доступных вкладок, да. Без role="tablist" и role="tab" программы чтения с экрана воспринимают эти кнопки как обычные, и пользователи теряют привычную логику навигации по вкладкам. Альтернатива, простой аккордеон на <details> / <summary> со встроенной семантикой.

Автоматический режим (вкладка активируется при перемещении фокуса) подходит, когда содержимое каждой вкладки отображается легко. Ручной режим (фокус перемещается, а вкладка активируется по клавише Enter) лучше, когда переключение вкладок запускает тяжёлую работу, например, загрузку данных или отрисовку большой формы.

Для вкладок с содержимым (документация, вкладки о продукте), да: используйте хеш (например, #specs) или параметр запроса, чтобы ссылки вели на конкретную вкладку, а активная вкладка сохранялась при перезагрузке страницы. Для вкладок интерфейса (панели настроек) URL необязателен.

Только с помощью «хака» на чекбоксах/радиокнопках, у которого нет навигации стрелками и состояний ARIA. Для по-настоящему доступной реализации этот небольшой фрагмент JavaScript оправдан. Если нужны запасные варианты с серверным рендерингом, свяжите каждую вкладку с уникальным URL и отрисовывайте соответствующую панель на стороне сервера.

Сопутствующие инструменты

Справочная таблица ASCII

Полная таблица ASCII от 0 до 127 с десятичным, шестнадцатеричным, восьмеричным и двоичным представлением, а также записью числовых ссылок HTML, включая NUL, LF и DEL.

Справочник сочетаний клавиш

Ищите документированные сочетания по умолчанию для VS Code, Chrome и Bash с GNU Readline в macOS, Windows и Linux.

Справочник символов HTML

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

Счетчик FPS

Измерьте FPS браузера через requestAnimationFrame: сглаживание, минимальная и максимальная частота кадров, порог предупреждения и график по желанию. Работает локально, без загрузок и API.

Генератор случайных букв

Генерируйте случайные буквы A-Z. Выберите количество, верхний или нижний регистр либо смешанный вариант для игр, заданий и уроков.

Генератор цветовой палитры

Создавайте монохромные, аналоговые, комплементарные, триадные или тетрадные палитры из базового HEX-цвета и экспортируйте готовые CSS-переменные.

Инструмент доступен на других языках