50天50個小項目 (Vue3 + Tailwindcss V4) ? | DoubleClickHeart(雙擊愛心)

📅 我們繼續 50 個小項目挑戰!—— DoubleClickHeart組件

倉庫地址:https://github.com/SunACong/50-vue-projects

項目預覽地址:https://50-vue-projects.vercel.app/

在這里插入圖片描述


使用 Vue 3 的 Composition API(<script setup>)結合 TailwindCSS 和 Font Awesome 創建一個雙擊點贊動畫組件。用戶可以雙擊圖片區域觸發一個“?? 愛心飛出”動畫,并統計點贊次數。

這個交互體驗非常適用于社交媒體、照片墻、內容點贊等場景。


🎯 組件目標

  • 用戶雙擊圖片區域時顯示愛心動畫
  • 顯示當前點贊總次數
  • 動畫結束后自動移除愛心元素
  • 使用 Vue 3 Composition API 管理狀態
  • 使用 TailwindCSS 構建 UI 樣式與布局
  • 支持動態定位和點擊時間判斷

?? 技術實現點

技術點描述
Vue 3 <script setup>使用響應式變量管理點贊數、愛心列表
ref 響應式變量控制 likeshearts 和 DOM 容器引用
雙擊檢測邏輯判斷兩次點擊時間間隔是否小于 800ms
動態創建元素在點擊位置生成愛心圖標并添加動畫
TailwindCSS 樣式設置圖片容器、文字樣式、動畫基礎屬性
自定義字體加載使用 JS 動態加載 Oswald 字體與 Font Awesome 圖標庫
CSS 關鍵幀動畫實現放大淡出的愛心動畫效果

🧱 組件實現

模板結構 <template>

<template><div class="flex min-h-screen flex-col items-center justify-center overflow-hidden font-[Oswald] text-white"><h3 class="mb-0 text-center">Double click on the image to<i class="fas fa-heart text-red-600"></i>it</h3><small class="mb-5 block text-center">You liked it<span>{{ likes }}</span>times</small><!-- 圖片容器 --><divclass="relative h-[440px] w-[300px] cursor-pointer overflow-hidden bg-cover bg-center shadow-lg":style="{ backgroundImage: `url(${imageUrl})` }"@click="handleClick"ref="container"><iv-for="heart in hearts":key="heart.id"class="fas fa-heart heart-anim absolute text-red-600":style="{ top: heart.y + 'px', left: heart.x + 'px' }"></i></div></div>
</template>

腳本邏輯 <script setup>

<script setup>
import { onMounted, ref } from 'vue'const likes = ref(0)
const hearts = ref([])
const container = ref(null)
let clickTime = 0const handleClick = (e) => {const now = new Date().getTime()if (clickTime === 0) {clickTime = now} else {if (now - clickTime < 800) {createHeart(e)clickTime = 0} else {clickTime = now}}
}const createHeart = (e) => {const rect = container.value.getBoundingClientRect()const xInside = e.clientX - rect.leftconst yInside = e.clientY - rect.topconst id = Date.now()hearts.value.push({ id, x: xInside, y: yInside })likes.value++setTimeout(() => {hearts.value = hearts.value.filter((h) => h.id !== id)}, 1000)
}const imageUrl ='https://images.unsplash.com/photo-1504215680853-026ed2a45def?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=334&q=80'onMounted(() => {const fontLink = document.createElement('link')fontLink.href = 'https://fonts.googleapis.com/css?family=Oswald'fontLink.rel = 'stylesheet'document.head.appendChild(fontLink)const faLink = document.createElement('link')faLink.href = 'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.14.0/css/all.min.css'faLink.rel = 'stylesheet'faLink.crossOrigin = 'anonymous'document.head.appendChild(faLink)
})
</script>

樣式部分 <style scoped>

<style scoped>
.heart-anim {position: absolute;animation: grow 0.6s linear;transform: translate(-50%, -50%) scale(0);
}@keyframes grow {to {transform: translate(-50%, -50%) scale(10);opacity: 0;}
}
</style>

🔍 重點效果實現

? 雙擊事件判斷

通過記錄點擊時間戳來判斷是否為雙擊行為:

const now = new Date().getTime()
if (now - clickTime < 800) {createHeart(e)clickTime = 0
} else {clickTime = now
}

這是模擬原生 dblclick 事件的一種方式,同時保留了對單擊行為的控制。

💡 動態生成愛心圖標

每次雙擊會根據點擊坐標生成一個愛心圖標:

hearts.value.push({ id, x: xInside, y: yInside })

并在一秒后自動從數組中移除,以實現動畫結束后的清理。

🎨 動畫設計

使用 CSS 關鍵幀實現放大并透明消失的效果:

@keyframes grow {to {transform: translate(-50%, -50%) scale(10);opacity: 0;}
}

配合 Tailwind 的 absolute 定位,實現了視覺上“從點擊點飛出”的效果。


🎨 TailwindCSS 樣式重點講解

