According to HTML5Doctor.com and other HTML5 introductory sites, the header element should contain a h1-h6 tag plus other navigational or introductory content. However, the traditional 'header' on most websites consists of just a logo and some navigational elements.
A lot of major sites including Facebook and Twitter use a h1 tag for their logo, which seems illogical to me, since the logo is not the most important or most informative element on the page.
A h1 tag appears in the content section of 95% of websites, not the header section. So why are we instructed to include a h tag in the header? If we must, why don't Facebook and Twitter use a h6 tag instead?
Don't get confused by "should" contain and "must" contain. You aren't required to have anything inside the header you don't want but the 'semantic' purpose of the header is that is where you should look for and place such things, at the head of a document. Just as you would look for the title or introduction or table of contents at the top of a printed page.
This is a flexible but important concept for SEO and basic HTML programming. While there is some room for wiggling through this standard, it will not make or break your site.
For example, you mention Facebook has the logo instead of an H1 in their header. This is half true as they have their header within a pair of h1 tags, making it function essentially the same as any other H1 text might:
Again, not exactly ideal, but they are Facebook and can do what they want. You on the other hand might want to be more mindful of these best practices when building out a site.
You should take a look at the outline algorithm for HTML5.
You probably want your site title/logo to be a
h1
.Imagine a small webpage, consisting of a page header (logo, site name, …), a site navigation and a blog entry (main content of this page):
Here the only heading is the
h1
inside thediv
. Semantically this would mean, that all content of this page is in the scope of this heading. See the outline of this page:But this would not be true (in the semantic way): hierarchically, the page header "ACME Inc." is not "part" of the blog entry. Same goes for the navigation; it's a site navigation, not navigation for "Lorem Ipsum".
So the site header and the site navigation need a heading. Let's try to give them a
h1
, too:Way better! The page outline now looks like:
But it's still not perfect: they are all on the same level, but "ACME Inc." is what makes all the webpages to form a website, it's the whole point why there are webpages at all. The navigation and the blog entry are parts of "ACME Inc.", which represents the company and the website itself.
So we should go and change the navigation and blog entry headings from
h1
toh2
:Now we have this outline:
And this is exactly what the content of the example webpage means. (By the way, this would work in HTML 4.01, too.)
As explained in the link, HTML5 gives us sectioning elements, which play an important role for the outline (instead of
div
, which doesn't influence the outline) We should use them:The outline stays the same. We could even change the
h2
(inside of thenav
and thearticle
) back toh1
, the outline would stay the same, too.If you don't want an "explicit" heading for the navigation, you are free to remove it: the outline stays the same (now with an implicit/"unnamed" heading for the
nav
). Each section has a heading, whether you add it or not.You could even change the
h1
inside theheader
toh6
and it wouldn't change the outline. You can think of this heading as the "heading of thebody
".Additional notes
header
element is not needed in these examples. I only added it because you mentioned it in your question.h1
and add theimg
as a child. The value of thealt
attribute should give the name then.article
(with its heading inside) is the most important content.h2
…h6
anymore (but you are free to use them, for clarity or backwards compatibility).the HTML Outliner: http://gsnedders.html5.org/outliner/(it had some unfixed bugs) the HTML5 Outliner.