ツリービュー Tree View

階層構造のデータをツリー形式で表示する。フォルダ構造やカテゴリ分類に最適。

使用場面: ファイルエクスプローラーやカテゴリナビゲーションなど、階層データを表示する場面 採用例: VS Code, Finder

ライブデモ

📁 src
📁 components
📄 Button.tsx
📄 Card.tsx
📄 Modal.tsx
📄 index.ts

ソースコード

<div class="demo-tree" role="tree">
  <div class="demo-tree-node open" role="treeitem" aria-expanded="true">
    <button class="demo-tree-toggle">&#9660;</button>
    <span class="demo-tree-icon">&#128193;</span>
    <span class="demo-tree-label">src</span>
  </div>
  <div class="demo-tree-children">
    <div class="demo-tree-node open" role="treeitem" aria-expanded="true">
      <button class="demo-tree-toggle">&#9660;</button>
      <span class="demo-tree-icon">&#128193;</span>
      <span class="demo-tree-label">components</span>
    </div>
    <div class="demo-tree-children">
      <div class="demo-tree-leaf" role="treeitem">
        <span class="demo-tree-icon">&#128196;</span>
        <span class="demo-tree-label">Button.tsx</span>
      </div>
      <div class="demo-tree-leaf" role="treeitem">
        <span class="demo-tree-icon">&#128196;</span>
        <span class="demo-tree-label">Card.tsx</span>
      </div>
      <div class="demo-tree-leaf" role="treeitem">
        <span class="demo-tree-icon">&#128196;</span>
        <span class="demo-tree-label">Modal.tsx</span>
      </div>
    </div>
    <div class="demo-tree-node" role="treeitem" aria-expanded="false">
      <button class="demo-tree-toggle">&#9654;</button>
      <span class="demo-tree-icon">&#128193;</span>
      <span class="demo-tree-label">utils</span>
    </div>
    <div class="demo-tree-children" style="display:none;">
      <div class="demo-tree-leaf" role="treeitem">
        <span class="demo-tree-icon">&#128196;</span>
        <span class="demo-tree-label">helpers.ts</span>
      </div>
    </div>
    <div class="demo-tree-leaf" role="treeitem">
      <span class="demo-tree-icon">&#128196;</span>
      <span class="demo-tree-label">index.ts</span>
    </div>
  </div>
</div>
.demo-tree { font-size: 14px; color: #333; }
.demo-tree-node {
  display: flex; align-items: center; gap: 4px;
  padding: 4px 8px; border-radius: 6px; cursor: pointer;
  transition: background 0.15s;
}
.demo-tree-node:hover {
  background: color-mix(in srgb, var(--ui-primary) 8%, transparent);
}
.demo-tree-leaf {
  display: flex; align-items: center; gap: 4px;
  padding: 4px 8px 4px 26px; border-radius: 6px; cursor: pointer;
  transition: background 0.15s;
}
.demo-tree-leaf:hover {
  background: color-mix(in srgb, var(--ui-primary) 8%, transparent);
}
.demo-tree-toggle {
  background: none; border: none; cursor: pointer;
  font-size: 10px; color: var(--ui-primary); padding: 2px;
  width: 18px; text-align: center;
  transition: transform 0.2s;
}
.demo-tree-icon { font-size: 14px; }
.demo-tree-label { font-size: 13px; }
.demo-tree-children {
  padding-left: 20px;
}
document.querySelectorAll('.demo-tree-toggle').forEach(btn => {
  btn.addEventListener('click', function(e) {
    e.stopPropagation();
    const node = this.closest('.demo-tree-node');
    const children = node.nextElementSibling;
    if (children && children.classList.contains('demo-tree-children')) {
      const isOpen = node.classList.toggle('open');
      children.style.display = isOpen ? 'block' : 'none';
      this.innerHTML = isOpen ? '&#9660;' : '&#9654;';
      node.setAttribute('aria-expanded', isOpen);
    }
  });
});

AIプロンプト

Basic
ツリービューをHTML/CSSで作ってください。フォルダとファイルを階層表示し、フォルダをクリックで展開・折りたたみできるようにします。
Custom
以下の仕様でツリービューを実装してください。
- フォルダ/ファイルアイコンを種類別に表示
- 展開・折りたたみのアニメーション付き
- ドラッグ&ドロップでノードを移動可能
- 右クリックでコンテキストメニュー表示
- プライマリカラー: #2563eb
- 検索フィルタ機能付き
Advanced
アクセシビリティ対応のツリービューを実装してください。
- role="tree" / role="treeitem" によるARIA構造
- キーボード操作(矢印キーでナビゲーション、Enter/Spaceで展開切替)
- aria-expanded, aria-level, aria-setsize, aria-posinset の適切な設定
- 遅延読み込み(大量ノード対応)
- 複数選択モード対応
- ノードの検索・フィルタリング
- アニメーション時のprefers-reduced-motion対応