VGDropdown

Выпадающий список

Основы

Структура Dropdown, открытие по клику и доступное состояние.

Что делает VGDropdown

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

Умное размещение

Режим auto меняет сторону, если меню не помещается.

Клавиатура

Стрелки открывают меню, Escape закрывает и возвращает фокус.

Единичное состояние

При открытии следующего Dropdown предыдущий закрывается.

Базовое меню

Кнопка и панель находятся внутри .vg-dropdown. Если data-vg-target не указан, используется ближайшая .vg-dropdown-content.

Рабочее пространство Быстрые действия проекта

Откройте меню и кликните за его пределами, чтобы закрыть.

Поведение

Автоматическое размещение, hover-режим и загрузка содержимого.

Размещение

Для большинства интерфейсов используйте auto. Явную сторону задавайте только там, где компоновка заранее известна.

Начало кнопки

Меню выровнено по левому краю триггера.

Конец кнопки

Меню выровнено по правому краю триггера.

Свободная сторона

VGDropdown выбирает позицию с минимальным переполнением.

Фактическая сторона записывается в data-vg-placement на панели Dropdown.

Открытие по наведению

data-hover включает hover на устройствах с мышью. На мобильном устройстве Dropdown продолжает работать по клику.

Desktop + mobile Наведите или нажмите

Клик остаётся запасным способом управления.

АИ
Алексей ИвановАдминистратор проекта

AJAX-контент

Запрос выполняется при первом открытии. data-ajax-once сохраняет результат для следующих открытий.

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

Содержимое не входит в исходный HTML страницы.

Ожидание запроса…

Код для проекта

Готовая разметка, ручное API, CSS-переменные и справочник событий.

HTML и Data API

Стандартный Dropdown не требует пользовательского JavaScript. Панель можно связать явно через data-vg-target или расположить рядом с кнопкой внутри .vg-dropdown.

HTML
<div class="vg-dropdown">
  <button
    type="button"
    data-vg-toggle="dropdown"
    data-placement="auto"
    aria-expanded="false"
  >
    Действия
  </button>

  <div class="vg-dropdown-content">
    <div class="vg-dropdown-container account-menu">
      <a href="/profile">Профиль</a>
      <a href="/logout">Выйти</a>
    </div>
  </div>
</div>

JavaScript API

Используйте VGDropdown.init(), если параметры или момент инициализации определяет приложение. Метод также подключает click, hover и клавиатурные обработчики.

JAVASCRIPT
import {VGDropdown} from 'vgapp';

const toggle = document.querySelector('[data-account-menu]');
const dropdown = VGDropdown.init(toggle, {
  placement: 'auto',
  hover: false,
});

dropdown.show();
dropdown.hide();
dropdown.toggle();

toggle.parentElement
  .querySelector('.vg-dropdown-content')
  .addEventListener('vg.dropdown.shown', () => {
    console.log('Меню открыто');
  });

dropdown.dispose();

CSS-настройка

Размер и оформление панели меняются публичными CSS-переменными. Состояния show, fade и open управляются самим модулем.

CSS
.account-dropdown {
  --vg-dropdown-min-width: 14rem;
  --vg-dropdown-bg-color: var(--vg-surface-bg);
  --vg-dropdown-color: var(--vg-text-primary);
  --vg-dropdown-border-color: var(--vg-border-default);
  --vg-dropdown-border-radius: var(--vg-radius-lg);
  --vg-dropdown-box-shadow: var(--vg-shadow-md);
}

.account-dropdown .account-menu {
  display: grid;
  padding: .5rem;
  gap: .25rem;
}

.account-dropdown .account-menu a {
  padding: .5rem .75rem;
  border-radius: var(--vg-radius-md);
}

Параметры и события

Вложенные настройки Data API записываются через дефис: animation.fade становится data-animation-fade, ajax.once — data-ajax-once.

Основные параметры

placementauto
auto или top/bottom/left/right с -start/-end.
hoverfalse
Открытие по наведению на десктопе.
animation.fadetrue
Мягкое появление средствами VGDropdown.
animation.enablefalse
Использование внешних CSS-классов анимации.
ajax.route''
Адрес отложенной загрузки.
ajax.target''
Селектор элемента для ответа.
ajax.oncefalse
Не повторять запрос после успешной загрузки.

События

vg.dropdown.show
Перед открытием; отправляется на панели и может быть отменено.
vg.dropdown.shown
После появления панели.
vg.dropdown.hide
Перед закрытием; отправляется на панели и может быть отменено.
vg.dropdown.hidden
После завершения закрытия.
vg.dropdown.loaded
После AJAX-запроса; отправляется на управляющем элементе.
Поведение кликов

Клик внутри .vg-dropdown-content не закрывает панель автоматически. Для действия без перехода вызовите hide() после обработки.