見た目で区別が付いているものは、機械には区別が付いていない
ブログ一覧を見て、見出しの構造を確かめました。ページの題名にあたる見出しが、1つもありませんでした。
画面ではちゃんと「ブログ」と大きく出ています。その下に記事の題名が並んでいます。誰が見ても、どちらが上でどちらが中身かは分かります。分からないのは、字の大きさが見えない側だけでした。
見た目で伝わっている区別が、機械には伝わっていなかった話です。何が起きていたか、どう直したか、そして「見えるから伝わっている」という思い込みについて書きます。
全部が同じ格で並んでいた
見出しには段階があります。h1 がそのページの題名、h2 がその中の章、というように、番号が入れ子の深さを表します。
一覧ページを調べたときの中身は、こうなっていました。
| 画面での見え方 | 実際の見出し |
|---|---|
| ブログ(大きい文字) | h2 |
| 記事の題名 | h2 |
| 記事の題名 | h2 |
| 記事の題名 | h2 |
h1 はどこにもありません。そして「ブログ」と個々の記事が、同じ h2 で横並びになっていました。
画面上は、文字の大きさが違うので迷いません。「ブログ」は太くて大きく、記事の題名はそれより小さい。人は大きさの差を、上下関係として読み取ります。
文字の大きさは見た目の指定であって、構造の指定ではありません。読み上げソフトが見出しをたどるとき、参照するのは番号のほうです。
番号が同じなら同じ格です。したがって、たどっていくと「ブログ」も1本の記事も、並列の項目として現れます。このページが何のページなのかを名乗る見出しが、存在しないことになります。
見出しは飾りではなく、目次として使われる
見出しに番号を付ける意味は、画面を上から順に見られない人にとってはっきり出ます。
読み上げソフトには、見出しだけを拾って移動する機能があります。本文を全部聞かずに、章の一覧から目的の場所へ飛べます。見出しの番号は、そのまま目次の階層になります。
階層が平らだと、この目次は「同じ深さの項目が延々と並んだもの」になります。どれがページの題名で、どれが中身なのかが分かりません。全部を聞いて中身から判断することになります。
検索エンジンから見ても事情は似ています。ページの主題を示す位置に何も無く、記事の題名だけが同じ格で並んでいる状態です。
直すのは1か所ではなかった
見出しは共通の部品で描いていました。ここが便利であると同時に、問題が広がった理由でもあります。
部品の中で h2 を決め打ちしていたので、どのページで使っても必ず h2 になります。ページの題名として使いたい場合でも h2 でした。
そこで、部品の側に「どの格で出すか」を渡せるようにしました。既定は今までどおり h2 のままにして、ページの題名として使うところだけ h1 を指定します。
<SectionTitle as="h1">ブログ</SectionTitle>
見た目は変えていません。字の大きさも余白もそのままです。変えたのは、機械が読む側の情報だけです。
他のページも同じだった
1か所で起きているなら、他でも起きています。全ページを取り寄せて h1 の数を数えました。
| ページ | 直す前 | 直した後 |
|---|---|---|
| トップ | 1つ | 1つ |
| ブログ一覧 | 0 | 1つ(ブログ) |
| 用語集 | 0 | 1つ(用語集) |
| 用語集の分類 | 0 | 1つ(分類名) |
| プロフィール | 0 | 1つ(プロフィール) |
| プライバシーポリシー | 0 | 1つ(ポリシー名) |
トップだけが正しく、残りは全滅でした。理由も同じで、トップは共通部品を使わずに直接書いていたからです。共通化した側だけが揃って間違っていました。
この確認は難しくありません。各ページのHTMLを取り寄せて、h1 がいくつあるかを数えるだけです。0でも2以上でも、何かおかしい合図になります。
難しかったのは、確かめようと思うことのほうでした。画面上は最初から正しく見えていたので、疑う理由がありませんでした。
今回の学び
まず、見た目で付けた区別は、見た目の外には出ないということ。字を大きくすれば人には上位だと伝わりますが、それは番号にも構造にも変換されません。人に伝わっているかどうかと、機械に伝わっているかどうかは別に確かめる必要がありました。
次に、共通部品は、正しさも間違いも同じだけ広げること。見出しの部品を1つにまとめたおかげで、直すときは1か所で済みました。同じ理由で、間違いも5ページに均等に配られていました。まとめた部分ほど、最初の設計を疑う価値があります。
そして、「壊れていない」と「正しい」は違うということ。h1 が無くてもページは表示され、リンクも動き、誰も困った報告をしません。症状の出ない不具合は、症状を待っていても見つかりません。数えて確かめるまで、無いことに気づけませんでした。
関連記事

1語1ページにしなかった理由
用語集を作るとき、1語につき1ページにするか、まとめて1ページにするか。解説を厚くすると決めた時点で前提が変わり、最初の判断を見直すことになった。薄いページを大量に作るリスクと、本番のPHPを触れないという制約から、分野別8ページという形にたどり着いた記録。

そのページは何だと名乗っているか
用語集の分類ページを調べていて、妙な指定に気づきました。このページは「記事」だと名乗っていました。 中身は用語が並んだ一覧です。公開日もなければ、書いた人もいません。それでも、SNSや検索エンジンに向けては「これは1本の […]

一部だけ足したつもりが、丸ごと置き換わっていた
1行足したつもりでした。実際には、そのページの共有画像が消えていました。 しかも消えたのは、その日に触ったページだけではありません。調べたら、以前から9ページで同じことが起きていました。画面には出ず、動作も壊れず、誰も気 […]