uga.dev - A Front-end Engineer's shed

現在のテーマは「ライトモード」です。

`hidden="until-found"`をReactでも使いたい!

-

  • #React
  • #Web標準

HTMLのグローバル属性hiddenuntil-foundを指定することで、その中のコンテンツが見つかるまでの間だけ非表示にできます。

すべての HTML要素hidden コンテンツ属性設定を持ってもよい。hidden 属性は、次のキーワードと状態を持つ 列挙属性 である:

キーワード

状態

概要

hidden

非表示

レンダリングされない。

(空文字列)

非表示

レンダリングされない。

until-found

Hidden Until Found

レンダリングされないが、ページ内検索 および フラグメントナビゲーション で内部のコンテンツにアクセスできる。

引用:HTML Standard 日本語訳 https://momdo.github.io/html/interaction.html#the-hidden-attribute

Safari以外の主要ブラウザでは利用可能な仕様[1]ですが、まだReact@19現在ではサポートが追いついておらず型エラーが発生し、Reactでは値のない論理属性として扱われてしまいます。

jsx
<div hidden="until-found" />

暫定的にhooksで解決する

use-hidden-until-found.ts
import { useEffect } from 'react';

export const useHiddenUntilFound = () => {
  useEffect(() => {
    document.querySelectorAll('[data-hidden-until-found]').forEach((node) => {
      node.setAttribute('hidden', 'until-found');
      node.removeAttribute('data-hidden-until-found');
    });
  }, []);

  return {
    'data-hidden-until-found': '',
    hidden: true,
  };
};

refで解決する方法が思い浮かびますが、Reactがサポートした時にあちこち直さないといけなくなるのも大変です。

そこでhookを作って対応して、必要無くなったら一括置換で削除することにします。

jsx
import { useHiddenUntilFound } from '@/hooks/use-hidden-until-found';

export const Component = () => {
  const untilFound = useHiddenUntilFound();
  return <div {...untilFound}>見つかるまで隠されているコンテンツ</div>;
};

本件についての議論はGitHub上にIssueやPull Requestが立っています[2][3]が、Safariがサポートするまでは進まなさそうです。

until-foundは、ユーザー体験とアクセシビリティの両面で優れた特性を持つ属性です。ReactやSafariでも正式にサポートされることで、より自然に活用できる日が来ることを期待しています。

脚注

† YOUR COOKIE PREFERENCES †

当サイトは「うぇぶ⭐︎ひょーじゅん!」の二次創作を扱う非公式ファンサイトです。

  • 当サイトの画像および内容などの無断転載、加工使用、再配布、直リンクなどは禁止です。
  • 表示がおかしい場合はIE6.0以上、800×600以上の環境でご覧ください。
  • この先、BGMが自動再生されます。不要な方はBGMオフのリンクからご入場ください。

uga.dev

推奨環境:Windows XP IE6.0↑/フォントサイズ:中↑/解像度:1024x768↑

なお、ここまでの内容はすべてうそです。

当サイトでは Google社が提供するアクセス解析ツール「Google Analytics」を利用しています。

Cookieの利用に同意していただける場合はEnterからご入場ください。

もっと詳しく

「Google Analytics」は利用状況の把握およびサービス改善のためにCookieを使用して、利用者のウェブサイト訪問履歴などの情報を収集しています。

収集されたデータは匿名で集計されており、個人を特定する情報は含まれません。

「同意しない」を選択すると、Cookieを利用せずに当サイトが閲覧できます。

同意後もプライバシーポリシーページから再度拒否することができます。

詳細はGoogleのプライバシーポリシーおよびオプトアウト方法をご確認ください。