類名作用
min-h-screen, flex-col, items-center, justify-center居中布局
font-[Oswald], text-white字體與文字顏色
relative, absolute心形圖標的絕對定位
h-[440px] w-[300px]固定圖片容器大小
bg-cover bg-center設置背景圖片居中覆蓋
cursor-pointer鼠標懸停為手型
overflow-hidden防止愛心動畫溢出容器
shadow-lg添加陰影提升層次感
text-red-600愛心顏色設置為紅色

這些類幫助我們快速構建了一個美觀、互動性強的點贊組件。


📁 常量定義 + 組件路由

constants/index.js 添加組件預覽常量:

{id: 29,title: 'Double Click Heart',image: 'https://50projects50days.com/img/projects-img/29-double-click-heart.png',link: 'DoubleClickHeart',},

router/index.js 中添加路由選項:

{path: '/DoubleClickHeart',name: 'DoubleClickHeart',component: () => import('@/projects/DoubleClickHeart.vue'),},

🏁 總結

基于 Vue 3 和 TailwindCSS 的雙擊點贊動畫組件不僅實現了基本的交互功能,它非常適合用于社交平臺、圖片瀏覽、內容互動等需要增強用戶體驗的場景。

你可以進一步擴展此組件的功能包括:

  • ? 添加音效反饋(如“滴”一聲)
  • ? 支持移動端觸摸雙擊識別
  • ? 支持本地存儲點贊數(使用 localStorage)
  • ? 添加粒子爆炸或其他動畫效果
  • ? 將組件封裝為 <DoubleHeartImage /> 可復用組件

👉 下一篇,我們將完成AutoTextEffect組件,一個類似打字機的組件,可以調節速度。🚀

感謝閱讀,歡迎點贊、收藏和分享 😊

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/89121.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/89121.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/89121.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

1-緒論-1-數據結構的基本概念

&#x1f389; 數據結構的魔法世界&#x1f4da;&#x1f468;?&#x1f393;“數據就像大海中的浪花&#xff0c;結構則是那神秘的洋流。掌握數據結構&#xff0c;就是掌握在信息海洋中自由航行的力量&#xff01;”引言&#xff1a;為什么要學數據結構&#xff1f;&#x1f…

linux網絡相關命令簡介

目錄 一、IP命令 1、Link或L:管理網絡接口(網卡) 2、Address或Addr,A:管理Ip地址 3、Route或R:管理路由表

教育培訓機構如何為課程視頻添加防盜錄的強水印?

在知識付費時代&#xff0c;教育培訓機構的課程視頻是核心資產&#xff0c;但盜錄、非法傳播等問題卻讓機構防不勝防。如何在不影響學員觀看體驗的前提下&#xff0c;為課程視頻添加“強效防盜水印”&#xff0c;精準追蹤泄露源頭&#xff1f;本文將為您揭秘高安全性水印的添加…

python的形成性考核管理系統

前端開發框架:vue.js 數據庫 mysql 版本不限 后端語言框架支持&#xff1a; 1 java(SSM/springboot)-idea/eclipse 2.NodejsVue.js -vscode 3.python(flask/django)–pycharm/vscode 4.php(thinkphp/laravel)-hbuilderx 數據庫工具&#xff1a;Navicat/SQLyog等都可以 摘要 隨著…

A*算法詳解

A*算法詳解一、A*算法基礎概念1.1 算法定位1.2 核心評估函數1.3 關鍵數據結構二、A*算法的核心步驟三、啟發函數設計3.1 網格地圖中的啟發函數3.2 啟發函數的選擇原則三、Java代碼實現四、啟發函數的設計與優化4.1 啟發函數的可采納性4.2 啟發函數的效率影響4.3 常見啟發函數對…

.net winfrom 獲取上傳的Excel文件 單元格的背景色

需求&#xff1a;根據Excel某行標注了黃色高亮顏色&#xff0c;說明該行數據已被用戶選中(Excel文件中并沒有“已選中”這一列&#xff0c;純粹用顏色表示)&#xff0c;導入數據到數據庫時標注此行已選中直接上代碼&#xff1a;//選擇Excel文件private void btnBrowse_Click(ob…

OpenAI GPT-4o技術詳解:全能多模態模型的架構革新與生態影響

本文由「大千AI助手」原創發布&#xff0c;專注用真話講AI&#xff0c;回歸技術本質。拒絕神話或妖魔化。搜索「大千AI助手」關注我&#xff0c;一起撕掉過度包裝&#xff0c;學習真實的AI技術&#xff01; ?? 一、核心定義與發布背景 官方定位 GPT-4o&#xff08;“o”代表“…

? 構建真正的高性能即時通訊服務:基于 Netty 集群的架構設計與實現

引子 在前面的文章中&#xff0c;我們基于 Netty 構建了一套單體架構的即時通訊服務。雖然單體架構在開發初期簡單高效&#xff0c;但隨著用戶量的增長和業務規模的擴大&#xff0c;其局限性逐漸顯現。當面對高并發場景時&#xff0c;單體 Netty 服務很容易觸及性能天花板&…

