✦ MIT Open Source · v1.3.0

DepthField.js

CSS z-index ベースの被写界深度ライブラリ。焦点距離・絞り・センサーサイズというカメラパラメータでブラー・スケール・透明度を制御します。

SCROLL TO SEE DEMO
ScrollTrigger × DepthField — scroll to shift focus
🌌 Far Background z = -20
🏔️ Background z = -10
📷 Mid Ground z = 0
🌿 Foreground z = 10
Far Foreground z = 20
Focus Point z = -20

Features

カメラで設計する
Web表現

カメラの物理パラメータをそのままWebのUIに。センサーサイズ・焦点距離・絞りで、本物の被写界深度をCSSで再現します。

photo_camera
カメラパラメータで制御

センサーサイズ(フルサイズ〜スマートフォン)・焦点距離・絞り値の組み合わせで、リアルな被写界深度を表現します。

animation
rAF ベースの滑らかな描画

フォーカス移動はrequestAnimationFrameとイージングで滑らかにアニメーション。パフォーマンスに配慮した設計です。

track_changes
MutationObserver で自動追従

watch: true でdata-z属性の変化を自動検知。GSAPやScrollTriggerとの連携がシンプルに実現できます。

layers
複数インスタンス対応

1ページ内に複数のシーンを独立して配置できます。それぞれ異なるカメラ設定で動作します。

extension
GSAP / MotionLab 連携

GSAPのScrollTriggerやMotionLabのZ軸アニメーションと組み合わせることで、インタラクティブな奥行き表現が可能です。

bolt
ゼロ依存・軽量

外部ライブラリへの依存なし。CDN / npm / ESM のすべての形式で配布しています。MITライセンスで商用利用可能。

Integration

GSAPとMotionLabで
さらに広がる表現

DepthFieldは単体でも使えますが、GSAPやMotionLabと組み合わせることで、インタラクティブな奥行き表現が可能になります。

swipe_down
GSAP ScrollTrigger

スクロール量に連動してフォーカスポイントを移動させます。watch: true と ScrollTrigger の scrub を組み合わせるだけで、このページのヒーローデモのような表現が実現できます。

// スクロールでフォーカスが奥から手前へ移動
const df = DepthField.scene('main', '#stage', {
  focalLength: 35, aperture: 16, watch: true
});
gsap.to(proxy, {
  z: 20,
  scrollTrigger: { scrub: true },
  onUpdate: () => df.focus(proxy.z)
});
open_in_new GSAP ScrollTrigger を見る
movie_filter
MotionLab

GSAPアニメーションをGUIで設計できるツール「MotionLab」は、Z軸アニメーションがDepthFieldと直接連動します。1行のscriptタグを追加するだけで、既存のページ上でGSAPアニメーションをリアルタイムにシミュレーションできます。

<!-- 既存ページに1行追加するだけ -->
<script
  src="motionlab-simulator.min.js"
  data-ml-mode="editor"
></script>

// Z軸を動かすとDepthFieldが自動追従
// ブラー・スケール・透明度がリアルタイムで変化
open_in_new MotionLab を見る
Design
MotionLab
Z-axis animation
data-z
Depth of Field
DepthField.js
Result
🎬 Cinematic

Interactive Demo

パラメータを動かして試す

センサー・焦点距離・絞りをスライダーで調整。要素をクリックするとフォーカスが移動します。

Instance 1 — カード列
maxBlur: 14pxdepthScale: 0.015
z:-4🏔️

遠景

最も奥の要素

z:-2🌲

背景

奥の要素

z:0📷

ピント面

フォーカス基準

z:2🌸

前景

手前の要素

z:4🦋

最前景

最も手前の要素

Instance 2 — グループ(写真とラベルが連動)
maxBlur: 14pxdepthScale: 0.015
🌄
夜明け
🌊
静かな海
🌸
春の花
🦋
蝶の飛翔
❄️
冬の朝
Instance 3 — ページレイアウト
maxBlur: 14pxdepthScale: 0.015
z:0

🎯 メインコンテンツ

ここがフォーカスの中心。最も鮮明に表示される。

z:-2

🔮 背景情報

補足的なコンテンツ。

z:-2

📊 データ

補助的な情報。

z:-2

📝 メモ

参考情報。

z:2

⚡ CTA

手前に出て目立つ要素。

z:2

🔔 通知

重要な告知。

Installation

3つの導入方法

<!-- jsDelivr CDN -->
<script src="https://cdn.jsdelivr.net/npm/depthfield/depthfield.min.js"></script>

<script>
const df = DepthField.scene('main', '#container', {
  sensor : 'fullframe',
  focalLength: 85,
  aperture : 1.8,
  focusPoint : 0
});
df.apply();
</script>
# npm
npm install depthfield

# yarn
yarn add depthfield
import DepthField from 'depthfield';

const df = DepthField.scene('main', '#container', {
  sensor : 'fullframe',
  focalLength: 85,
  aperture : 1.8,
});
df.apply();
// GSAP ScrollTrigger と組み合わせる
const df = DepthField.scene('main', '#container', {
  focalLength: 35,
  aperture : 16,
  watch : true // data-z 変化を自動検知
});

const proxy = { z: -20 };
gsap.to(proxy, {
  z: 20, ease: 'none',
  scrollTrigger: { scrub: true },
  onUpdate: () => df.focus(proxy.z)
});

API Reference

オプション一覧

オプション デフォルト 説明
sensorstring'fullframe'センサーサイズプリセット。fullframe / apsc / mft / smartphone など10種類。
focalLengthnumber50焦点距離(mm)。値が大きいほど被写界深度が浅くなります。
aperturenumber1.8絞り値(F値)。小さいほど背景がよくボケます。
focusPointnumber0ピントを合わせるz-index値。この値に最も近い要素が鮮明になります。
depthScalenumberセンサー依存奥行きのスケール係数。大きいほど遠近感が強くなります。
maxBlurnumberセンサー依存ぼかしの最大値(px)。
transitionnumber0CSS transitionの秒数。smooth: 0.3 などで滑らかさを追加できます。
watchbooleanfalsetrue にするとdata-z属性の変化をMutationObserverで自動監視します。GSAP連携時に便利。

メソッド

メソッド説明
df.apply()現在の設定でエフェクトを適用します。
df.focus(z, duration)フォーカスポイントをアニメーションで移動します。durationはms単位(省略時は即時)。
df.update(options)オプションを変更して再適用します。
df.reset()エフェクトをリセットします。

HTML 属性

属性説明
data-z="0"要素のZ位置を指定します。focusPointからの距離でブラー・スケール・透明度が決まります。
data-df-group="id"同じidを持つ要素をグループ化し、同じエフェクトを適用します。写真とキャプションの連動などに使います。