50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | Sound Board(音响控制面板)

article/2025/6/30 22:33:55

📅 我们继续 50 个小项目挑战!—— SoundBoard 组件

  • 仓库地址:https://github.com/SunACong/50-vue-projects

  • 项目预览地址:https://50-vue-projects.vercel.app/

在这里插入图片描述


🎯 组件目标

  • 实现一个响应式按钮面板,点击某一按钮即可播放对应音频。

  • 点击新按钮时自动停止其他音效,确保每次只有一个音频在播放。

  • 利用 Vue3 组合式 API + 原生 DOM 控制,打造高效小巧的功能组件。

🛠️ 技术实现点

  • 使用 Vue3 <script setup> 编写逻辑,简洁明了。

  • 利用 ref 存储音频列表数据,支持动态遍历。

  • 使用 document.getElementById 原生 API 获取音频 DOM 元素,控制播放行为。

  • Tailwind CSS 控制按钮样式及悬停动画,增强交互感。

🧱 组件实现源码(含注释)

<template><div class="flex h-screen items-center gap-10 justify-center text-black"><!-- 遍历音效列表,渲染按钮,每个按钮对应一个 <audio> 元素 --><divclass="rounded-lg border-2 bg-gray-300 px-8 py-4 hover:scale-105 hover:bg-gray-400"v-for="(item, index) in soundList":key="item.id"@click="handlePlayAudio(index)">{{ item.name }}<audio :id="item.id" :src="item.src"></audio></div></div>
</template><script setup>
import { ref } from 'vue'// 音效播放控制函数
const handlePlayAudio = (index) => {// 暂停所有音效,重置播放进度soundList.value.forEach((sound) => {const audio = document.getElementById(sound.id)audio.pause()audio.currentTime = 0})// 播放当前选中的音效const selectedAudio = document.getElementById(soundList.value[index].id)selectedAudio.play()
}// 音效列表:可以根据需求拓展为动态加载或远程配置
const soundList = ref([{ id: 1, name: 'applause 👏', src: '/src/assets/sounds/applause.mp3' },{ id: 2, name: 'boo 😒', src: '/src/assets/sounds/boo.mp3' },{ id: 3, name: 'gasp 😲', src: '/src/assets/sounds/gasp.mp3' },{ id: 4, name: 'tada 🎉', src: '/src/assets/sounds/tada.mp3' },{ id: 5, name: 'victory 🏆', src: '/src/assets/sounds/victory.mp3' },{ id: 6, name: 'wrong ❌', src: '/src/assets/sounds/wrong.mp3' },
])
</script>

💡 样式与逻辑讲解

  • 样式部分
类名功能描述
flex h-screen items-center justify-center垂直居中音效按钮面板
gap-10按钮之间间距
rounded-lg border-2 px-8 py-4按钮基础样式
hover:scale-105 hover:bg-gray-400鼠标悬停时的放大 + 背景变化动画
text-black 文字颜色
  • 逻辑部分
函数功能
handlePlayAudio(index)播放第 index 个音效,并停止其他音频
soundList音效数据源,每个元素包含 id、name、src 三个字段
document.getElementById()获取原生 DOM 元素,用于控制 标签

🧾 常量定义 + 组件路由建议

constants/index.js 添加组件预览常量:

export const projectList = [
{id: 9,title: 'Sound Board',image: 'https://50projects50days.com/img/projects-img/9-sound-board.png',link: 'SoundBoard',},
]

router/index.js 中添加路由选项:

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

🧾 总结

本组件展示了如何在 Vue3 中结合 DOM 操作与响应式数据,实现一个轻量级、趣味性十足的音效选择器,非常适合作为日常 UI 组件库的娱乐增强模块。


👉 下一篇,我们将完成 Dad Jokes组件,一个利用公共的API获取数据随机生成笑话的组件!🚀


http://www.hkcw.cn/article/uOttdusEMw.shtml

相关文章

【目标检测数据集】电动车驾驶员戴头盔相关数据集

