分類
標籤
.env AI Arc Arm Astro BigQuery btop Certbot Chrome CICD Cookie CORS CSS cURL DataTables defineExpose DevOps Docker Draggable Fetch API Gamania Git GitLab Google Calendar Google Cloud Summit Google Tag Manager GSAP HTML iCal inject JavaScript Laravel Less LINE Llama 3 Masonry Meta Nginx Nginx UI O(log n) Ollama OpenSSL Oracle OrbStack PHP Pinia Pixel Postman provide Proxyman Raycast requestAnimationFrame script setup Server Session Sitemap Socialite SSL TablePlus Termius Valet Vertex AI Visual Studio Code Vite Vue 3 Vue2 Vue3 Vuex Warp Webpack Yahoo Calendar Zeabur 二分搜尋 元件溝通 前端開發 動畫效果 峰值體驗 廣告 性能優化 打包 推薦系統 搜尋 時間複雜度 演算法 瀑布流排版 父子元件 環境變數 程式碼複製按鈕 系統監控 網站地圖 網頁開發 自動化部署 螢幕刷新率 語言模型 資訊檢索 跨域請求 轉化率 開發工具 陣列 電商 電子商務
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/