原來時間序列挖掘這么簡單

先搞懂&#xff1a;啥是時間序列&#xff1f;簡單說&#xff0c;時間序列就是按時間順序記下來的數據。比如&#xff1a;你每天早上 8 點測的體重&#xff0c;連起來就是 “體重時間序列”&#xff1b;超市每天的銷售額&#xff0c;連起來就是 “銷售時間序列”&#xff1b;城市…

基于Python的豆瓣圖書數據分析與可視化系統【自動采集、海量數據集、多維度分析、機器學習】

文章目錄有需要本項目的代碼或文檔以及全部資源&#xff0c;或者部署調試可以私信博主項目介紹每文一語有需要本項目的代碼或文檔以及全部資源&#xff0c;或者部署調試可以私信博主 項目介紹 豆瓣圖書數據智能分析系統是一個集數據采集、清洗、分析與可視化于一體的綜合性項…

2.3 數組與字符串

學習目標&#xff1a; 理解數組和字符串的概念&#xff08;存儲多個數據的“盒子”&#xff09;。掌握數組的聲明、初始化和遍歷方法。能用字符串處理簡單文本問題&#xff08;如字符計數、回文判斷&#xff09;。1 一維數組 基本概念 比喻&#xff1a; 數組就像“儲物柜”&…

C# 網口demo

bool _testStatus false; private void btnOpsStart_Click(object sender, EventArgs e) {int delay Convert.ToInt32(txtdelay.Text.Trim());txtView.Clear();txtView.AppendText("******************************************開始烤機*******************************…

MATLAB 安裝 ACADO 的完整步驟

? MATLAB 安裝 ACADO 的完整步驟 &#x1f4e6; 一、準備工作 1. 下載 ACADO Toolkit 官方地址&#xff1a;https://github.com/acado/acado 2. 解壓 ACADO 到你指定的路徑&#xff0c;例如&#xff1a; D:\user\acado-master建議路徑中 不要包含中文或空格。 &#x1f9f…

[逆向工程]160個CrackMe入門實戰之Afkayas.1.Exe解析(二)

[逆向工程]160個CrackMe入門實戰之Afkayas.1.Exe解析&#xff08;二&#xff09; 一、前言 在逆向工程的學習路徑上&#xff0c;CrackMe程序是初學者最好的練手材料。今天我們要分析的是160個CrackMe系列的第二題——Afkayas.1.Exe。這個程序由Afkayas編寫&#xff0c;難度為★…

本地電腦安裝Dify|內網穿透到公網

1.安裝Docker Docker: Accelerated Container Application Development 2.添加 PATH 3.安裝Dify https://github.com/langgenius/dify.git 把.env.example文件名改為.env 4.更換鏡像源 {"builder": {"gc": {"defaultKeepStorage": "20G…

數據結構自學Day6 棧與隊列

1. 棧其實棧與隊列仍然屬于線性表&#xff08;有n個元素構成的集合&#xff0c;邏輯結構呈現線形&#xff09;線形表&#xff1a;順序表&#xff0c;鏈表&#xff0c;棧&#xff0c;隊列&#xff0c;串&#xff08;字符串&#xff09;棧&#xff08;Stack&#xff09;是一種線性…

Java 異常處理詳解:從基礎語法到最佳實踐,打造健壯的 Java 應用

作為一名 Java 開發工程師&#xff0c;你一定遇到過運行時錯誤、空指針異常、文件找不到等問題。Java 提供了強大的異常處理機制&#xff0c;幫助我們優雅地捕獲和處理這些錯誤。本文將帶你全面掌握&#xff1a;Java 異常體系結構try-catch-finally 的使用throw 與 throws 的區…

Fiddler弱網測試實戰指南

Fiddler是一個常用的網絡抓包工具&#xff0c;它也可以用來模擬弱網環境進行測試。 在測試時需要用到弱網測試&#xff0c;也就是在信號差、網絡慢的情況下進行測試。比如&#xff0c;用戶在地鐵、電梯、地下車庫等場景經常會遇到會話中斷、超時等情況&#xff0c;這種就屬于弱…

解決Vue頁面黑底紅字遮罩層報錯:Unknown promise rejection reason (webpack-internal)

vue前端頁面彈出黑底紅色報錯遮罩層報錯&#xff1a;具體報錯信息&#xff1a;Uncaught runtime errors: ERROR Unknown promise rejection reasonat handleError (webpack-internal:///./node_modules/webpack-dev-server/client/overlay.js:299:58)at eval (webpack-internal…

構建 Go 可執行文件鏡像 | 探索輕量級 Docker 基礎鏡像(我應該選擇哪個 Docker 鏡像?)

文章目錄構建 Go 可執行文件鏡像典型用途探索輕量級 Docker 基礎鏡像構建 Go 可執行文件鏡像 golang:1.23.0-bullseye 是官方 Go 鏡像的一個 “build-stage” 版,用來構建 Go 可執行文件&#xff0c;而不是把它當成最終運行鏡像。 dockerhub官方&#xff1a;https://hub.dock…