一、TWHD 数据集 介绍 随着国家惩治行车不戴头盔违法行为的力度不断加大&#xff0c;双轮车&#xff08;电动车与摩托车&#xff09;头盔检测任务也越来越重要。双轮车佩戴头盔检测数据集&#xff08;two wheeler helmet dataset&#xff0c;TWHD&#xff09;收集了来自开源数…

【机器学习基础】机器学习入门核心:数学基础与Python科学计算库

机器学习入门核心&#xff1a;数学基础与Python科学计算库 一、核心数学基础回顾1. 函数与导数2. Taylor公式3. 概率论基础4. 统计量5. 重要定理6. 最大似然估计&#xff08;MLE&#xff09;7. 线性代数 二、Python科学计算库精要1. NumPy&#xff1a;数值计算核心2. SciPy&…

【存储基础】SAN存储基础知识

文章目录 1. 什么是SAN存储&#xff1f;2. SAN存储组网架构3. SAN存储的主要协议SCSI光纤通道&#xff08;FC&#xff09;协议iSCSIFCoENVMe-oFIB 4. SAN存储的关键技术Thin Provision&#xff1a;LUN空间按需分配Tier&#xff1a;分级存储Cache&#xff1a;缓存机制QoS&#x…

缓解颈部不适的营养补给之道

对于颈部常有不适的人群而言&#xff0c;合理的营养补充是维持身体良好状态的重要方式。日常饮食中&#xff0c;蛋白质是不容小觑的营养元素。瘦肉、蛋类、奶类以及豆制品都是优质蛋白质的来源&#xff0c;它们能够帮助增强肌肉力量&#xff0c;为颈部提供更好的支撑。​ 维生…

ck-editor5的研究 (6):进一步优化页面刷新时,保存提示的逻辑

文章目录 一、前言二、实现步骤1. 第一步: 引入 PendingActions 插件2. 第二步&#xff1a;注册事件3. 第三步&#xff1a;点击保存按钮时&#xff0c;控制状态变化 三、测试效果和细节四、总结 一、前言 在上一篇文章中 ck-editor5的研究 (5)&#xff1a;优化-页面离开时提醒…

手机归属地查询接口如何用Java调用?

一、什么是手机归属地查询接口&#xff1f; 是一种便捷、高效的工具&#xff0c;操作简单&#xff0c;请求速度快。它不仅能够提高用户填写地址的效率&#xff0c;还能帮助企业更好地了解客户需求&#xff0c;制定个性化的营销策略&#xff0c;降低风险。随着移动互联网的发展…

列表推导式(Python)

[表达式 for 变量 in 列表] 注意&#xff1a;in后面不仅可以放列表&#xff0c;还可以放range ()可迭代对象 [表达式 for 变量 in 列表 if 条件]

【机器学习|评价指标4】正预测值(PPV)、负预测值(NPV)、假阴性率(FNR)、假阳性率(FPR)详解,附代码。

【机器学习|评价指标4】正预测值&#xff08;PPV&#xff09;、负预测值&#xff08;NPV&#xff09;、假阴性率&#xff08;FNR&#xff09;、假阳性率&#xff08;FPR&#xff09;详解&#xff0c;附代码。 【机器学习|评价指标4】正预测值&#xff08;PPV&#xff09;、负预…

【Delphi】实现在多显示器时指定程序运行在某个显示器上

在多显示器时代&#xff0c;经常会出现期望将程序运行在某个指定的显示器上&#xff0c;特别是在调试程序的时候&#xff0c;期望切换分辨率&#xff0c;单步调试时&#xff0c;此时容易导致互相卡住&#xff0c;非常不方便&#xff0c;但是通过指定程序运行在不同的显示器上就…

渗透实战PortSwigger Labs AngularJS DOM XSS利用详解

本Lab学习到关于AngularJS的 xss 漏洞利用 直接输入回显页面&#xff0c;但是把<>进了 html 编码了 当我们输入{{11}}&#xff0c;没有当作字符处理&#xff0c;而是执行了 {{}} 是多种前端框架&#xff08;如 Vue、Angular、Django 模板等&#xff09;中常见的模板插值语…

