要素の表示・非表示

display visibility opacity hidden

要素の表示・非表示を切り替える方法はいくつかあり、それぞれレイアウトやアクセシビリティへの影響が異なります。

🔗 このページはバニラJS(ブラウザ標準API)を使った表示・非表示の実装です。React / Framer Motion を使った実装は見せる・隠すページを参照してください。

デモ:display(レイアウトから消える)

前の要素
表示切替要素
後の要素

非表示にすると後の要素が詰まる(レイアウトから除外される)

デモ:visibility(スペースは保持)

前の要素
表示切替要素
後の要素

非表示でもスペースが残る(レイアウトは変わらない)

デモ:opacity(透明度)

opacity: 1.0の要素

0でも要素は存在し、クリックイベントは発生する(pointer-events:none が必要)

比較:表示切替の方法

方法レイアウトクリックスクリーンリーダーアニメーション
display:none❌ 消える❌ 不可❌ 読まれない❌ 不可
visibility:hidden✅ 保持❌ 不可❌ 読まれない✅ 可能
opacity:0✅ 保持✅ 発生する✅ 読まれる✅ 滑らか
hidden属性❌ 消える❌ 不可❌ 読まれない❌ 不可

コード例

js
const el = document.querySelector('.box');

// display(DOMから除外)
el.style.display = 'none';
el.style.display = 'block';  // 'flex', 'grid' なども

// visibility(空間は残る)
el.style.visibility = 'hidden';
el.style.visibility = 'visible';

// opacity(透明化、イベントは残る)
el.style.opacity = '0';
el.style.opacity = '1';

// hidden 属性
el.hidden = true;   // display:none と同等
el.hidden = false;

// フェードイン・アウト(opacityとtransitionの組み合わせ)
// CSS: .box { transition: opacity 0.3s; }
el.style.opacity = '0';
el.style.pointerEvents = 'none'; // クリック無効化
// 表示するとき
el.style.opacity = '1';
el.style.pointerEvents = '';

NEWcontent-visibility: auto(レンダリング最適化)

画面外の要素のレンダリングをスキップし、長いページの描画パフォーマンスを大幅改善するCSSプロパティです。

js
/* CSS */
.section {
  content-visibility: auto;
  /* レンダリング前のサイズを指定(レイアウトシフト防止) */
  contain-intrinsic-size: 0 500px;
}

/* 非表示にする(display:none と異なり、後で表示されたとき自動描画)*/
.section {
  content-visibility: hidden;
}

/* ブラウザ対応: Chrome 85+, Edge 85+, Firefox 125+ */

🤖 AIプロンプトテンプレート

以下のようなReactのstate管理による要素の表示・非表示切り替えのサンプルコードを生成してください:
- useStateでboolean状態を管理してdisplay:none相当の表示切り替えを実装
- opacityとtransitionを組み合わせたフェードイン・アウトアニメーション
- visibility:hiddenとdisplay:noneの違いを活かした使い分けパターン
- モーダル・ドロップダウン・アコーディオンの表示切り替えの実装例
- content-visibility: autoを使った画面外要素のレンダリング最適化

⚠️ このプロンプトはあくまでたたき台です。AIの回答はモデルやバージョン、会話の文脈によって毎回異なります。意図通りに動かない場合は、条件を追記・修正してお使いください。