「SEO に強い HTML の書き方」というツイートがそこそこバズっていて、その内容に対して駆け出しエンジニアの方たちが「参考になった」などと称賛の声を挙げていたのを見かけて思うところがあったのでこの記事を書きました。
元ツイの概要は次の通り。
- body > main > article > sectionに
- h1は 1 ページに 1 つ(要キーワード)
- 見出しタグは毎度 section で囲む
- ヘッダーメニューは nav で囲む
- 画像に適切な alt を設定する
- title / description を書く
- 階層を意識して書く
- div はあまり使わない
- 画像は p で囲む
この記事は元ツイおよび元ツイの投稿者を批判する意図で書いたものではなく、あくまで挙げられている内容に対する個人的見解をまとめたものです。 正しいか正しくないかをそれぞれの項目のはじめに書いていますが、あくまで僕個人の考えであってデファクトスタンダードではないことはご理解ください。
加えて「SEO に強い」とはあるものの、挙げられている内容の多くがページ評価には「直接は」影響しない(結論) と考えているので、別視点からの見解が多く含まれていることをご了承お願いします。
入れ子ルールには間違いはないが、コンテンツによっては必ずしも正しいとは限らない。
仮に article と section を両方使うとなったら僕もbody > main > article > sectionのようにマークアップすると思うし、これに関しては問題はないと思う。あと、ランドマークやセクショニング要素を積極的に使おうとする姿勢は褒めるべき。
なんとも言えない。「h1 は 1 ページに 1 つでなければならない」という文脈なら間違い。「個人やチームで h1 は 1 ページに 1 つというルール付けをしている」のなら正しい。どちらにせよ h1 はほぼほぼ SEO には影響しないものだと思っている。
https://webtan.impress.co.jp/e/2020/05/11/35869
https://webtan.impress.co.jp/e/2018/04/20/29008
現在の仕様で認められているやり方で、かつ Google 自体が公に h1 は検索には影響はないと発表しているのにも関わらず、もし現在でも h1 は SEO に関係しているとなったらGoogle には失望する。
ただし、あくまで SEO に影響しないというだけであって見出し設計そのものは重要。見出しはアクセシビリティに大きく影響するため。
また、検索エンジンはtitle 要素が見つからなかった場合は h1 を代用として使うこともあるという点も留意したほうが良い。つまり、h1 とタイトルが同じような内容になるのは問題ではないし、あくまで責務が違うだけで役割は一緒だと思っている。
h1 をロゴに指定するのはどうなんだ論争が Twitter で定期的に勃発するのでついでに自分の考えを述べておくと、トップページのサイトタイトルとロゴの文言が同じなら h1 はロゴに指定したほうが良いというのが個人的な見解。加えて、支援技術利用者の 6 割が「ページタイトルを h1 に指定するのが好ましい」というWebAIM のアンケート結果もある。もちろん、ここらへんは各々の価値観に依るのでこれが正解・不正解とかは無い。
あとは、チーム内のコーディング規約的に複数の h1 要素を許容しないほうが見出し設計の引き締めに貢献できる可能性はある。
これは間違い。見出しを毎度 section で囲む必要は無い。
仮に見出しを毎度 section で囲むとなったら、以下のマークアップはアウトライン的に意図しない構造になってしまう。
<main><section><h1>会社概要</h1></section><section><h2>社長による挨拶</h2></section></main>section や article を利用する場合は見出しを含めることが推奨されている(※念の為に触れておくと section の中に見出しがなくても仕様違反ではない)が、見出しだけでも暗黙的にアウトラインが形成されるため必ずしもセクショニングコンテンツで囲む必要はない。
ただし、基本的には暗黙的なアウトラインは避けて明示的にしたほうが良い。
例えば以下のマークアップだと注釈は「本日のイベント」の持ち物であることが望ましいが、section を無くして暗黙的に形成すると「ビンゴ大会」の持ち物になってしまう。
<section><h2>本日のイベント</h2><section><h3>くじびき</h3><p></p></section><section><h3>ビンゴ大会</h3><p></p></section><p>※非常事態宣言を受けてイベント終了時刻は20時となります。</p></section>SEO には直接影響しないとは思いつつ、多くの場合においてこれは正しい。
nav 要素にはaria-labelもしくは不可視の見出しを含めた上でaria-labelledbyでラベル付けすることを推奨する。ラベル付けをすることでその nav 要素が「何のナビゲーションなのか?」を支援技術利用者に伝えることができるため。このラベルはジャンプ機能でも読み上げられるので、ドキュメント上に nav 要素が複数あっても目次となるメインメニューを的確に選択できるようになる。
<navaria-label="サイト内メニュー"><ul><li></li><li></li></ul></nav><navaria-labelledby="aria-global-nav"><h2id="aria-global-nav"class="visually-hidden">サイト内メニュー</h2><ul><li></li><li></li></ul></nav>後者のマークアップの場合は見出しジャンプ機能でもナビゲーションへジャンプできるため、より親切な設計かもしれない。
また、ヘッダーのナビゲーションとは違うが、パンくずリストも「現在位置」等とラベリングした上で nav 要素で囲んでおくと良いだろう。
<navclass="breadcrumb"aria-label="現在位置"><olclass="breadcrumb__list"itemscope="itemscope"itemtype="http://schema.org/BreadcrumbList"><liclass="breadcrumb__item"itemprop="itemListElement"itemscope="itemscope"itemtype="http://schema.org/ListItem"><aclass="breadcrumb__link"href="#"itemprop="item"><spanitemprop="name">ホーム</span></a><metaitemprop="position"content="1"/></li><liclass="breadcrumb__item"itemprop="itemListElement"itemscope="itemscope"itemtype="http://schema.org/ListItem"><aclass="breadcrumb__link"href="#"itemprop="item"><spanitemprop="name">会社概要</span></a><metaitemprop="position"content="2"/></li><liclass="breadcrumb__item"itemprop="itemListElement"itemscope="itemscope"itemtype="http://schema.org/ListItem"><aclass="breadcrumb__link"href="#"itemprop="item"aria-current="page"><spanitemprop="name">業務内容</span></a><metaitemprop="position"content="3"/></li></ol></nav>ちなみに、2021 年 1 月 29 日以降 data-vocabulary.org マークアップで実装されたパンくずリストは Google のリッチリザルト機能でサポートされなくなりました。非推奨勧告が出された後も「パンくずリスト 作り方」等で data-vocabulary.org を用いたパンくずリストの作り方を紹介している文献が多くヒットしますが、Google のリッチリザルト機能で反映されるためにも data-vocabulary.org 以外の方法を使って実装することを推奨します。
これは正しい。ただし、検索エンジン意識というよりかは支援技術を利用して訪れているユーザーに「その画像がどういった画像なのか?」という画像の意図を伝えるアクセシビリティ面が大きい。何かしらの事情で画像が読み込めなかった場合には alt 属性に指定した代替テキストが表示されることも意識したほうが良い。
ただし、SEO 目的でその画像が本来持っていない情報を alt 属性で持たせたり、過剰にキーワードを持たせるのは NG。
装飾目的の画像やユーザーにイメージを膨らませるために用いる画像など、代替テキストが不要な場合でも空の alt 属性を指定して alt 属性自体は省略しないようにする。alt 属性が無いと支援技術は画像パスを読み上げてしまうため、支援技術を利用しているユーザーにとっては非常に使いにくいサイトになってしまう。
個人的な見解としては alt 属性の記述をコーダーに任せるのではなく、他のテキストと同様にコンテンツのライターが書いた方がいい気がする。
これは正しい。discription の有無はページの評価には影響しないものの、リザルトを育ててクリック率を上げるという意味では検索最適化である。
これは正しい。アウトラインの大切さについては「見出しタグは毎度 section で囲む」の項目で触れたとおり。
特にコメントすることはない。
言い方が良くない。div の数が SEO に影響するなら、多くの Web サイトは SEO でマイナス評価になってしまう。
適切な意味のあるタグを使った上で、どれにも当てはまらない場合は最後の手段として div を使うとするならば正しい。このことは仕様書にも「他の要素が適切でない場合、著者は最後の手段の要素として div 要素を検討することを強く推奨する。div 要素の代わりにより適切な要素を使用することは、読者に対してより良いアクセシビリティと著者に対するより容易なメンテナンス性につながる。」と書かれている。
https://twitter.com/tak_dcxi/status/1293722802801897472
過去ツイでも触れたが、僕は初めは div や span を封じてマークアップを行い、CSS 設計をする段階(レイアウトを実現するための HTML を追加する段階)で div や span の利用を解禁している。こうすることでセマンティックなマークアップを保ったまま思う存分 div や span を使うことができるようになる。
あとは過去の投稿でも触れたが、CSS 設計的には div や span が増えることを気にしないほうが良い。
本当に不要な div や span は淘汰すべきではあるが、HTML は情報構造に意味づけを主とする言語。レイアウトや装飾にも紐付いているので、コンポーネントそのものとコンポーネントを配置するレイアウトの要素で分けるなど、あえて div と span を増やして冗長にコーディングすることも大切である。
確かに div を極限まで減らしてシンプルに書いた方が HTML の見た目はすっきりだろう。しかし、要素を減らすことで減った要素が持っていたスタイリングのルールを残った要素に受け継ぐこととなり、要素それぞれが持つ責任が重くなる。それゆえ保守性や拡張性に影響が出るかもしれない。
意味のある div や span なら積極的に使おう。要素の持つスタイリングの責任は分散しよう。何度も言うようだけれど将来の予期せぬ変更を意識した冗長なコードは保守性につながる。
むしろ、タグの数を一つでも減らしたいという理由で不安定で保守性や拡張性の低いスタイル指定をしてしまうことを避けるべきだ。
div や span が少ないコードは美しいという風潮があるが、そういったコードに限って保守や運用が困難なパターンが多い。HTML のリファクタリングよりも CSS のリファクタリングのほうが圧倒的に難易度が高いということは意識しておいたほうが良い。
SEO にはあまり関係ない。
画像を p で囲むことには問題はないが、言い方に語弊があるという印象。
HTML とは関係ない話ではあるが、ブロック的な画像は何かしらで囲っておいたほうがスタイリングしやすくなるため僕自身は画像を裸のまま置くことはあまりない。CSS 無効時の見た目も気になるし。
あと、これは多分偉い人に怒られそうだけど、高度なセマンティクスな HTML は更新する人のスキルが疎らな場合、それがかえって厳しいルールとなってそのルールを守るためにある程度の知識が更新者に必要になるため注意。コピペして済ましてしまう人も多く、知識に乏しい人や仕事がいい加減な人が更新する場合にはセマンティクスが裏目に出ることがあるということを意識しておくと良いかもしれない。
なので、なんか危なさそうな感じの人が更新する可能性がある場合には figure とか複雑な要素は使わずに更新者の選択肢を絞れるところまで絞るために敢えて div で囲んでおくのも一つの方法だと思う。
でももちろん良くないと思うので、何かいいアイデアを持っている人がいたら教えてほしい。
SEO にはあまり関係ない。
個人的には SEO を第 1 にコンテンツ制作やマークアップを行うのではなく、多くのユーザーにとって利益のある Web サイトを作ることを第 1 にして、その結果 SEO も施されているというのが理想形だと思う。だから SEO を考えないことが SEO なのかも知れない(語彙力不足)。
今回の「SEO に強い HTML の書き方」で挙げられた項目はSEOを焦点にした場合は疑問はあるものの、セマンティクスやアクセシビリティ面を考慮したら一部引っかかる点こそあれど、しっかり説明付ければ言っている自体は至極まっとう…なのかもしれない。説明が足りなかっただけだと思うし、SEO を焦点に当てなければ荒れはしなかっただろう。
あとは実装者にできる SEO は Search Console のエラーを地道に潰すことくらい。
例の「SEO に強い HTML の書き方」ツイートには多くの称賛のリプや引用 RT が駆け出しエンジニアの方から寄せられていましたが、そういった方々は流れてくる情報を盲信するのではなく「どうしてそれが SEO に効果があるのか」などをしっかり調べてから判断する癖をつけておくと良いと思います。
これは僕のツイートや記事にも言えることで、この記事にも間違いがあるかもしれませんし、皆さんにとって正しい内容ではないと思います。大切なのは、誰かが発信した情報を思考停止で鵜呑みにするのではなく、自分で理解を深めようとアクションを起こすことだと思います。この記事にも「僕の解釈を含んだ情報」が多く含まれていますからね。
僕含めて人間誰でも誤った情報を発信してしまうことはありますし、それは仕方がないものだと思っています。ただ、そういった情報が自分にとって正しいものなのかどうか、それを見抜く鑑識眼を身に着けて欲しいと駆け出しエンジニアの方にそっと伝えておきます。
バッジを受け取った著者にはZennから現金やAmazonギフトカードが還元されます。
