Skip to content
Back to skills

3d Html Slide

ASecurity

re-presentation.jpスタイルの3DワイヤーフレームHTMLスライドを生成するスキル。 「3DワイヤーフレームHTMLスライド」というキーワードが含まれたときのみ、このスキルを使うこと。

  • 3 stars
  • 0 votes
  • 0 copies
  • 8 views
  • Added May 26, 2026
designjavascriptgojavaapi

Works with

  • cursor
  • cli
  • api

Security analysis

A100/100

Scanned May 27, 2026

npx -y skills add yoshifujidesign/3d-html-slide-skill --skill 3d-html-slide --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of 3d Html Slide?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for 3d Html Slide
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/yoshifujidesign-3d-html-slide/badge)](https://www.skillsdirectory.com/skills/yoshifujidesign-3d-html-slide)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: 3d-html-slide
description: >
  re-presentation.jpスタイルの3DワイヤーフレームHTMLスライドを生成するスキル。
  「3DワイヤーフレームHTMLスライド」というキーワードが含まれたときのみ、このスキルを使うこと。
---

# 3D HTML Slide Skill
**re-presentation.jp スタイル** — Three.js × 横スクロール × テーマカラー自動切替

## このスキルが生成するもの

単一HTMLファイル(外部ライブラリはCDN)で完結する、以下の特徴を持つプレゼンスライド:

- **Three.js 3D背景** — スライドごとに異なるワイヤーフレームジオメトリが浮かぶ
- **横スクロール** — scroll-snap による1枚ずつのページめくり
- **テーマカラー自動切替** — スライドが画面に入ると背景色・アクセントカラーが滑らかに変わる
- **視差効果(Parallax)** — data-parallax 属性で要素ごとに奥行き感を演出
- **GlassPanel / IsometricGrid** などの共通UIコンポーネント
- **完全レスポンシブ** — PC・スマホ両対応

---

## 必須ライブラリ(CDN)

```html
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@300;400;500;700;900&family=Share+Tech+Mono&display=swap" rel="stylesheet">
<script src="https://cdn.tailwindcss.com"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script>
```

---

## テーマカラー定義(4種)

スライドの `data-theme` 属性でテーマを指定する。スライド順に交互に使うと効果的。

| テーマ名 | 背景色 | アクセント | 用途イメージ |
|---|---|---|---|
| `theme-dark` | `#0F172A` (深紺) | `#00E8FE` (シアン) | タイトル・締め |
| `theme-amber` | `#FFAB00` (アンバー) | `#0F172A` (深紺) | 強調・章タイトル |
| `theme-light` | `#EFEFEF` (ライトグレー) | `#00E8FE` (シアン) | 説明・データ |
| `theme-cyan` | `#00E8FE` (シアン) | `#0F172A` (深紺) | アクセント・CTA |

---

## CSS変数システム

テーマ切替はこのCSS変数で一括制御する。必ずすべて定義すること。

```css
:root {
  --bg-color: #0F172A;
  --text-main: #FFFFFF;
  --text-sub: rgba(255, 255, 255, 0.7);
  --accent: #00E8FE;
  --glass-bg: rgba(255, 255, 255, 0.03);
  --glass-border: rgba(0, 232, 254, 0.3);
  --grid-color: rgba(0, 232, 254, 0.15);
  --shadow: rgba(0, 0, 0, 0.5);
}
body.theme-amber { /* 上書き定義 */ }
body.theme-light  { /* 上書き定義 */ }
body.theme-cyan   { /* 上書き定義 */ }
```

---

## 必須CSSクラス

以下を必ずstyleタグに含めること。

```css
/* テキスト・ボーダー */
.font-heading   { font-family: 'Share Tech Mono', monospace; }
.text-outline   { color: transparent; -webkit-text-stroke: 1.5px var(--accent); transition: all 0.8s ease; }
.text-dynamic   { color: var(--text-main); transition: color 0.8s ease; }
.text-sub-dynamic { color: var(--text-sub); transition: color 0.8s ease; }
.border-dynamic { border-color: var(--accent); transition: border-color 0.8s ease; }
.bg-dynamic     { background-color: var(--accent); transition: background-color 0.8s ease; }

/* スクロールコンテナ */
.scroll-container {
  display: flex; width: 100vw; height: 100dvh;
  overflow-x: auto; overflow-y: hidden;
  scroll-snap-type: x mandatory; scroll-behavior: smooth;
  -ms-overflow-style: none; scrollbar-width: none;
  perspective: 1500px;
}
.scroll-container::-webkit-scrollbar { display: none; }

/* スライド */
.slide {
  flex: 0 0 100vw; height: 100dvh;
  scroll-snap-align: center;
  position: relative; display: flex;
  align-items: center; justify-content: center;
  overflow: hidden; transform-style: preserve-3d;
}

/* GlassPanel */
.glass-panel {
  background: var(--glass-bg);
  backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px);
  border: 1px solid var(--glass-border);
  box-shadow: 0 30px 60px var(--shadow), inset 0 0 0 1px rgba(255,255,255,0.1);
  transition: all 0.8s ease;
}

/* Isometric Grid背景 */
.iso-grid-bg {
  position: absolute; width: 300vw; height: 300vh;
  left: -100vw; top: -100vh;
  background-size: 80px 80px;
  background-image:
    linear-gradient(var(--grid-color) 1px, transparent 1px),
    linear-gradient(90deg, var(--grid-color) 1px, transparent 1px);
  transform: rotateX(60deg) rotateZ(45deg);
  mask-image: radial-gradient(circle at center, black 10%, transparent 65%);
  -webkit-mask-image: radial-gradient(circle at center, black 10%, transparent 65%);
  pointer-events: none; transition: background-image 0.8s ease;
}

/* Floating Label */
.floating-label { display: inline-flex; align-items: center; gap: 10px; }
.floating-label .line { width: 40px; height: 1px; background-color: var(--accent); transition: all 0.8s; }
.floating-label .box {
  border: 1px solid var(--accent); color: var(--accent);
  padding: 4px 12px; font-size: 0.7rem; letter-spacing: 0.1em;
  backdrop-filter: blur(4px); transition: all 0.8s ease;
}

/* UI Overlay corners (PC only) */
.viewport-corner { position: fixed; width: 40px; height: 40px; border-color: var(--accent); border-style: solid; z-index: 100; pointer-events: none; transition: border-color 0.8s; opacity: 0.5; }
.vp-tl { top: 30px; left: 30px; border-width: 2px 0 0 2px; }
.vp-tr { top: 30px; right: 30px; border-width: 2px 2px 0 0; }
.vp-bl { bottom: 30px; left: 30px; border-width: 0 0 2px 2px; }
.vp-br { bottom: 30px; right: 30px; border-width: 0 2px 2px 0; }
.ui-text { position: fixed; font-size: 10px; color: var(--accent); z-index: 100; pointer-events: none; letter-spacing: 0.1em; transition: color 0.8s; opacity: 0.8; }
.ui-tl { top: 40px; left: 80px; }
.ui-tr { top: 40px; right: 80px; text-align: right; }
.ui-bl { bottom: 40px; left: 80px; }
.ui-br { bottom: 40px; right: 80px; text-align: right; }

/* スマホスクロール非表示 */
.no-scrollbar { -ms-overflow-style: none; scrollbar-width: none; }
.no-scrollbar::-webkit-scrollbar { display: none; }
```

---

## スライドHTMLテンプレート

### 基本構造(全スライド共通)

```html
<section class="slide" data-theme="theme-dark">
  <!-- Parallax背景グリッド -->
  <div class="absolute inset-0" data-parallax="0.8">
    <div class="iso-grid-bg"></div>
  </div>

  <!-- コンテンツ -->
  <div class="relative z-10 w-full max-w-6xl px-6 md:px-12
              max-h-full overflow-y-auto py-12 md:py-0 no-scrollbar
              flex flex-col justify-center min-h-[100dvh]"
       data-parallax="-0.3">
    <!-- ここにスライドの中身 -->
  </div>

  <!-- ナビゲーション矢印(全スライドに必須) -->
  <div class="absolute bottom-6 md:bottom-[40px] left-0 w-full flex justify-center z-50 pointer-events-none">
    <div data-parallax="-0.1" class="pointer-events-auto">
      <div onclick="scrollToNext()" class="animate-pulse hover:opacity-70 transition-opacity cursor-pointer scale-75 md:scale-100 flex items-center justify-center">
        <!-- ライトテーマ用矢印(画像がない場合はSVGで代替) -->
        <div class="light-arrow flex items-center gap-1">
          <svg width="36" height="36" viewBox="0 0 36 36" fill="none">
            <path d="M18 8 L28 18 L18 28" stroke="currentColor" stroke-width="2" fill="none"/>
            <line x1="8" y1="18" x2="28" y2="18" stroke="currentColor" stroke-width="2"/>
          </svg>
        </div>
        <!-- ダークテーマ用矢印 -->
        <div class="dark-arrow flex items-center gap-1">
          <svg width="36" height="36" viewBox="0 0 36 36" fill="none">
            <path d="M18 8 L28 18 L18 28" stroke="#00E8FE" stroke-width="2" fill="none"/>
            <line x1="8" y1="18" x2="28" y2="18" stroke="#00E8FE" stroke-width="2"/>
          </svg>
        </div>
      </div>
    </div>
  </div>
</section>
```

> **矢印について**: オリジナルは `arrow01.gif`(ダーク用)`arrow02.gif`(ライト用)を使用。
> 画像ファイルがない場合は上記SVGで代替する。

---

## スライドレイアウトパターン

### パターン1: タイトルスライド(大見出し + GlassPanel)
```html
<div class="floating-label mb-4 md:mb-8 font-heading">
  <div class="box">MODULE.01 : INTRODUCTION</div><div class="line"></div>
</div>
<h1 class="font-heading text-5xl sm:text-7xl md:text-[8rem] leading-[0.8] tracking-tighter mb-6 md:mb-8 text-outline">
  TITLE<br>HERE.
</h1>
<div class="glass-panel p-6 md:p-8 max-w-2xl border-l-4 border-dynamic">
  <h2 class="text-xl md:text-3xl font-bold mb-3 text-dynamic">サブタイトル</h2>
  <p class="text-sub-dynamic text-sm md:text-base font-light leading-relaxed">説明文をここに。</p>
</div>
```

### パターン2: 2カラム(左テキスト + 右GlassPanel)
```html
<div class="grid grid-cols-1 md:grid-cols-2 gap-8 md:gap-16 items-center ...">
  <div>
    <h2 class="font-heading text-4xl md:text-7xl text-outline mb-4">HEADING</h2>
    <p class="text-lg md:text-xl text-dynamic font-medium mb-4 leading-relaxed">メインテキスト</p>
    <p class="text-sub-dynamic text-sm md:text-base font-light leading-relaxed">サブテキスト</p>
  </div>
  <div class="glass-panel p-4 md:p-8 h-[250px] md:h-[400px] ..." data-parallax="-0.4">
    <!-- 右側コンテンツ(図・リスト等) -->
  </div>
</div>
```

### パターン3: センター大テキスト + GlassPanel
```html
<div class="w-full max-w-5xl mx-auto px-6 md:px-12 text-center ...">
  <h2 class="font-heading text-5xl md:text-8xl text-outline mb-6 md:mb-10">SECTION TITLE</h2>
  <div class="glass-panel p-6 md:p-12 mx-auto shadow-2xl">
    <p class="text-xl md:text-3xl text-dynamic font-bold mb-4">見出し</p>
    <p class="text-sub-dynamic text-sm md:text-lg font-medium leading-relaxed">説明文</p>
  </div>
</div>
```

### パターン4: 3カラムカード(比較・選択肢)
```html
<div class="grid grid-cols-1 md:grid-cols-3 gap-6 md:gap-8 text-left">
  <div class="glass-panel p-6 md:p-8 border-t-4 border-dynamic opacity-60">
    <h4 class="font-heading text-lg text-dynamic mb-2">OPTION 01</h4>
    <p class="text-lg font-bold text-dynamic mb-2">オプション名</p>
    <p class="text-sub-dynamic text-sm">説明文</p>
  </div>
  <!-- RECOMMENDEDカード(中央・強調) -->
  <div class="glass-panel p-6 md:p-8 border-t-4 border-dynamic transform scale-100 md:scale-110 shadow-2xl relative z-10">
    <div class="absolute -top-4 left-1/2 -translate-x-1/2 bg-dynamic text-white font-heading px-3 py-1 text-xs font-bold">RECOMMENDED</div>
    <h4 class="font-heading text-lg text-dynamic mb-2">OPTION 02</h4>
    <p class="text-xl font-bold text-dynamic mb-2">推奨オプション名</p>
    <p class="text-sub-dynamic text-sm">説明文</p>
  </div>
  <div class="glass-panel p-6 md:p-8 border-t-4 border-dynamic opacity-40">
    <!-- 3つ目 -->
  </div>
</div>
```

### パターン5: ステップ・プロセス(番号付き)
```html
<div class="space-y-4 md:space-y-6">
  <div class="glass-panel p-4 md:p-6 border-l-4 border-dynamic flex items-start gap-4">
    <span class="font-heading text-3xl text-dynamic opacity-40">01</span>
    <div>
      <span class="block font-heading text-dynamic text-xs mb-1">STEP 01</span>
      <p class="text-sub-dynamic text-sm font-light">説明文</p>
    </div>
  </div>
</div>
```

---

## data-parallax 速度ガイド

| 値 | 効果 | 推奨用途 |
|---|---|---|
| `0.8` | 背景がゆっくり流れる | iso-grid-bgの親要素 |
| `0.5〜0.6` | 中程度の奥行き | 背景装飾要素 |
| `-0.2〜-0.3` | コンテンツが少し逆方向に | メインコンテンツ |
| `-0.4` | 大きな逆視差 | GlassPanelなど右側要素 |
| `-0.1` | わずかな逆視差 | ナビゲーション矢印 |

---

## Three.js 設定

### ジオメトリとスライドの対応(10枚分)

スライドのインデックス順に以下を使う:

```javascript
const geometries = [
  new THREE.IcosahedronGeometry(4, 2),         // 0
  new THREE.TorusKnotGeometry(3, 0.8, 120, 20), // 1
  new THREE.OctahedronGeometry(4, 3),           // 2
  new THREE.DodecahedronGeometry(4, 2),         // 3
  new THREE.TorusGeometry(4, 1.5, 20, 100),     // 4
  new THREE.TetrahedronGeometry(4, 4),          // 5
  new THREE.SphereGeometry(4, 24, 24),          // 6
  new THREE.CylinderGeometry(3, 3, 8, 24, 4),  // 7
  new THREE.BoxGeometry(5, 5, 5, 4, 4, 4),     // 8
  new THREE.RingGeometry(1, 5, 32, 8)           // 9
];
```

> スライドが10枚未満でも問題なし(使われない分は画面外に配置される)。

### ワイヤーフレームマテリアル

```javascript
const wireMaterial = new THREE.LineBasicMaterial({
  color: 0x00E8FE, transparent: true, opacity: 0.3, linewidth: 0.5
});
```

### テーマカラーとThree.jsの同期

```javascript
const themeColors = {
  'theme-dark':  { bg: '#0F172A', wire: 0x00E8FE, fog: 0x0F172A },
  'theme-amber': { bg: '#FFAB00', wire: 0x0F172A, fog: 0xFFAB00 },
  'theme-light': { bg: '#EFEFEF', wire: 0x00E8FE, fog: 0xEFEFEF },
  'theme-cyan':  { bg: '#00E8FE', wire: 0x0F172A, fog: 0x00E8FE }
};
```

IntersectionObserver でスライドが60%表示されたとき `document.body.className = theme` を実行。

### カメラの動き(スクロール連動)

```javascript
camera.position.x = targetX + Math.sin(scrollProgress * Math.PI) * 12;
camera.position.y = Math.cos(scrollProgress * Math.PI) * 6;
camera.position.z = 12 + Math.sin(scrollProgress * Math.PI * 2) * 6;
camera.lookAt(targetX, 0, 0);
```

---

## スライド枚数の目安

| 枚数 | 構成例 |
|---|---|
| 5〜6枚 | ショートデモ・SNS投稿用 |
| 8〜10枚 | セミナー・ウェビナー登壇用 |
| 12〜15枚 | 本格プレゼン・ピッチデッキ |

---

## 生成手順

1. **スライド構成を確認** — 枚数、各スライドのテーマカラー、コンテンツ内容
2. **HTMLの骨格を作成** — `<!DOCTYPE html>` から `<body>` 開始まで(ライブラリ読込含む)
3. **CSSを丸ごと出力** — 上記「必須CSSクラス」を漏らさず記述
4. **スライドをセクションごとに出力** — 各 `<section class="slide">` を上記パターンで生成
5. **JavaScriptを出力** — Three.jsシーン構築 → テーマ切替 → パララックスループ → ナビゲーション

> **重要**: JavaScriptは `DOMContentLoaded` イベント内にすべてまとめること。

---

## よくあるミスと対策

| ミス | 対策 |
|---|---|
| テーマ切替でThree.jsの色が変わらない | `wireMaterial.color.lerp()` と `targetWireColor` の更新を確認 |
| スマホでスクロールが止まる | `scroll-snap-type: x mandatory` と `overflow-x: auto` の組み合わせを確認 |
| パララックスが効かない | `data-parallax` 属性とJS側の `querySelectorAll('[data-parallax]')` を確認 |
| ナビゲーション矢印が表示されない | `light-arrow` / `dark-arrow` の CSS切替ロジックを確認 |
| フォントが読み込まれない | Google Fonts の `<link rel="preconnect">` が2行あることを確認 |

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.