Monday 18 November 2013

The kbd element

The kbd HTML element is used to represent some form of user input. Typically it represents keyboard input (where its name comes from) but can be used to represent any type of input that can be represented in text, such as voice commands. While it may not be familiar to most web developers it has actually been part of HTML since the first proposal for a specification (HTML1 was 1993!), though the meaning has changed quite a bit since then.


There are a few different ways to use it as defined by the HTML5 spec.


The kbd element by itself generally represents a keystroke.

<p>Press the <kbd>Space</kbd> key to continue.</p>

When chaining keys together, ideally you would nest each keystroke within their own kbd element.

<p>Press <kbd><kbd>Ctrl</kbd>+<kbd>S</kbd></kbd> to save.</p>

Voice commands

Voice commands can be represented in the same fashion as keystrokes; by wrapping the command in the kbd tag.

<p>Say <kbd>OK Google</kbd> followed by your command.</p>

Input based on system output

The ideal way to represent input that is based on system output, such as a menu item, is to wrap the whole command in a kbd, each individual command in a kbd and each individual command again in a samp element.

<p>To save, select <kbd><kbd><samp>File</samp></kbd> | <kbd><samp>Save</samp></kbd></kbd>.</p>

This really does seem overkill and the spec actually says that such precision isn't necessary and simply wrapping the entire command in a single kbd is equally fine.

<p>To save, select <kbd>File | Save</kbd>.</p>

Input as it was echoed by the system

The prime example of this would be a program's output telling the user what to input, like a help message for a command line program or an instructional dialog in a GUI program. The ideal way to represent such a message is to wrap the entire output in a samp element and the inner-input commands in kbd tags.

<p>The program should remind you:</p>

<samp>Don't forget to frequently save your progress by hitting <kbd><kbd>Ctrl</kbd>+<kbd>S</kbd></kbd></samp>


A website that consistently uses the kbd elements enables the use of some clever styles that better represent the input. The styles that are used on this site for example:

kbd > kbd {
  box-shadow: 0 1px 0 rgba(0,0,0,.2), 0 0 0 3px #eee inset;
  border-radius: 3px;
  padding: .1em .7em;
  border: 1px solid #ccc;
  font-family: Arial, sans-serif;
  background-color: #eee;
  display: inline-block;
  margin: 0 .1em;
  white-space: nowrap;
  font-size: .7em;

Here it is in action:

See the Pen The <kbd> element by Daniel Imms (@Tyriar) on CodePen


Remember that the kbd element is a text-level semantic element and following exactly to the recommendation may not be necessary depending on the situation. As mentioned above, the HTML5 spec explicitly mentions that such precision isn't necessary. The spec outlines the most semantic way to markup the input, simply wrapping the items in a kbd tag is probably sufficient to get the point across clearly in most cases.

Further reading

Read more on the kbd element from the following sources: