折りたたまれたコンテンツを hidden=until-found でアクセスできるようにする

Joey Arhar
Joey Arhar

コンテンツ セクションを閉じる(アコーディオンと呼ばれることもあります)ことは、一般的な UI パターンです。ただし、閉じられたセクションに隠されたコンテンツは、ページ内検索で検索できなくなります。また、閉じられた領域内のテキスト フラグメントにリンクすることはできません。

これらの問題は、hidden=until-found HTML 属性と beforematch イベントで解決できます。非表示コンテンツのコンテナに hidden=until-found を追加すると、ブラウザはその非表示領域内のテキストを検索し、一致が見つかった場合にそのセクションを表示できるようになります。

これらの機能は Chrome 102 から利用可能になります。その仕組みを見てみましょう。

活用方法

ウェブサイトにすでに折りたたみ可能なセクションがあり、そのセクションを検索可能にしたい場合は、セクションを非表示にするスタイルを hidden=until-found 属性に置き換えます。ページに、セクションの表示状態と同期させる必要がある別の状態がある場合は、ブラウザによって要素が開かれる直前に hidden=until-found 要素で発生する beforematch イベント リスナーを追加します。

注意点

一貫したユーザー エクスペリエンスを実現するには、hidden=until-found コンテンツをページ内検索を使用せずに表示できるようにする必要があります。すべてのユーザーがページ内検索を使用するわけではありません。hidden=until-found をサポートしていないブラウザでは、ページ内検索による表示なしで、非表示のコンテンツが元の状態になります。

hidden=until-found をサポートしていないブラウザで非表示コンテンツを検索できるようにするには、そのブラウザで非表示コンテンツをいつでも展開できます。機能の検出は、beforematch イベント ハンドラの存在を確認することで行えます。

if (!(onbeforematch' in document.body)) {
  // expand all hidden content
}

hidden=until-found は、通常の hidden 属性が適用する display:none プロパティではなく、content-visibility:hidden CSS プロパティを適用します。これは、閉じているときにコンテンツを検索するために必要ですが、次のような副作用もあります。

  • getBoundingClientRect などの一部のレイアウト API は、hidden=until-found 要素内の非表示のコンテンツがスペースを占有し、ページ内に位置していると報告します。
  • hidden=until-found 要素の子ノードはレンダリングされませんが、hidden=until-found 要素自体にはボックスが引き続き表示されます。つまり、境界や明示的なサイズなどの CSS プロパティは、引き続きレンダリングに影響します。

次のデモは、hidden=until-found が適用されている要素にマージン、枠線、パディングを追加しています。非表示のコンテンツが表示される場所には、グレーの枠線付きのボックスが表示されます。このボックスは、非表示のコンテンツが公開されると、そのコンテンツで埋められます。これは非表示要素のボックスです。

この問題を回避するには、hidden=until-found を含むコンテナ内にネストされた要素に境界を追加します。