|
| 1 | +<script setup lang="ts"> |
| 2 | +import { ref, onMounted } from 'vue' |
| 3 | +
|
| 4 | +interface Leaf { |
| 5 | + x: number |
| 6 | + y: number |
| 7 | + size: number |
| 8 | + speedY: number |
| 9 | + rotate: number |
| 10 | + rotateSpeed: number |
| 11 | + color: string |
| 12 | + sway: number |
| 13 | + swaySpeed: number |
| 14 | + depth: number |
| 15 | +} |
| 16 | +
|
| 17 | +const leaves = ref<Leaf[]>([]) |
| 18 | +
|
| 19 | +const leafColors = ['#FF7F00', '#FFD700', '#8B0000', '#A0522D'] // оранж, золото, бордо, коричн |
| 20 | +const numLeaves = 50 |
| 21 | +
|
| 22 | +onMounted(() => { |
| 23 | + for (let i = 0; i < numLeaves; i++) { |
| 24 | + const depth = Math.random() * 2 + 0.5 // 0.5 - дальние, 2 - ближе |
| 25 | + leaves.value.push({ |
| 26 | + x: Math.random() * window.innerWidth, |
| 27 | + y: Math.random() * window.innerHeight, |
| 28 | + size: Math.random() * 25 + 20, |
| 29 | + speedY: Math.random() * 1 + 0.5 * depth, |
| 30 | + rotate: Math.random() * 360, |
| 31 | + rotateSpeed: Math.random() * 2 - 1, |
| 32 | + color: leafColors[Math.floor(Math.random() * leafColors.length)], |
| 33 | + sway: Math.random() * 20 - 10, |
| 34 | + swaySpeed: Math.random() * 0.05 + 0.01, |
| 35 | + depth |
| 36 | + }) |
| 37 | + } |
| 38 | +
|
| 39 | + animate() |
| 40 | +}) |
| 41 | +
|
| 42 | +function animate() { |
| 43 | + leaves.value.forEach(l => { |
| 44 | + l.y += l.speedY |
| 45 | + l.rotate += l.rotateSpeed |
| 46 | + l.sway += l.swaySpeed |
| 47 | + if (l.y > window.innerHeight) { |
| 48 | + l.y = -l.size |
| 49 | + l.x = Math.random() * window.innerWidth |
| 50 | + } |
| 51 | + }) |
| 52 | +
|
| 53 | + requestAnimationFrame(animate) |
| 54 | +} |
| 55 | +
|
| 56 | +function handleMouseMove(event: MouseEvent) { |
| 57 | + leaves.value.forEach(l => { |
| 58 | + const dx = event.clientX - l.x |
| 59 | + const dy = event.clientY - l.y |
| 60 | + const dist = Math.sqrt(dx * dx + dy * dy) |
| 61 | + if (dist < 100) { |
| 62 | + l.y -= 0.5 |
| 63 | + l.x += (Math.random() * 2 - 1) * 2 |
| 64 | + } |
| 65 | + }) |
| 66 | +} |
| 67 | +</script> |
| 68 | + |
| 69 | +<template> |
| 70 | + <div |
| 71 | + class="autumn-effects fixed top-0 left-0 w-full h-full pointer-events-none z-[9999]" |
| 72 | + @mousemove="handleMouseMove" |
| 73 | + > |
| 74 | + <div |
| 75 | + v-for="(l, i) in leaves" |
| 76 | + :key="i" |
| 77 | + class="leaf absolute" |
| 78 | + :style="{ |
| 79 | + width: l.size + 'px', |
| 80 | + height: l.size + 'px', |
| 81 | + background: l.color, |
| 82 | + transform: 'translate(' + (l.x + Math.sin(l.sway)) + 'px,' + l.y + 'px) rotate(' + l.rotate + 'deg)', |
| 83 | + zIndex: Math.floor(l.depth * 10), |
| 84 | + clipPath: 'polygon(50% 0%, 60% 20%, 80% 30%, 70% 50%, 90% 70%, 50% 100%, 10% 70%, 30% 50%, 20% 30%, 40% 20%)' |
| 85 | + }" |
| 86 | + ></div> |
| 87 | + </div> |
| 88 | +</template> |
| 89 | + |
| 90 | +<style scoped> |
| 91 | +</style> |
0 commit comments