折りたたまれたコンテンツを 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 を含むコンテナ内にネストされた要素に枠線を追加します。