The following is an extract from our book, HTML5 & CSS3 for the Real World, 2nd Edition, written by Alexis Goldstein, Louis Lazaris, and Estelle Weyl. Copies are sold in stores worldwide, or you can buy it in ebook form here.
Now that we've broken down the basics of our template, let's start adding some meat to the bones and give our page some structure.
Later in the book, we're going to specifically deal with adding CSS3 features and other HTML5 goodness; for now, we'll consider what elements we want to use in building our site's overall layout. We'll be covering a lot in this section and throughout the coming chapters about semantics. When we use the term "semantics," we're referring to the way a given HTML element describes the meaning of its content.
If you look back at the screenshot of The HTML5 Herald (or view the site online), you'll see that it's divided up as follows:
header section with a logo and title
body content divided into three columns
articles and ad blocks within the columns
footer containing some author and copyright information
Before we decide which elements are appropriate for these different parts of our page, let's consider some of our options. First of all, we'll introduce you to some of the new HTML5 semantic elements that could be used to help divide our page and add more meaning to our document's structure.
Naturally, the first element we'll look at is the
header element. The spec describes it succinctly as "a group of introductory or navigational aids."
Contrary to what you might normally assume, you can include a new header element to introduce each section of your content. It's not just reserved for the page header (which you might normally mark up with
<div id="header">). When we use the word "section" here, we're not limiting ourselves to the actual
section element described in the next part; technically, we're referring to what HTML5 calls "sectioning content." This means any chunk of content that might need its own header, even if that means there are multiple such chunks on a single page.
header element can be used to include introductory content or navigational aids that are specific to any single section of a page, or apply to the entire page, or both.
header element will frequently be placed at the top of a page or section, its definition is independent from its position. Your site's layout might call for the title of an article or blog post to be off to the left, right, or even below the content; regardless of which, you can still use
header to describe this content.
The next element you should become familiar with is HTML5's
section element. The spec defines
section as follows:
sectionelement represents a generic section of a document or application. A section, in this context, is a thematic grouping of content, typically with a heading.
Going back to the definition from the spec, the
section element's content should be "thematic," so it would be incorrect to use it in a generic way to wrap unrelated pieces of content.
Some examples of acceptable uses for
section elements include:
individual sections of a tabbed interface
segments of an "About" page; for example, a company's "About" page might include sections on the company's history, its mission statement, and its team
different parts of a lengthy "terms of service" page
various sections of an online news site; for example, articles could be grouped into sections covering sports, world affairs, and economic news
Every time new semantic markup is made available to web designers, there will be debate over what constitutes correct use of these elements, what the spec's intention was, and so on. You may remember discussions about the appropriate use of the
dl element in previous HTML specifications. Unsurprisingly, HTML5 has not been immune to this phenomenon, particularly when it comes to the
section element. Even Bruce Lawson, a well-respected authority on HTML5, has admitted to using
section incorrectly in the past. For a bit of clarity, it's well worth reading Bruce's post explaining his error.
That said, as is always the case with semantics, it's open to interpretation in some instances. If you feel you can make a case for why you're using a given element rather than another, go for it. In the unlikely event that anyone ever calls you on it, the resulting discussion can be both entertaining and enriching for everyone involved, and might even contribute to the wider community's understanding of the specification.
Keep in mind, also, that you're permitted to nest
section elements inside existing
section elements, if it's appropriate. For example, for an online news website, the World News section might be further subdivided into a section for each major global region.
article element is similar to the
section element, but there are some notable differences. Here's the definition according to the spec:
The article element represents a complete, or self-contained, composition in a document, page, application, or site and that is, in principle, independently distributable or reusable, e.g. in syndication.
The key terms in that definition are self-contained composition and independently distributable. Whereas a
section can contain any content that can be grouped thematically, an
article must be a single piece of content that can stand on its own. This distinction can be hard to wrap your head around, so when in doubt, try the test of syndication: if a piece of content can be republished on another site without being modified, or if it can be pushed out as an update via RSS, or on social media sites such as Twitter or Facebook, it has the makings of an
Ultimately, it's up to you to decide what constitutes an article, but here are some suggestions in line with recommendations in the spec:
Finally, just like
article elements can be nested inside other
article elements. You can also nest a
section inside an
article, and vice versa. It all depends on the content you're marking up.
It's safe to assume that the
nav element will appear in virtually every project.
nav represents exactly what it implies: a group of navigation links. Although the most common use for
nav will be for wrapping an unordered list of links, there are other options. For example, you could wrap the
nav element around a paragraph of text that contained the major navigation links for a page or section of a page.
In either case, the
nav element should be reserved for navigation that is of primary importance. So, it's recommended that you avoid using
nav for a brief list of links in a footer, for example.
Note: Skip Navigation Links
A design pattern you may have seen implemented on many sites is the "skip navigation" link. The idea is to allow users of screen readers to quickly skip past your site's main navigation if they've already heard it-after all, there's no point listening to a large site's entire navigation menu every time you click through to a new page! The
nav element has the potential to eliminate this need; if a screen reader sees a
nav element, it could allow its users to skip over the navigation without requiring an additional link. The specification states: "User agents (such as screen readers) that are targeted at users who can benefit from navigation information being omitted in the initial rendering, or who can benefit from navigation information being immediately available, can use this element as a way to determine what content on the page to initially skip or provide on request (or both)."
Although not all assistive devices recognize
nav as of this writing, by building to the standards now you ensure that as screen readers improve, your page will become more accessible over time.
Note: User Agents
You'll encounter the term "user agent" a lot when browsing through specifications. Really, it's just a fancy term for a browser-a software "agent" that a user employs to access the content of a page. The reason the specs don't simply say "browser" is that user agents can include screen readers or any other technological means to read a web page.
section, there's been some debate over what constitutes acceptable use of
nav and why it isn't recommended in some circumstances (such as in a footer). Some developers believe this element is appropriate for pagination or breadcrumb links, or for a search form that constitutes a primary means of navigating a site (as is the case on Google).
This decision will ultimately be up to you, the developer. Ian Hickson, the primary editor of WHATWG's HTML5 specification, responded to the question directly: "use [it] whenever you would have used class=nav".
This element represents a part of the page that's "tangentially related to the content around the
aside element, and which could be considered separate from that content."
aside element could be used to wrap a portion of content that is tangential to:
The final element we'll discuss in this chapter is the
footer element. As with
header, you can have multiple
footer elements on a single page, and you should use
footer instead of something generic such as
Note: How did we get here?
If you're wondering a little bit about the path to HTML5 and how we ended up with the tags that we did, you might want to check out Luke Stevens' book called The Truth about HTML5. Currently in its 2nd edition, Luke's book is somewhat controversial. In addition to covering many of the HTML5 technologies such as video and canvas, he also goes in-depth in his coverage of the history of HTML5, explaining some of the semantic and accessibility problems inherent in the new elements and providing some recommendations on how to handle these issues.