Меню
Меню ведёт по разделам сайта, раздела или личного кабинета и раскрывает группы вложенных разделов. Один компонент показывается вертикально в боковой панели, строкой в шапке или деревом документации. Для действий над выбранным объектом берите контекстное меню.
Пример
Разметка
Минимальную разметку показывает пример выше: список <ul class="sf-menu">
внутри <nav> с aria-label, пункты <li class="sf-menu-item">.
- Обычный пункт содержит ссылку
<a class="sf-menu-element">. - Ветка — пункт с вложенным
<ul class="sf-menu">и текстом подписи прямо в<li>. Скрипт превращает подпись в кнопку раскрытияsf-menu-elementсо стрелкой, связывает её с подменю черезaria-expandedиaria-controlsи прячет закрытое подменю. - Скрипт оборачивает подпись в
sf-menu-element-wrapиsf-menu-element-textи ставит уровеньsf-menu-element--level-1…--level-4; писать эти классы вручную не нужно. - Атрибуты пункта:
icon="имя"— иконка перед подписью,trailing-icon="имя"— своя иконка вместо стрелки ветки,text="Текст"— подпись, если её нет в разметке. - Loader подключает меню по классу
sf-menuвместе с иконками и кнопками с иконкой. Публичных методов и событий у компонента нет: состояние задаёт разметка.
Варианты
Вид
Без модификатора меню вертикальное — для боковой панели, каталога, настроек.
sf-menu--horizontal выстраивает первый уровень строкой — для основных
разделов в шапке; ставьте его только корневому списку.
sf-menu--documentation-tree — компактное дерево без рамок с отступом по
уровню, для навигации по документации.
Подменю горизонтального меню
В горизонтальном меню подменю первого уровня открывается вниз, следующие — в сторону; внутри все подменю вертикальные. Подменю, которое не помещается у края экрана, сдвигается в свободную сторону. Открытие одного верхнего раздела закрывает соседний, щелчок вне меню закрывает открытую ветку. При письме справа налево направление раскрытия меняется само: оно задано логическими сторонами. Пункты горизонтального меню не переносятся на вторую строку: на узком экране показывайте те же пункты вертикальным меню в выдвижной панели.
Уровни вложенности
Подменю — вложенный список sf-menu. Скрипт различает четыре уровня, пятый
и глубже оформляются как четвёртый; более глубокую структуру разделите на
несколько страниц или меню.
Иконки
icon ставит иконку перед подписью пункта или ветки. trailing-icon
заменяет стрелку ветки своей иконкой.
Состояния
Текущий пункт
Ссылке текущей страницы добавьте aria-current="page". Дерево документации
sf-menu--documentation-tree выделяет такой пункт фоном и начертанием;
вертикальное и горизонтальное меню его не выделяют, атрибут нужен экранному
диктору.
Открытая и недоступная ветка
Класс open на пункте-ветке открывает подменю при загрузке; дальше его
переключает скрипт. Атрибут или класс disabled на ветке запрещает её
раскрывать и приглушает подпись. Недоступную ссылку лучше убрать из
навигации.
Доступность
- Оборачивайте меню в
<nav>сaria-labelилиaria-labelledby. Не ставьтеrole="menu": навигация остаётся списком ссылок. - Ветка — кнопка с
aria-expandedиaria-controls; скрипт держит их в актуальном состоянии. - Текущей странице —
aria-current="page".
| Клавиша | Результат |
|---|---|
Enter или Пробел на ветке |
Открывает или закрывает подменю |
Escape в горизонтальном меню |
Закрывает текущую ветку и возвращает фокус на её кнопку |
Tab |
Переходит по ссылкам и веткам по порядку |
Классы
| Что | Классы |
|---|---|
| Блок | sf-menu |
| Части | sf-menu-element, sf-menu-element--level-1, sf-menu-element--level-2, sf-menu-element--level-3, sf-menu-element--level-4, sf-menu-element-icon, sf-menu-element-text, sf-menu-element-wrap, sf-menu-item |
| Модификаторы | sf-menu--documentation-tree, sf-menu--horizontal |
Классы и переменные собраны из CSS выпуска и обновляются вместе с ним.
Переменные
Компонент читает свои переменные, а модификаторы задают им значения; таблица показывает, из чего складывается вид. Переменные компонента — его внутренняя проводка, а не поверхность настройки: их имена и устройство могут меняться. Вид проекта меняют общие токены, а глубокий вид Smart-компонента — его шаблон (см. Переменные компонента). Значение по умолчанию — из базового правила блока (.sf-menu); переменную без него задают только модификаторы.
| Переменная | По умолчанию | Задаёт |
|---|---|---|
--sf-menu--gap |
не задана; задают модификаторы, например .sf-menu.sf-menu--documentation-tree: var(--sf-space-1/4) |
gap |
--sf-menu-element--background-color |
не задана; задают модификаторы, например .sf-menu-element: var(--sf-transparent) |
background-color |
--sf-menu-element--border-color |
не задана; задают модификаторы, например .sf-menu-element: var(--sf-surface-container) |
border-color |
--sf-menu-element--border-width |
не задана; задают модификаторы, например .sf-menu-element: var(--sf-px) |
padding-top, padding-block-start, padding-bottom, padding-block-end, border-top-width, border-block-start-width, border-bottom-width, border-block-end-width, border-inline-start-width, border-inline-end-width |
--sf-menu-element--color |
не задана; задают модификаторы, например .sf-menu-element: var(--sf-on-surface) |
color |
--sf-menu-element--gap |
не задана; задают модификаторы, например .sf-menu-element: var(--sf-space-1/3) |
gap |
--sf-menu-element--padding-bottom |
не задана; задают модификаторы, например .sf-menu.sf-menu--documentation-tree .sf-menu-element: var(--sf-0) |
padding-bottom, padding-block-end |
--sf-menu-element--padding-inline-start |
не задана; задают модификаторы, например .sf-menu-element--level-1: var(--sf-space-1) |
padding-inline-start |
--sf-menu-element--padding-right |
не задана; задают модификаторы, например .sf-menu.sf-menu--documentation-tree .sf-menu-element: var(--sf-0) |
padding-inline-end |
--sf-menu-element--padding-top |
не задана; задают модификаторы, например .sf-menu.sf-menu--documentation-tree .sf-menu-element: var(--sf-0) |
padding-top, padding-block-start |
--sf-menu-element--radius |
не задана; задают модификаторы, например .sf-menu-element: var(--sf-radius--ui) |
border-start-start-radius, border-start-end-radius, border-end-start-radius, border-end-end-radius |
--sf-menu-item--background-color |
не задана; задают модификаторы, например .sf-menu .sf-menu-item: transparent |
background-color |
--sf-menu-item--gap |
не задана; задают модификаторы, например .sf-menu .sf-menu-item: var(--sf-space-1/3) |
gap |