【テクニカル・上級編】空のp要素やhr要素の扱いとアクセシビリティ – HTML実践ガイド

なぜ我々は「空のp要素」という技術的負債を抱え込むのか:アクセシビリティと描画エンジンの深淵

モダンなWeb開発の現場において、CSSの余白調整(`margin`や`gap`)に苦しむジュニア層が、救いを求めるようにHTMLに挿入する「空の`p`要素」。あるいは、区切り線として無造作に置かれる`hr`要素。

これらは単なるマークアップの作法を超え、ブラウザのレンダリングパイプラインやアクセシビリティツリー(AOM)に予期せぬノイズを混入させる「サイレントキラー」になり得ます。本稿では、上級エンジニアの視点から、これらがなぜ単なる「行儀の悪いコード」以上のリスクを孕んでいるのかを解剖します。

—

1. 空の`p`要素:アクセシビリティツリーの「幽霊」

多くの開発者が誤解しているのは、「見た目が空なら、スクリーンリーダーも無視するだろう」という楽観論です。しかし、ブラウザのレンダリングエンジンは、空の`p`要素をDOMツリー上に保持し、アクセシビリティツリーにもその存在を伝達しようと試みます。

スクリーンリーダーの挙動はOSやブラウザの組み合わせによって揺らぎますが、空の`p`要素は「読み上げるべきコンテンツがないにもかかわらず、意味論的なセクションが存在する」という矛盾した情報を支援技術に送ります。これはユーザーにとって「何もない場所に焦点が当たる」という、ナビゲーション上の深刻なノイズとなります。

回避策:CSSレイアウトの責務を全うする

余白のために`p`要素を使うのは、HTMLのセマンティクスをレイアウトの犠牲にする行為です。私たちはCSSの`margin`や、よりモダンな`gap`プロパティ(Flexbox/Grid)を用いて、構造と装飾を完全に分離すべきです。

// 推奨されるアプローチ: コンポーネントの型定義でレイアウトを強制する
type LayoutProps = {
// margin-topを直接制御するのではなく、デザインシステムで定義されたトークンを使用する
spacing?: ‘sm’ | ‘md’ | ‘lg’;
children: React.ReactNode;
};

// CSSで解決すべき課題をHTMLタグで解決してはならない
const Spacer = ({ spacing = ‘md’ }: { spacing?: ‘sm’ | ‘md’ | ‘lg’ }) => (
// 構造的な意味を持たない場合は div や CSSの margin で完結させるのが鉄則

コメント

タイトルとURLをコピーしました