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
<dfn> 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.
<p> The <dfn><abbr title="International Good Dog Association">IGDA</abbr></dfn> is an international, not-for-profit organization responsible for determining that all dogs are good. </p>
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
<abbr> element with a
title attribute defining the full name. By adding the
<dfn> element around the abbreviation, it indicates that the surrounding paragraph defines the term “International Good Dogs Association.”
<abbr> element is useful because it can provide a useful visual representation in the form of a tooltip explaining what the abbreviation is.
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
<kbd> element is used to represent text for a textual user input (e.g. from a keyboard). You can also nest multiple
<kbd> 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.
<p>I like to <kbd><kbd>Ctrl</kbd>+<kbd>C</kbd></kbd> and <kbd><kbd>Ctrl</kbd>+<kbd>V</kbd></kbd> a lot.</p>
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
<kbd> 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
<kbd> 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.
<samp> element is really cool because you can nest it inside the
<kbd> 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
<samp> element inside a
<kbd> element. This is used to mark up content that represents input based on the text displayed by the system (e.g. button names).
<p>To save the image file, select <kbd><kbd><samp>File</samp></kbd> - <kbd><samp>Save as...</samp></kbd></kbd>. </p>
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
<samp>) 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
<samp>, we determine that the input has been echoed back to the user by the system.
<p><samp>yarn start:theproject does not exist, did you mean:</p> <blockquote><samp><kbd>yarn start:the-project</kbd></samp></blockquote>
<var> element! This is used to mark up the name of a variable in math or programming, for example:
<var>E</var> = <var>m</var><var>c</var><sup>2</sup>. <samp>Error: <var>console<var> is undefined.</samp>
Here you can start to see how combining
<var> with other elements like
<samp> 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
<span> or a
<div> to 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).
<figure>) are a great example of a power combination element. Unfortunately, I think it is widely misused and under appreciated (much like
<aside>, which I could talk about for hours). The obvious combination you are probably familiar with is using
<figcaption> together. We often use this duo to represent graphical content like images, illustrations and diagrams — but it can also be used for things like code, poems and quotes!
Because a figure is so flexible in what kind of content it represents, there are a bunch of different HTML elements you can use within a figure to provide more context around the type of content you are putting in your page.
<figure> element is often seen with an optional
<figcaption> which represents a caption or legend for a figure. It should be the first child or last child of the
<figure> element. You can also use any flow content (e.g. paragraphs, headings, etc.) in the
<figcaption> to provide more context and you can have multiple images inside a
<figure> represented by a single
<figure> <img src="jello.jpg" alt="Golden Retriever Puppy" /> <figcaption>Jello the Golden Retriever enjoying being carried home.</figcaption> </figure>
<pre> element is used to display preformatted text or code and is usually rendered using a monospace font. While
<pre> can be used on its own, it can also be combined with
<figcaption>. By doing this, the content inside the
<pre> element becomes more accessible to assistive technologies, like screen readers, since it allows us to use
<figcaption> as a label for the text or code.
We can go even further by combining the
<code> elements to identify the pre- formatted content as code.
See the Pen QVaWVW by CSS-Tricks (@css-tricks) on CodePen.
<code> is considered flow content, it can also be used inside a
<figcaption> to mark up inline references to code (i.e. a single phrase or line).
Cite and Blockquote
Quotations are something I use a lot and it honestly didn’t occur to me it could be used as part of a figure. But it still makes sense to use a cite or blockquote if the content they contain is relevant to the overall content, even if it is not part of the main document flow.
I like the example of using a figure for poems, mainly so I could share the amazing poem I wrote about my dog. Here I use the
<cite> element inside the
<figure> <p> Jello - A little fluffy dog. Hello! Squishy Jello - you little fluffy fellow. BOUNCY yellow Jello. A very mellow fellow. EATING MY MARSHMALLOW. </p> <figcaption><cite>Eating my Marshmallow by Mandy Michael</cite></figcaption> </figure>
It’s easy to fall into the trap of thinking that the figure element is just for images or image-like content, but you can use it for content like audio, video, charts, poems, quotations or even tables of statistics. Because the element is so versatile you can combine it with so many other elements to provide more and more context about the figure for assistive technology, browsers, and other technologies consuming your website.
These are just some of the ways HTML elements can be combined for better context. HTML elements are indeed useful and valuable on their own when used as isolated pieces — and using them this way is a good first step. But, like Voltron, when you combine HTML elements together, the individual pieces form a greater whole and gain much more meaning and power. It’s important that we don’t think of HTML as individual pieces of code, but parts of a whole because HTML is really a mass of totally amazing combinations.
You can combine and use HTML elements in any number of ways to best represent your content. Don’t simply stick to the same old things you know; take the time to explore HTML and learn about all it has to offer. Like any language, we should make the most of it and use it to its full potential.
The more accurate you are in marking up your content, the better that content will be represented across technologies, and the more prepared it will be for anything else that is used to interpret your HTML in the future.
So, go forth and HTML elements, unite!
In my opinion, the best resource for learning and understanding how to use HTML (outside of the spec itself) is the MDN Web Docs. It lists all the HTML elements you could ever need.
The following are among the elements covered in this post:
If you are a TypeScript fan and don’t understand why Semantic HTML is important, I wrote this post just for you: Understanding why Semantic HTML is important as told by TypeScript.
Wow. Thank you.
Interesting look at some less-used elements. I like the nesting, particularly.
(Note that in E=mc^2, the value of c is not a variable.)
Quoting from the HTML Living Standard (https://html.spec.whatwg.org/multipage/text-level-semantics.html#the-var-element):
“The var element represents a variable. This could be […] a symbol identifying a physical quantity, […].”
This is very interesting, have to admit I’ve never taken the time to use some of these elements, but would have had cause for doing so had I been more aware of them.
If I may be pedantic for a second: IGDA isn’t an acronym, unless you’re pronouncing it “ig-da”. NASA, NATO and SCUBA are examples of acronyms (because you pronounce them as though they were words), whereas IGDA, USA and CIA are all abbreviations (you say each letter individually). Both acronyms and abbreviations are types of initalism. /pedantry
All these examples are acronyms. Each component of an acronym is the abbreviation of a word. An abbreviation is a shortened form of a word (e.g. “abbrev.” is an abbreviation of “abbreviation).
I don’t think you really need the
<dfn>element when using the
<abbr>has enough context on it’s own.
Be aware when using an
<abbr>element that they are practically useless for any touch screen user by default.
JAWS, NVDA, and VoiceOver do not announce the
titletext in your example. TalkBack on Android does. On top of this, content in a
titleis not available to keyboard-only or touch-screen users (though IE and Edge would show it on focus if the container can receive focus, which
Generally, accessibility practitioners suggest not using this pattern at all. Instead, expand all abbreviations and acronyms in plain text as it better supports all users. For example:
Screen readers using default settings do not announce
<samp>…). This is because browsers do not expose them in accessibility APIs to pass them to the screen reader.
You should still use these elements (maybe not
<abbr>and instead the pattern I suggest above) because eventually browsers will correctly expose this information to assistive technology. The easiest way to know is to just fire up a screen reader.