配置刷新技术

FPGA 片上三模冗余( TMR) 设计结合配置刷新( Scrubbing) 的防护方法能够有效地提高系统的抗单粒子翻转性能。 三模冗余的方法利用模块三冗余及三取二自动表决来掩蔽错误&#xff0c;但是如果错误积累到一定程度&#xff0c;导致同时有两个或两个以上模块发生翻转错误&#xff0…

计算机科技笔记: 容错计算机设计05 n模冗余系统 其他复杂结构

目录 NMR变体动态冗余系统混合冗余系统筛除新系统 NMR变体 V是表决器 动态冗余系统 优点像N模并行系统&#xff0c;后边加一个故障检测和系统重构百分之90以上的故障都是瞬时故障&#xff0c;检测到故障重新运行即可如果出现老化&#xff0c;可以用Spare-1替代 混合冗余系…

HealthBench医疗AI评估基准:技术路径与核心价值深度分析(上)

引言:医疗AI评估的新范式 在人工智能技术迅猛发展的当下,医疗AI系统已逐渐从实验室走向临床应用。然而,医疗领域的特殊性要求这些系统不仅需要在技术指标上表现出色,更需要在实际临床场景中展现出可靠、安全且有效的性能。长期以来,医疗AI评估领域面临着三个核心挑战:评…

中国就业人口现状分析与未来趋势预测

目录 1、核心摘要 2、就业人口总量与趋势 就业人口规模 产业结构变化 3、未来就业趋势 2030年就业变革 人口结构影响 技能需求变化 4、年龄结构与老龄化影响 老龄化现状 抚养比变化 6、老龄化经济影响 消费结构变化 创新活力 7、行业分布与数字经济 行业就业结…

三种经典算法优化无线传感器网络(WSN)覆盖(SSA-WSN、PSO-WSN、GWO-WSN),MATLAB代码实现

三种经典算法优化无线传感器网络(WSN)覆盖&#xff08;SSA-WSN、PSO-WSN、GWO-WSN&#xff09;&#xff0c;MATLAB代码实现 目录 三种经典算法优化无线传感器网络(WSN)覆盖&#xff08;SSA-WSN、PSO-WSN、GWO-WSN&#xff09;&#xff0c;MATLAB代码实现效果一览基本介绍程序设…

SQL Transactions(事务)、隔离机制

目录 Why Transactions? Example: Bad Interaction Transactions ACID Transactions COMMIT ROLLBACK How the Transaction Log Works How Data Is Stored Example: Interacting Processes Interleaving of Statements Example: Strange Interleaving Fixing the…

Linux(10)——第二个小程序(自制shell)

目录 ​编辑 一、引言与动机 &#x1f4dd;背景 &#x1f4dd;主要内容概括 二、全局数据 三、环境变量的初始化 ✅ 代码实现 四、构造动态提示符 ✅ 打印提示符函数 ✅ 提示符生成函数 ✅获取用户名函数 ✅获取主机名函数 ✅获取当前目录名函数 五、命令的读取与…

MySQL:视图+用户管理+访问+连接池原理

一、视图 视图是一个虚拟表&#xff0c;其内容由查询定义。同真实的表一样&#xff08;相当于是把查询的内容当成一个临时表来使用&#xff09;&#xff0c;视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表&#xff0c;基表的数据变化也会影响到视图。 1.1 为…

【2025年B卷】华为OD-100分-字符串重新排列、字符串重新排序

专栏订阅🔗 -> 赠送OJ在线评测 字符串重新排列、字符串重新排序 问题描述 给定一个字符串 s s s,

LearnOpenGL-笔记-其十三

PBR(Physically Based Rendering) 什么是基于物理的渲染&#xff1f;简单地说&#xff0c;还记得我们之前学习的法线贴图的内容吗&#xff1f;我们希望不修改物体实际几何形状的前提下去修改表面的法线方向来实现不同的光照效果&#xff0c;实现这个内容的基础就是我们的光照效…