visibility: hidden の中の visibility: visible なアイツ
visibility: hidden で css的に要素を消すということはあるあるだと思うんですが、その消している要素は、見た目的には存在していないようでして、しっかりとDOM としても、要素としても存在しているのでスクロールのパフォーマンスなどにも影響してくることはよく知られている。
しかし、なんらかの事情で display: none; できないこともあったり、css アニメーションでいい感じに消したり表示したい、となると、やはり visibility: hidden と opacity: 0, oveflow: hidden, あるいは clip などを使って、消すことも多い。
そんなときに気をつけたいのは、なんかしらの思惑と思惑が交錯した結果、その子要素に visibility: visible な要素があるときだ。細かいことは置いといて、見ていただければわかる。
この青い丸。恥ずかしげもなくここに存在しているが、実は、visibility: hidden された wrapper の中にいるのだ。visibility: visible な要素は、そんな中でもしっかりとそこにいる上に、visible なのだ。これは理解しがたい。
親がでしゃばりなら、その子もまたでしゃばり、という理屈はわかる。親が引っ込み思案なのに、子はオラオラ系、まぁ、ないこともないか。
hidden
要素のボックスは不可視になります (描画されません) が、レイアウトには通常通り影響します。子孫要素は visibility が visible に設定されていれば可視になります。
引用元:visibility - CSS: カスケーディングスタイルシート | MDN
といったように、visibility: hidden している要素は position: abusolute してスタッキングコンテキストを外れたていたりすると忘れがちであるが、ただ見えないだけでレイアウトにもしっかりと影響する。
しかし、スクリーンリーダーにはその存在が知られることはない。 position: absolute して visibility: hidden しているからといって、安心はできないのだ。