Besides their default styling properties, HTML elements have a semantic meaning. For example, an h1 tag is usually styled with a larger font and bold, while it denotes "the single most important headline in its context".
While CSS enables us to style almost any HTML element like anything that is needed, choosing HTML elements corresponding to the meaning of their content has a few advantages:
- HTML becomes a little clearer
- Edge cases have already been considered and implemented:
- Keyboard support (tabbing, arrow keys)
- States (buttons, form elements)
- Interpretation of content is simplified for parsers (screen readers, search engine spiders)
Sectioning HTML documents
HTML5 brought a batch of new section elements, the most important being:
-
headerfor introductory content in its context, e.g. within asectionor anarticle -
mainfor the single main content of a page -
navfor sets of navigation links -
articlefor independent, self-contained content -
sectionfor sections like chapters, typically with a heading -
asidefor content indirectly related to its surroundings, like a sidebar -
footerfor a footer in its context, e.g. the page or anarticle
See purpose and examples on the HTML Standard site Show archive.org snapshot .
There is a detailed description at https://css-tricks.com/how-to-section-your-html/#sectioning-content Show archive.org snapshot , from whence the following illustration is taken:

Grouping content
Most of these you'll already know: p, hr, ul, li, div etc. But are you using these:
-
figure: any kind of illustration -
figcaption: must be a child offigure, serves as a caption for the illustration -
menu: a semantic alternative toulto express unordered lists of commands, e.g. a toolbar.
Did you know a div can be used to group dt and dd inside a dl?
See all grouping elements in the spec Show archive.org snapshot .
Text-level semantics
Of these you'll know many as well: a, em, strong, small etc. What about these:
-
s: content that is no longer accurate or relevant -
q: inline quotations -
abbr: an acronym. Itstitleattribute may be used to provide the expanded version. -
data: some data, where the machine-readable form is given in thevalueattribute. E.g. for dates -
timeShow archive.org snapshot : some datetime expression (see link for examples); if not machine-readable, may provide a machine-readable variant in itsdatetimeattribute. -
code: inline code example -
kbd: user input, usually keys. May be nested for key combinations like Ctrl + A.
See purpose and examples on the HTML Standard site Show archive.org snapshot .