Тег kbd в HTML: для чего нужен, как записать сочетание клавиш и команду

Тег kbd (от английского keyboard, «клавиатура») отмечает то, что вводит пользователь: клавишу, сочетание клавиш, команду. Так действие читателя отделяют от слов автора и от ответа программы. Тег парный, закрывающий обязателен, собственных атрибутов у него нет. Браузер выводит его моноширинным шрифтом и больше ничего не добавляет.

Сам тег kbd прост, трудности начинаются с записи. Сочетание клавиш можно оформить одним элементом или вложенными, в Windows и на Mac одни и те же клавиши называют по-разному, а «кнопка» на странице не должна разрываться на две строки. Всё это разобрано ниже.

HTML
<p>Введите <kbd>git status</kbd> и нажмите
  <kbd>Enter</kbd>.</p>

Тег kbd в HTML: что это и для чего нужен

Спецификация HTML описывает kbd как ввод пользователя: чаще всего с клавиатуры, но подходит и другой ввод, например голосовая команда. Справка MDN (на английском) говорит о том же и добавляет, что по умолчанию браузеры выводят элемент моноширинным шрифтом. Читателю показывают то, что он должен сделать сам: нажать клавишу, набрать команду.

По умолчанию kbd - моноширинный прямой текст обычной насыщенности, без рамки и фона. В абзаце его размер 13 px, а в заголовке h2 он наследует жирность и становится крупнее (19,5 px). Внутри ссылки текст получает цвет ссылки, а внутри em - курсив.

Отличить kbd от code и samp по виду нельзя: по умолчанию все три выглядят одинаково. Разница в смысле: kbd - то, что вводит читатель, samp - то, что вывела программа, а code - фрагмент кода.

HTML
<p>Закройте вкладку: <kbd>Ctrl+W</kbd>.</p>
<p>Команда для проверки: <kbd>node --version</kbd>.</p>

Сочетание клавиш в теге kbd: один тег или вложенные kbd

Сочетание клавиш записывают двумя способами. Первый - целиком в одном теге: <kbd>Ctrl+C</kbd>. Второй - вложенные теги: внешний kbd отмечает всё сочетание, внутренние - каждую клавишу, а знак «+» остаётся обычным текстом между ними. Оба варианта допустимы, в уроке курса второй назван чуть точнее.

HTML
<p>Одним тегом: <kbd>Ctrl+C</kbd></p>

<p>Вложенными: <kbd><kbd>Ctrl</kbd>+<kbd>C</kbd></kbd></p>

У вложенной записи есть практический смысл: каждую клавишу можно оформить отдельно, как кнопку, а всё сочетание при этом остаётся одним фрагментом. В Chrome выделение обоих вариантов даёт один и тот же текст «Ctrl+C», поэтому при копировании разницы нет.

Если клавиши нажимают не одновременно, а по очереди, каждое сочетание записывают своим внешним kbd и разделяют запятой или словом. У одной клавиши вложенности нет, для неё достаточно одного тега: <kbd>Esc</kbd>.

HTML
<p><kbd><kbd>Ctrl</kbd>+<kbd>K</kbd></kbd>, затем
  <kbd><kbd>Ctrl</kbd>+<kbd>C</kbd></kbd></p>

Соберите сочетание в конструкторе ниже и сравните оба способа записи. Кадр читает выделение так же, как при копировании.

Пример: конструктор сочетания клавиш

Результат

Нажимайте на клавиши в порядке нажатия и переключайте способ записи. Кадр показывает вид, разметку и текст, который получится при копировании.

Тег kbd и samp: команда в терминале, пункт меню и меняющаяся часть

Ввод и ответ программы идут парой, а теги у них разные. Когда показывают целый сеанс терминала, kbd вкладывают в samp: всё, что видно на экране, находится внутри одного samp, а введённое человеком отмечено тегом kbd. Так система «повторяет» ввод на экране. Такую запись описывает спецификация, а сам сеанс подробно разобран на странице про samp.

HTML
<pre><samp>$ <kbd>npm test</kbd>
3 passed
</samp></pre>

