HTML5 文書の構造や新しい要素に関する個人的なメモ。
参考:
「入門 HTML5(オライリー)」
「TAG index Webサイト」
「HTML5のセクションで“文書構造”を理解する atmarkIT」
目次
HTML5 の DOCTYPE は以下のようになる。
<!doctype html>
quirk の意味:特異な行動、奇行、(奇)癖、思いがけない[予測のつかない]出来事など
参考:Activating Browser Modes with Doctype
HTML ページのルート要素は <html>
XHTML の <html> の例
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja" >
HTML5 では xmlns 属性を明示的に宣言する必要はない(常にこの名前空間に属するため)。また、HTML5 では xml:lang 属性は不要で、lang 属性のみが意味を持つ。(xml:lang 属性を残してもかまわないが、その際は lang 属性と同一の値を持つようにする必要がある。
HTML5 のルート要素は以下のようになる。
<html lang="ja">
以下のように IE バージョンにより、クラスを設定する方法(IE の条件コメント)もよく使われる。
<!DOCTYPE html> <!--[if lt IE 7]> <html class="ie6" lang="ja"> <![endif]--> <!--[if IE 7]> <html class="ie7" lang="ja"> <![endif]--> <!--[if IE 8]> <html class="ie8" lang="ja"> <![endif]--> <!--[if gt IE 8]><!--> <html lang="ja"> <!--<![endif]-->
<head> 要素はページに関する情報などのメタデータ等を含む。
全ての HTML 文書には常に文字エンコーディングを指定するべきである。
HTML5 では以下のように指定することができる(UTF-8 の場合)。
<meta charset="UTF-8">
参考:HTML Living Standard/Link types
<link rel=’stylesheet’> は、別の CSS ファイルに保存されているスタイルシートを参照するためのもので、HTML5 では type 属性を省略することが可能。(CSS は Web で使われている唯一のスタイルシート言語のため、type 属性のデフォルトとなっているため)
<link rel='stylesheet' href='css/style.css' type='text/css' media='all' />
通常は以下のように shortcut と共に使われ、アイコンをページに関連付けてくれる。また、HTML5で新しく導入されたものに size 属性があり参照するアイコンの大きさを示すため、icon と共に使われる。
<link rel="shortcut icon" href="favicon.ico" type="image/x-icon" />
HTML5 の仕様書で定義されている要素
全てのブラウザはサポートしている HTML 要素のリストを持っているが、このリストにない要素は「不明な要素」として取り扱われる。ブラウザが異なればこれらの取り扱いが違ってくる。
また、全てのブラウザは不明な要素をインラインレベル要素として表示するので、display: inline という CSS ルールを指定したのと同じように表示される。
HTML5 の新しい要素のいくつかはブロックレベル要素として定義されているので、それらの要素を古いブラウザでも使用する場合はスタイルを自前で定義する必要がある。
article,aside,details,figcaption,figure, footer,header,hgroup,menu,nav,section { display:block; }
しかし、IE9 より前の IE では不明な要素に対するスタイル指定がなんら適用されない。また IE8 までは明示的に要素を認識できない場合には、その要素を子要素を持たない空ノードとして DOM に挿入するため、不明な要素の直接の子要素となってほしい要素は兄弟要素となってしまう。
この問題を回避するには、実際に使う前に JavaScript を使ってダミーの要素を生成しておけば、その要素を認識し CSS を使ってスタイルを指定できるようになる(とのこと)。このダミー要素を DOM に挿入する必要はなく、単に(ページごとに)その要素を生成しさえすれば、IE が認識しない要素にもスタイルを指定できるようになる(とのこと)。
基本的なアイデアは以下のようなものらしい。
<!--[if lt IE 9]> <script> var e = ("abbr,article,aside,audio,canvas,datalist,details," + "figure,footer,header,hgroup,mark,menu,meter,nav,output," + "progress,section,time,video").split(','); for (var i = 0; i < e.length; i++) { document.createElement(e[i]); } </script> <![endif]-->
変数 e に要素の文字列からなる配列が代入される。
for ループでそれぞれの要素を生成するが、この時戻り値は無視されているので、作成された要素が DOM に挿入されることはない。
但し、このスクリプトはページの最初、なるべくなら<head>要素の中になければならない。それにより、IE はタグや属性をパースする前にこのスクリプトを実行するので、望ましい形で IE に取り扱われるようになる。
現在は、html5shiv として公開されているとのことで、以下のように公開されているバージョンを直接参照することもできるとのこと。
<head> <!--[if lt IE 9]> <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script> <![endif]--> </head>
またはダウンロードして以下のように読み込む。
<head> <!--[if lt IE 9]> <script src="dist/html5shiv.js"></script> <![endif]--> </head>
参考:
セクション関連要素は、HTML 文書の「文書構造」を明確化するために、HTML5 で新たに導入された要素のこと。
HTML4 までは、文書の階層構造を表すためには見出し要素(h1~h6要素)を用いるしかなく、そのため div 要素を使って入れ子のプロック構造を作成していたが div 要素は「意味を持たない」要素で文書構造を表す役割に使用するのは不適切で、スタイル目的の div 要素と混在することで文書構造が分かりにくくなっていた。
HTML5 からは、文書の論理構造を表すためのセクション関連要素が導入された。
また、セクション要素によって構築される文書の論理構造のことを、文書の「アウトライン」と呼び、セクション要素を用いてマークアップを行う際はアウトライン構造を意識する必要がある。
文書のセクションを表すための「セクション要素」には、以下のようなものがある。
HTML4 からの変更点として、HTML5 ではセクションごとに h1 要素を持つことができる。
また、HTML5 のセクション要素と古い暗黙のセクション要素(単独で使われるh1~h6要素)は予想もしないような形で干渉する可能性があるので、できればどちらか片方だけに統一した方がよいらしい。両方使用する場合は「HTML5 Outliner」でチェックして、文書アウトラインが正常に構成されていることを確認した方がよい。
文書の論理構造を表すための最も基本的な(セクション)要素で、その範囲が意味的な1つのまとまりであることを表す。
section 要素を入れ子にすることで、章セクション内の節セクション等を表すことも可能。
そのセクションが以下のような場合は、その意味に適した要素を使用するようにする。
また、その範囲をグループ化したいだけの場合は、div 要素を使用する。
ページ内の「本文部分」を表すために用いられる要素で自己完結したセクションを表す。
nav 要素はナビゲーションを表しそのサイト、またはページ内の移動で必要となる主要なリンクメニューのセクションで使用する。
以下のようなリンクメニューがナビゲーションに該当すると思われる。
以下のようなリンクメニューには適さない。
aside 要素は、主要なコンテンツから分離されたセクションを表し、仮にそのセクションを取り除いたとしても、メインコンテンツには影響が出ない部分で使用する。
また、aside 要素は、本文には関係しているが本筋からは外れているコンテンツを表す際に使用でき、以下のようなコンテンツで使用可能。
セクション要素を用いて、明示的に文書構造を表す場合には、異なるセクションで同じレベルの見出しを使用することができる。例えば、全てのセクションで h1 要素しか用いないことも可能。
または、実際のセクションの階層に合わせたレベルの見出しを与えることもできる。(スタイリングなどにも関係してきそうな気がする)
セクション要素で明示的にセクションを示し、適切なレベルの見出し要素を使うようにすることが推奨されている。
<section> <h1>1 タイトル</h1> <section> <h1>1.1 タイトル</h1> 本文 <section> <h1>1.1.1 タイトル</h1> 本文 </section> <section> <h1>1.1.2 タイトル</h1> 本文 </section> </section> <section> <h1>1.2 タイトル</h1> 本文 <section> <h1>1.2.1 タイトル</h1> 本文 </section> </section> …… </section>
1つのセクションには見出し要素を1つしか含めることができない。例えば、タイトルとサブタイトルを持つ文章を以下のようにマークアップすると、暗黙的なセクションが作成されてしまい意図しない結果を引き起こす。
<article> <h1>タイトル</h1> <!-- 暗黙的なセクションが作成されてしまい、意図したアウトラインと異なってしまう --> <h2>サブタイトル</h2> 本文 </article>
前述の例を、2つのレベルの見出し(タイトルとサブタイトル)を同時に持つ、1つのセクションにマークアップするには、見出しをまとめる hgroup 要素を使用することができるとなっていたが、現在は HTML5 の仕様から削除されたらしいので使用しないほうがいいみたい。
<article> <hgroup><!-- 現在は HTML5 の仕様から削除された --> <h1>タイトル</h1> <h2>サブタイトル</h2> </hgroup> 本文 </article>
header 要素は文書、またはセクションのヘッダを表すのに使用する。この要素の内容には、見出し(h1~h6, hgroup 等)が含まれているのが自然だが必須ではない。セクションの目次や検索フォーム、あるいは、関連ロゴ等をまとめるのに使用することができる。
文書や記事、セクションのヘッダを構成する要素をグループ化するときに使用する。
また、header 要素はセクショニング要素ではないため、新たなセクションを生成しないのでアウトラインに影響しない。
参考:HTML5/セクション/header要素 ヘッダを表す – TAG index
footer 要素は、文書、またはセクションのフッタを表すのに使用する。
body 要素の子要素として配置した場合は、文書全体のフッタを表し、セクション内に配置した場合は、そのセクションのフッタを表す。
また、footer 要素はセクショニング要素ではないため、新たなセクションを生成しないのでアウトラインに影響しない。
以下のような内容を配置することができる。
time 要素は、日付や時刻を表記する際に、24時間表記の時刻またはグレゴリオ暦による正確な日付を表す際に使用。日時を記述するのに、必ず time 要素を使用しなくてはならないわけではなく、コンピュータやブラウザが理解できるように日時を示すことが目的。
以下のように、時刻のみ、日付のみ、日付と時刻、といったパターンで記述できるほか、必要であればタイムゾーンも指定することが可能。
24時間表記の時刻(17時5分)
<time>17:05</time>
正確な日付(2014年11月8日)
<time>2014-11-08</time>
日時とタイムゾーン(2014年11月8日 17時5分30秒 日本時間 +09:00)
<time>2014-11-08T17:05:30+09:00</time>
datetime 属性が指定されている場合は、日時以外の内容を time 要素内に記述することが可能。
<time datetime="2014-11-08">今日</time>
この属性が指定されていない場合は、time 要素の内容は書式に沿った日付や時刻である必要がある。
また、pubdate 属性があったが現在は廃止されている。