納品してもらった WEB サイトで h1 タグのCSSが下記のような非表示になっていました
h1.visually-hidden { position: absolute; clip: rect(1px, 1px, 1px, 1px); clip-path: inset(50%); margin: -1px; padding: 0; border: 0; height: 1px; width: 1px; overflow: hidden; }
Bootstrap などにも .sr-only
のようなスクリーンリーダー専用となる非表示にできるクラスが定義があります
Hide an element to all devices except screen readers with
.sr-only
. Combine.sr-only
with.sr-only-focusable
to show the element again when it’s focused (e.g. by a keyboard-only user). Can also be used as mixins.
cf. Screenreaders · Bootstrap
非表示の隠しキーワードは SEO のペナルティになるという記憶があったのですが、現代ではアクセシビリティ面でスクリーンリーダー用に非表示にしたテキストを用意する事もあるので非表示テキストが SEO 的にどうなっているのか気になって改めてざっくり調べてみました。
Google のウェブ検索のスパムに関するポリシー
隠しテキストと隠しリンク
隠しテキストや隠しリンクは、検索エンジンを操作することのみを目的としてページにコンテンツを配置しながら、人間のユーザーには見えにくいようにする行為です。Google のポリシーに違反する隠しテキストや隠しリンクの例としては、次のようなものが挙げられます。
- 白の背景で文字の色を白にする
- テキストを画像の背後に置く
- CSS を使用してテキストを画面の外に配置する
- フォントサイズまたは不透明度を 0 に設定する
- 目立たない 1 文字(段落の中頃にあるハイフンなど)のみをリンクにすることで隠す
現在では、コンテンツの表示 / 非表示を動的に制御する方法を活用して、ユーザー エクスペリエンスを高めるウェブデザイン要素が多数存在します。以下の要素は Google のポリシーに違反していません。
- 追加コンテンツの表示 / 非表示を切り替えるアコーディオンやタブ形式のコンテンツ
- 複数の画像やテキスト段落を切り替えるスライドショーやスライダー
- ユーザーが要素に対してなんらかの操作をしたときに追加コンテンツを表示するツールチップや類似のテキスト
- スクリーン リーダーを使用するユーザーのエクスペリエンスを高めることを目的として、スクリーン リーダーのみがアクセスできるテキスト
cf. Google ウェブ検索のスパムに関するポリシー | Google 検索セントラル | ドキュメント | Google Developers
- 基本的に隠しテキストや隠しリンクはペナルディになる
- ただし、スクリーンリーダーがアクセスできるテキストはスパムにならない
非表示テキストでスクリーンリーダーがアクセス可能なものと不可能になるものがある
Techniques for hiding content
cf. WebAIM: CSS in Action - Invisible Content Just for Screen Reader Users
🙅 ペナルティを受ける可能性がある CSS
display:none
,visibility: hidden
- スクリーンリーダがアクセスできない非表示の方法
width:0px
,height:0px
やfont-size: 0px
のような 0ピクセルサイズになるもの- 高さ・幅がない要素は殆どのスクリーンリーダーが読み取れない
🤔
text-indent: -10000px
- 画面外から外れているだけなのでスクリーンリーダーはアクセスができる
- ただしフォーカス可能な要素だと見えないがフォーカスしてしまうのでキーボード操作のUXを損ねる可能性がある
🙆 スクリーンリーダーが読み取れる非表示テキスト
1. Absolutely positioning content off-screen
.sr-only { position:absolute; left:-10000px; top:auto; width:1px; height:1px; overflow:hidden; }
⚠ この方法はリンクやフォームなどナビゲーション可能な要素はフォーカスができてしまうので使用しないほうが良い
2. CSS clip
.sr-only { clip: rect(1px, 1px, 1px, 1px); clip-path: inset(50%); height: 1px; width: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute; }
clip
を用いて視覚的に非表示にする方法もスクリーンリーダーでは読み取ることができる
結論と考察
- CSSの書き方でペナルティを受ける非表示テキストとスクリーンリーダー用だと判断される非表示テキストがある
h1
のような見出しをスクリーンリーダー用にした場合 ペナルティを受けるのかははっきりしない- 現状
h1
をスクリーンリーダー専用の非表示テキストにしていても検索結果にも出ているのでペナルティは受けてなさそう
- 現状
- おそらく単純なコードでの判断ではなく、機械学習などを用いて evil な隠しキーワードかどうかを判定しているのではないか?
- ただ
h1
のような文章構造を表すセマンティック要素がスクリーンリーダーだけで必要になるようなケースはほぼ無い (画像表現でもalt
を設定するなどできるので)と思うので、セマンティック要素 を積極的にスクリーンリーダー専用の非表示テキストする必然性は薄そう
[参考]
- Google ウェブ検索のスパムに関するポリシー | Google 検索セントラル | ドキュメント | Google Developers
- WebAIM: CSS in Action - Invisible Content Just for Screen Reader Users
- WAI-ARIAの基本 - ウェブ開発を学ぶ | MDN
- Semantics (セマンティクス) - MDN Web Docs 用語集: ウェブ関連用語の定義 | MDN
- HTML5セマンティック要素
- アクセシビリティとSEO共通の最適化――「文字サイズと色コントラスト」「リンクとアンカーテキスト」 | Moz - SEOとインバウンドマーケティングの実践情報 | Web担当者Forum