|
1 | 1 | <template> |
2 | | - <div ref="canvasContainer" class="canvas-container"></div> |
| 2 | + <div ref="canvasContainer" class="fixed inset-0 w-full h-full -z-10 bg-neutral-950"> |
| 3 | + <div class="absolute inset-0 bg-gradient-to-b from-transparent via-black/20 to-black/80 pointer-events-none"></div> |
| 4 | + </div> |
3 | 5 | </template> |
4 | 6 |
|
5 | 7 | <script setup lang="ts"> |
6 | | -import { ref, onMounted, onBeforeUnmount } from 'vue' |
7 | | -import { ThreeScene } from '~/utils/ThreeScene' |
| 8 | +import { ref, onMounted, onBeforeUnmount } from "vue"; |
| 9 | +import { ThreeScene } from "~/utils/ThreeScene"; |
8 | 10 |
|
9 | | -const canvasContainer = ref<HTMLCanvasElement | null>(null) |
10 | | -let threeScene: ThreeScene | null = null |
| 11 | +const canvasContainer = ref<HTMLElement | null>(null); |
| 12 | +let threeScene: ThreeScene | null = null; |
| 13 | +let resizeObserver: ResizeObserver | null = null; |
11 | 14 |
|
12 | | -onMounted(() => { |
13 | | - if (canvasContainer.value) { |
14 | | - // Instantiate our class |
15 | | - threeScene = new ThreeScene() |
16 | | -
|
17 | | - // Initialize the scene and pass the container element |
18 | | - threeScene.init(canvasContainer.value) |
19 | | -
|
20 | | - // Add a resize listener |
21 | | - const resizeObserver = new ResizeObserver((entries) => { |
22 | | - for (const entry of entries) { |
23 | | - const { width, height } = entry.contentRect |
24 | | - threeScene?.updateSize(width, height) |
25 | | - } |
26 | | - }) |
27 | | -
|
28 | | - resizeObserver.observe(canvasContainer.value) |
29 | | -
|
30 | | - // Cleanup on unmount |
31 | | - onBeforeUnmount(() => { |
32 | | - resizeObserver.disconnect() |
33 | | - threeScene?.cleanup() |
34 | | - }) |
| 15 | +const handleScroll = () => { |
| 16 | + if (threeScene) { |
| 17 | + threeScene.onScroll(window.scrollY, document.body.scrollHeight); |
35 | 18 | } |
36 | | -}) |
37 | | -</script> |
| 19 | +}; |
| 20 | +
|
| 21 | +const handleMouseMove = (event: MouseEvent) => { |
| 22 | + if (threeScene) { |
| 23 | + threeScene.onMouseMove(event.clientX, event.clientY); |
| 24 | + } |
| 25 | +}; |
38 | 26 |
|
39 | | -<style scoped> |
40 | | -.canvas-container { |
41 | | - width: 100%; |
42 | | - height: 100%; |
43 | | - outline: none; |
44 | | -} |
45 | | -</style> |
| 27 | +onMounted(() => { |
| 28 | + if (!canvasContainer.value) return; |
| 29 | +
|
| 30 | + threeScene = new ThreeScene(); |
| 31 | + threeScene.init(canvasContainer.value); |
| 32 | +
|
| 33 | + // 1. Observe Window Resize |
| 34 | + resizeObserver = new ResizeObserver((entries) => { |
| 35 | + const { width, height } = entries[0].contentRect; |
| 36 | + threeScene?.updateSize(width, height); |
| 37 | + }); |
| 38 | + resizeObserver.observe(canvasContainer.value); |
| 39 | +
|
| 40 | + // 2. Add Event Listeners |
| 41 | + window.addEventListener("scroll", handleScroll); |
| 42 | + window.addEventListener("mousemove", handleMouseMove); |
| 43 | +}); |
| 44 | +
|
| 45 | +onBeforeUnmount(() => { |
| 46 | + window.removeEventListener("scroll", handleScroll); |
| 47 | + window.removeEventListener("mousemove", handleMouseMove); |
| 48 | + resizeObserver?.disconnect(); |
| 49 | + threeScene?.cleanup(); |
| 50 | +}); |
| 51 | +</script> |
0 commit comments