313 字
2 分鐘
使用 HTML、CSS 和 JavaScript 實現鑽石噴灑效果
鑽石噴灑效果實現
主要是使用 GSAP 來實現動畫效果,並且管理 DOM 元素,減少 DOM 操作的頻率。
基礎架構
- HTML 結構
<!DOCTYPE html>
<html>
<head>
<title>鑽石噴灑效果</title>
</head>
<body>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.11.5/gsap.min.js"></script>
</body>
</html>
- CSS 樣式
.diamond {
width: 60px;
height: 60px;
position: absolute;
will-change: transform, opacity;
background-image: url('diamond.png');
background-size: cover;
filter: drop-shadow(0 2px 4px rgba(0,0,0,0.2));
}
核心實現
- 管理目標物件
const DIAMOND_COUNT = 10;
const DIAMOND_POOL_SIZE = 30;
function createDiamondPool() {
for (let i = 0; i < DIAMOND_POOL_SIZE; i++) {
const diamond = document.createElement("div");
diamond.classList.add("diamond");
diamond.style.display = 'none';
document.body.appendChild(diamond);
diamondPool.push(diamond);
}
}
- 動畫控制
function animateDiamond(diamond, clickX, clickY) {
const [endX, endY] = getRandomPointInCircle(clickX, clickY, 100);
// 噴射動畫
gsap.to(diamond, {
duration: 0.4,
x: endX - 30,
y: endY - 30,
scale: 0.8 + Math.random() * 0.4,
rotation: (Math.random() - 0.5) * 60,
ease: "power2.out",
onComplete: handleFallAnimation
});
}
function handleFallAnimation(diamond) {
gsap.to(diamond, {
duration: 0.6,
y: window.innerHeight + 50,
opacity: 0,
ease: "power1.in",
onComplete: () => returnDiamond(diamond)
});
}
效能優化
- 使用對象池減少 DOM 操作
- 應用
will-change
優化動畫性能 - 實現點擊節流控制
const CLICK_THRESHOLD = 100;
let lastClickTime = 0;
document.addEventListener("click", (event) => {
if (Date.now() - lastClickTime < CLICK_THRESHOLD) return;
lastClickTime = Date.now();
createDiamonds(event.clientX, event.clientY);
});
範例
使用 HTML、CSS 和 JavaScript 實現鑽石噴灑效果
https://laplusda.com/posts/diamond-spray-effect/