Guides, resources and discussions about Semantic HTML are often focused around specific elements, like a heading, or a sectioning element, or a list. It’s not often that we talk specifically about how we can combine HTML elements to increase their effectiveness.
Normally, when we introduce HTML, we talk about how it is used to apply meaning to content in a document, and we do this by using examples like:
“Is it a paragraph?”
“Is it a heading?”
“Is it a numbered list”
“Is it a button”
We use these examples because they are easy to understand — it’s a single piece or chunk of the same content that needs to be represented in a particular way. This is useful, but it only scratches the surface of how we can use and combine elements to provide more context and meaning.
You remember Voltron, right? Each member of the Voltron force was powerful in their own right, but it was when they combined together to form a towering figure that their mighty powers became unstoppable.
The same is true of HTML elements. I have a few favorite combinations that I’ll take you through. They may seem obscure, but you’d be surprised at how often they come up when you take the time to think outside of divs and spans.
Abbreviations and Definitions
and are two of my favorite HTML elements. I particularly like them because they work really well together.
You can combine the abbreviation and definition elements to allow browsers, search bots, and other technologies to recognize that something is being defined and that the acronym is associated to that phrase.
The IGDA is an international,
not-for-profit organization responsible for determining
that all dogs are good.
In the above example, I’m defining that the acronym “IGDA” as “International Good Dogs Association.” I do this by wrapping the acronym in an element with a title attribute defining the full name. By adding the element around the abbreviation, it indicates that the surrounding paragraph defines the term “International Good Dogs Association.”
The element is useful because it can provide a useful visual representation in the form of a tooltip explaining what the abbreviation is.
Visual representation of and .
Keyboard, Sample and Variable
If you haven’t heard of these elements, then get ready to have your socks blown off, because they are awesome.
First up, the element is used to represent text for a textual user input (e.g. from a keyboard). You can also nest multiple elements to represent multiple keystrokes. I love this because, as developers, we find ourselves (hopefully) writing documentation, blog posts, and guides on a regular basis and HTML provides us with native ways to represent this content straight out of the box!
If I wanted to tell someone how you copy and paste with the keyboard, I could mark it up like the code below.
I like to Ctrl+C and Ctrl+V a lot.
It looks a bit nuts but the above code, when rendered, looks like the following without any styling applied to it. If you are wondering why kbd is nested inside another kbd element, what this does is specify that the key or input is part of a larger input. Even more combined superpowers!
See the Pen rZpNPy by CSS-Tricks (@css-tricks) on CodePen.
You can further target the elements with CSS to make it look more like little keyboard controls. (Note: Browsers tend to render this by default with a monospace font.)
See the Pen gdoOqE by CSS-Tricks (@css-tricks) on CodePen.
If you’re wondering what the difference is between using versus a span, I believe it comes down to information. I will repeat this sentiment a lot: we do not know how someone is going to consume our HTML, so give your content it’s best chance by representing it in the most meaningful and contextual way possible. If you are still not on board, then please go read my post about HTML as told by TypeScript.
The element is really cool because you can nest it inside the element and vice versa. WHAT? I know, so versatile! Let’s have a look at some examples from MDN.
The following code is an example of nesting a element inside a element. This is used to mark up content that represents input based on the text displayed by the system (e.g. button names).
To save the image file, select File - Save as....
See the Pen YOYzbJ by CSS-Tricks (@css-tricks) on CodePen.
In the above code, we define our keyboard shortcuts the same as our previous example, but we also determine that the menu and menu item names (contained within both and ) are an input selected from something displayed by the system, e.g. a dialog or widget.
In other words, this piece of text is a message from the system which has some user inputs that you need to follow (like File and Save as…).
Whereas, when we nest inside , we determine that the input has been echoed back to the user by the system.
yarn start:theproject does not exist, did you mean:
Finally, the element! This is used to mark up the name of a variable in math or programming, for example:
E = mc2.
Error: console is undefined.
Here you can start to see how combining with other elements like
, or starts to make your content’s markup more explicit by adding more context. Anything that interprets your HTML markup can start to derive more meaning from the elements you are using rather than just assuming that it’s all standard text.
If you put this content in a paragraph with some spans, there is no way for technology to distinguish this from any other old text on your page. You don’t have to resort to or ato represent this content because HTML already provides us with more semantically accurate elements we can use. HTML is not just about presentation; it’s about meaning. Various technologies outside of visual rendering engines rely on this meaning to make decisions about how to communicate our content in the most meaningful way (e.g. screen readers, text to voice, reading apps, bots, or the next big thing in the future).