記事タイトル
セクション1
本文
ページの作成
親となるページを選択してください。
| この記事の要点 |
|
HTML には見出しを表す から の 6 段階のタグがあります。HTML 4 時代から存在し、現代の HTML5 でも中核的なセマンティック要素です。
記事のタイトル
大見出し
中見出し
小見出し
さらに小見出し
最小の見出し
見出しは階層構造を作るためのものです。「文字を大きくしたいから h2 を使う」のは間違いで、論理構造に合わせて使います。
HTML 完全ガイド
基本構造
DOCTYPE 宣言
html / head / body 要素
テキスト要素
段落
見出し
h1~h6 の使い分け
リンクと画像
タイトル
いきなり h3
小さく見せたい注釈
従来 (HTML 4 時代) は1 ページに h1 は 1 つが原則でした。HTML5 では や ごとに h1 を持ってよいという セクショニング コンテンツ の概念が導入されましたが、ブラウザの実装が追従しなかったため、現在も「h1 はページに 1 つ」が事実上のベストプラクティスです。
article が複数並ぶブログ一覧ページなどでは、各 article に h2 を使うのが無難HTML5 で導入されたセクショニング要素と組み合わせて使います:
| 要素 | 意味 | 典型的な中身 |
|---|---|---|
| ページ/セクションのヘッダ | h1 とロゴ / ナビ |
| 主要コンテンツ | h1 とメイン本文 (1 ページ 1 個) |
| 独立した記事 | 記事タイトルの h1/h2 |
| テーマごとのセクション | h2 とその段落 |
| ナビゲーション | リンク一覧 |
| 本文と独立した補足 | サイドバー |
| ページ/セクション フッタ | コピーライト等 |
記事タイトル
セクション1
本文
細目
セクション2
見出しはセマンティクスを保ったままデザインを変えるのが原則です。
/* ブラウザのデフォルト (Chrome 系) */
h1 { font-size: 2em; margin: 0.67em 0; font-weight: bold; }
h2 { font-size: 1.5em; margin: 0.83em 0; font-weight: bold; }
h3 { font-size: 1.17em; margin: 1em 0; font-weight: bold; }
h4 { font-size: 1em; margin: 1.33em 0; font-weight: bold; }
h5 { font-size: 0.83em; margin: 1.67em 0; font-weight: bold; }
h6 { font-size: 0.67em; margin: 2.33em 0; font-weight: bold; }
/* カスタムデザイン */
h1 {
font-size: 2.5rem;
border-bottom: 3px solid #2563eb;
padding-bottom: 0.3em;
color: #1e293b;
}
h2 {
font-size: 2rem;
border-left: 5px solid #2563eb;
padding-left: 0.5em;
margin-top: 2em;
}
h3 {
font-size: 1.5rem;
color: #475569;
}
スクリーンリーダー (NVDA、JAWS、VoiceOver) のユーザーは、見出しを使ってページをナビゲートします:
h キーで次の見出しへジャンプ、1~6 でレベル別ジャンプ
セクション見出し
セクション見出し
| 警告 | 意味 | 対処 |
|---|---|---|
| Heading elements are not in a sequentially-descending order | h1 → h3 など階層スキップ | h2 を挟む |
Document does not have a heading | h1 が無い | h1 を追加 |
| Empty heading | 見出しの中身が空 | 内容を入れる、または削除 |
| Multiple h1 | h1 が複数 | 1 つにする (article 内除く) |
// h2/h3 から目次を自動生成
const toc = document.createElement('nav');
toc.innerHTML = '目次
';
const ul = document.createElement('ul');
document.querySelectorAll('main h2, main h3').forEach((h, i) => {
const id = `heading-${i}`;
h.id = id;
const li = document.createElement('li');
li.style.marginLeft = h.tagName === 'H3' ? '1em' : '0';
li.innerHTML = `${h.textContent}`;
ul.appendChild(li);
});
toc.appendChild(ul);
document.querySelector('main').prepend(toc);
| NG | 理由 | 正解 |
|---|---|---|
| 装飾目的で h2 使用 | 論理構造を壊す | + CSS |
| 1 ページ 5 個の h1 | SEO で意図が散る | h1 は 1 つ、他は h2 |
| h1 → h4 と飛ばす | スクリーンリーダー混乱 | h2, h3 を挟む |
| h2 を空にする | 意味なし、警告 | 削除 or 内容を入れる |
| h6 で本文の強調 | 使用目的が違う | |
Q: ブログ記事のタイトルとサイト名、どちらが h1? Q: section 内で h1 を使ってよい? Q: h7, h8 は無い? ページの作成
親となるページを選択してください。
子ページはありません
A: 記事タイトルが h1。サイト名は記事ページでは や
A: HTML5 仕様では OK ですが、実際の検索エンジン / 支援技術の実装が追従していないので使わない方が無難。各 section は h2 から始めるのが現実的なベストプラクティスです。
A: HTML 標準には h6 までしかありません。それより細かい階層が必要な場合は、コンテンツの構造を見直して階層を浅くすべきです。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
コメントを削除してもよろしいでしょうか?
掲示板