Обратная вложенность - samp внутри kbd - нужна, когда читателю показывают ввод по подсказке системы: пункт меню, название кнопки, слово, которое программа вывела на экран. Название взято с экрана, поэтому оно отмечено как samp, а действие читателя (выбрать, нажать) отмечено внешним kbd.

HTML
<p>Выберите
  <kbd><samp>Файл</samp> > <samp>Создать</samp></kbd>.</p>

Если в команде есть меняющаяся часть, её отмечают тегом var внутри kbd: читатель видит, что это слово нужно заменить своим. При выделении Chrome копирует только текст без разметки, поэтому из записи выше получится «Файл > Создать».

HTML
<p>Перейдите в папку:
  <kbd>cd <var>папка</var></kbd></p>

Названия клавиш в теге kbd: Ctrl и ⌘, знак «+» и запись для Windows и Mac

Внутри kbd пишут то, что напечатано на клавише, или общепринятое название: Ctrl, Shift, Alt, Esc, Tab, Enter. Буквенные клавиши пишут заглавной буквой, как они обозначены на клавиатуре: C, а не c. Названия стрелок и особых клавиш удобнее писать словами: Стрелка вниз, Пробел. Такая запись понятна без значков и не зависит от шрифта.

Один и тот же вариант записи держите на всём сайте. Когда в одном месте написано Ctrl, в другом Control, а в третьем CTRL, читатель гадает, одна это клавиша или разные.

На компьютерах Apple вместо Ctrl обычно нажимают Command (символ ⌘), а вместо Alt - Option (символ ⌥). Поэтому сочетание для Windows и для Mac записывают двумя вариантами. Кнопки ⌘ и ⌥ есть в конструкторе выше.

HTML
<p>Копировать: <kbd><kbd>Ctrl</kbd>+<kbd>C</kbd></kbd>
  (на Mac <kbd><kbd>⌘</kbd>+<kbd>C</kbd></kbd>)</p>

Знак «+» не клавиша, а связка, поэтому его пишут обычным текстом. Если сама клавиша плюс входит в сочетание, её записывают отдельным тегом и поясняют словом: «Ctrl и клавиша +». Так читатель не примет знак связки за часть названия.

Оформление тега kbd в CSS: клавиша как кнопка и двойная рамка у вложенных

По умолчанию kbd - моноширинный текст без рамки, и клавиша в нём не отличается от кода. Размер по умолчанию тот же, что у code: об этом написано в разделе про размер шрифта на странице про code. Чтобы клавиша выглядела как клавиша, ей задают рамку, фон и тень снизу.

CSS
kbd {
  padding: 1px 5px;
  border: 1px solid #8a8f99;
  border-radius: 4px;
  background: #f6f4ef;
  box-shadow: 0 1px 0 #8a8f99;
}

Проблема появляется при вложенных kbd. Правило для kbd применяется и к внешнему тегу, и к каждой клавише: вокруг сочетания рисуется общая рамка, а внутри неё - рамки клавиш. Получается двойная рамка. Исправить можно сбросом стилей у внешнего тега, внутри которого есть другой kbd.

CSS
kbd:has(> kbd) {
  padding: 0;
  border: 0;
  background: none;
  box-shadow: none;
}

Селектор :has() поддерживают современные браузеры, в Chrome он сработал в кадре ниже. Если нужна запись без него, клавишам дают класс, например class="key", и оформляют только этот класс.

Пример: двойная рамка у вложенных kbd

Результат

Переключайте стиль. Кадр считает, сколько рамок нарисовано вокруг kbd, и сравнивает с числом клавиш.

Перенос тега kbd на новую строку: почему «Page Down» разрывается

Тег kbd строчный, и текст внутри него переносится по обычным правилам. Название из двух слов, например Page Down, может оказаться на границе строки, и тогда его половины окажутся на разных строках. Слово без пробела, как Delete, не разрывается.

Чтобы клавиша всегда оставалась целой, задают white-space: nowrap. Плашку с display: inline-block Chrome тоже переносит целиком, это видно на третьей строке кадра ниже.

CSS
kbd {
  white-space: nowrap;
}

Цена у nowrap одна: в очень узкой колонке длинная клавиша выйдет за край колонки, а не перенесётся. На телефонах колонка бывает 200 px и уже, поэтому длинные названия клавиш не стоит собирать в длинные цепочки.

