6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

アクセシビリティAdvent Calendar 2023

Day 2

HTML・CSSで要素を見えなくする方法とアクセシビリティ

Last updated at Posted at 2023-12-01

これは何

Webサービスなどを作っていると、しばしば「要素を非表示」にするタイミングがあります。

  • モーダルやドロップダウン、ツールチップなどアクションによって「表示/非表示」になる要素
  • 要素を開閉できるアコーディオンメニュー
  • レスポンシブでdesktop/mobileの時だけ表示したい要素

などなどです。

こうしたUIを実装するときに、選ぶ方法によっては、アクセシビリティツリー上で削除されたりされなかったりします。

そのため、適切な方法を選ばないと、本来読み上げもスキップしたかったのに読み上げられてしまったり、逆に読み上げはして欲しいのに読み上げられなくなったりします。

また、見た目的には非表示になっていても、hoverやfocusができる場合とできない場合があり、意図せぬ挙動にもつながります。

アクセシビリティツリーとは、DOMツリーに基づいて生成されるスクリーンリーダーなどの支援技術に使用される情報です

そこで、要素を見えなくする方法をレイアウト上で無視されるかとアクセシビリティツリー上でどう読み上げられるかでまとめてみました。

結論

結論は以下の図です。
HTML・CSSで要素を非表示にする方法は色々ありますが、主流っぽいものや比較的使われてそうなものを主観で集めました。

※そもそも表示されない要素はレンダリングしないという方法もありますが、今回はHTML・CSSに絞っているので入れてないです。

プロパティ レイアウト上で アクセシビリティツリー上で
display: none 無視される 削除される
visibility: hidden 無視されない 削除される
hidden (グローバル属性) 無視される 削除される
opacity: 0 無視されない 削除されない
transform: scale(0,0) 無視されない 削除されない

実際にそれぞれを指定してみると以下のようになります。

それぞれ3つの四角を並べて、真ん中の四角に非表示になるように指定しています。

See the Pen Untitled by kabechiyo_shunkaaizawa (@kabechiyo) on CodePen.

レイアウトが無視されるdisplay: nonehiddenは非表示になった四角の分左に詰まりますが、それ以外の指定はレイアウトが無視されないので見えなくてもスペースが空いています。

別途widthheight0にしたり、position: absoluteを指定することで、レイアウトからも無視される(ように見える)ようにできます。

また、それぞれの要素をアクセシビリティツリー上でみてみると以下のようになっています。

プロパティ アクセシビリティツリー上の表示
display: none StaticText "1"
StaticText "3"
visibility: hidden StaticText "1"
StaticText "3"
hidden (グローバル属性) StaticText "1"
StaticText "3"
opacity: 0 StaticText "1"
StaticText "2"
StaticText "3"
transform: scale(0,0) StaticText "1"
StaticText "2"
StaticText "3"

display: nonevisibility: hiddenhidden (グローバル属性)では、指定した要素がアクセシビリティツリー上から削除されるので「2」が読み上げられず、それ以外は読み上げられます。

要素を非表示にする方法それぞれについて

それぞれの方法の特徴も簡単にみていきます。

display: none

レイアウト上も無視されるようになり、アクセシビリティツリーからも削除されます。
要素を非表示にするだけでなくそもそもないものとして扱いたい時に使います。

visiblity: hidden

レイアウト上では無視せず、アクセシビリティツリー上からは削除されます。
要素の表示/非表示を切り替えた時に他の要素の位置に影響を与えたくない時などに使います。

hidden

CSSのプロパティではなく、グローバル属性として指定します。
レイアウト上も無視されるようになり、アクセシビリティツリーからも削除されます。
hiddenが指定された要素にdisplay: blockなどを指定すると上書きして表示されるようになります。

opacity: 0transform: scale(0,0)

要素は存在したままで、透明度を0にしたりサイズを0にすることで見えなくしています。
こうしたツリー上は存在しているけど、視覚的に見えないようにする方法は他にも色々とありますが、指定がシンプルなものをピックアップしました。
ツリー上で存在しているのでアクセシビリティツリー上で読ませたい時に使います。

終わりに

HTMLとCSSを使って要素を見えなくする方法は複数存在しますが、それぞれ特徴があるので、うまく使い分けましょう :thumbsup:

6
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?