Пример: ширина колонки и перенос kbd

Результат

Двигайте ползунок. Кадр спрашивает у браузера, из скольких частей состоит клавиша Page Down, и показывает результат для трёх записей.

Тег kbd и aria-keyshortcuts: запись сочетания и настоящее сочетание

Тег kbd только показывает читателю, какие клавиши нажать. Сами клавиши он не назначает: если на странице кнопка должна срабатывать по сочетанию, это делает скрипт, который слушает событие keydown.

Отдельно есть атрибут aria-keyshortcuts (ARIA). Он сообщает вспомогательным технологиям, что у элемента есть сочетание клавиш, но, как и любой ARIA-атрибут, сам ничего не запускает: поведение пишут скриптом. По описанию в справке MDN (на английском) значение записывают названиями клавиш через плюс, сначала модификаторы, затем одна обычная клавиша, например Control+S. Клавише Command соответствует Meta.

HTML
<button aria-keyshortcuts="Shift+S">
  Сохранить
</button>
JavaScript
document.addEventListener('keydown', (e) => {
  if (e.shiftKey && e.code === 'KeyS') save();
});

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

Пример: атрибут aria-keyshortcuts без скрипта и со скриптом

Результат

Щёлкните в кадре и нажмите Shift+S или воспользуйтесь кнопкой. Кадр считает, сколько раз сработала каждая кнопка.

Тег kbd или code, samp, var: что выбрать

Когда не уверены, какой тег нужен, ответьте на вопрос: кто делает то, что записано в тексте? Если человек вводит или нажимает - kbd, если программа выводит - samp, если это фрагмент кода - code.

Что нужно отметитьКакой тегПример
Клавишу или сочетаниеkbd<kbd>Esc</kbd>
Команду, которую вводит читательkbd<kbd>npm install</kbd>
Ответ программыsamp<samp>added 12 packages</samp>
Пункт меню или кнопку с экрана программыsamp внутри kbd<kbd><samp>Файл</samp></kbd>
Меняющуюся часть командыvar внутри kbd<kbd>cd <var>папка</var></kbd>
Фрагмент кодаcode<code>let x = 1;</code>

Частые ошибки с тегом kbd

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

ОшибкаЧто происходитКак исправить
Ответ программы в kbd: <kbd>notes.txt photos</kbd>Список файлов выводит программа, а не вводит человек<samp>notes.txt photos</samp>
Сочетание в samp: <samp>Ctrl+N</samp>Клавиши нажимает человек, а не выводит программа<kbd>Ctrl+N</kbd>
Клавиши в code: <code>Ctrl+C</code>Тег code сообщает, что это код, а не действие читателя<kbd>Ctrl+C</kbd>
Сочетание в одном теге, когда у клавиш есть рамка: <kbd>Ctrl+C</kbd>Рамка охватывает всё сочетание, отдельных клавиш не видноВложенные теги: <kbd><kbd>Ctrl</kbd>+<kbd>C</kbd></kbd>
Знак «+» в отдельном теге: <kbd>Ctrl</kbd><kbd>+</kbd><kbd>C</kbd>Знак связки не клавиша, но получает свою рамкуЗаписать «+» обычным текстом между тегами
Рамка на всех kbd при вложенной записиВокруг сочетания и вокруг каждой клавиши рисуется рамка: получается двойная рамкаСбросить стили у внешнего тега: kbd:has(> kbd)
Клавиша записана по-разному: CTRL, Control, ctrlЧитатель гадает, одна это клавиша или разныеОдин вариант записи на всём сайте: Ctrl
Длинная клавиша в узкой колонке: Page DownНазвание рвётся на две строкиwhite-space: nowrap для kbd
kbd ради вида кнопки: <kbd>Новинка</kbd>Тег говорит, что читатель что-то вводит, а это просто меткаspan с классом и рамкой в CSS
aria-keyshortcuts без скриптаАтрибут сообщает о сочетании, но ничего не запускаетДобавить обработчик keydown
Категория
Поделиться в социальных сетях

Отправить комментарий

0 Комментарии

Отправить комментарий (0)

#buttons=(Хорошо) #days=(20)

Мы используем файлы cookie для улучшения работы сайта. Подробнее
Хорошо
×