数字钢琴项目简介
2024 年 5 月 8 日

欢迎进入通过我分享的经验,从零开始创建数字钢琴的网络开发和设计世界的精彩旅程。这个项目不仅仅展示了技术技能,更是一个生动的例证,展示了创造力和编码如何和谐地交织在一起,将数字杰作带入生活。

无论您是经验丰富的开发者、设计爱好者还是对网页开发的复杂性感到好奇,本教程旨在提供有价值的见解、实用的技巧和一些灵感。让我们深入探讨将一个简单的想法转化为交互性和视觉上吸引人的数字钢琴的迷人过程。

如果您想观看视频,可以点击下面的YouTube视频观看:

所有代码都可以在 GitHub (opens new window) 免费获取(您可以在GitHub链接找到)。 设计钢琴在 Figma 中

旅程始于设计阶段,在这里我使用 Figma 创建我们数字钢琴的界面。Figma 以其适应性和易用性而闻名,是这项任务的绝佳工具。

奠定基础

我首先在 Figma 中设置一个新的设计文件,最初专注于基本布局。这涉及确定钢琴的尺寸以及在屏幕上的位置。

设计钢琴键

在 Figma 中设计阶段的关键是设置和使用网格。网格作为确保设计元素对齐的基础工具。 我通过定义网格系统来启动设计过程。 这个网格有助于在整个钢琴界面中保持一致的间距和对齐。 这对于准确定位钢琴键特别重要,因为它们的放置需要紧密模仿传统钢琴的布局。

在这里,我们设计了白色和黑色键。 黑键较短,位置稍高,就像真钢琴上一样。 钢琴的发展与语义化HTML的使用

从设计到开发的过渡,第一步是建立数字钢琴的基本HTML结构。我首先创建一个基础的HTML文档,用于容纳我们钢琴的所有组件。

创建容器

按钮被组织在一个父容器内,保持干净和逻辑的HTML结构,反映了按钮布局的清晰性和一致性。 传统钢琴的布局。

使用按钮作为钢琴键 #

在本阶段的关键方面,正如教程中所详细介绍的,是使用元素作为钢琴键。与使用元素不同,我选择为每个键使用按钮元素,因为它们在语义上更合适且易于访问。

按钮在本质上是交互式和易于访问的,使它们成为我们钢琴键的理想选择。它们支持键盘焦点和点击交互,这对我们数字钢琴的功能至关重要。

对于每个键,我创建一个按钮元素。通过类名区分白色和黑色键,以便稍后应用特定样式和功能。 在SASS和JavaScript阶段。

我还确保每个按钮都用aria-label正确标记,为屏幕阅读器用户提供有关每个键的功能和说明的必要信息。

为了使钢琴更加用户友好,特别是对于初学者或学习音乐的人,我为每个键添加了提示,这有助于识别用户可以使用哪些键盘键来演奏音符。 使用SCSS为钢琴按键添加样式

接下来,我将深入讨论样式方面,具体使用SASS或SCSS - 一种强大的CSS扩展语言。您将看到我的组织SASS文件和利用其高级功能的方法,通过使用Maps而不是Variables来创建简单的设计系统和组件。

利用SCSS Maps进行主题化 #

我的SCSS设置的一个关键特性是使用SCSS maps,特别是$theme$piano maps。这些maps对于组织和管理钢琴设计中使用的各种颜色、尺寸和其他样式属性至关重要。

$theme map包含了色彩方案和其他定义钢琴整体美学的一般设计元素。这种方法可以轻松进行调整和主题化,确保设计的变更可以快速且一致地进行。 $piano映射具体保存与钢琴设计相关的属性,如键盘尺寸、边框样式和位置。这种关注点的分离使得样式处理更易管理、模块化,并可以从一个地方轻松更新。

此外,如果您有多个主题,您可以覆盖它们。

如何创建新主题: #

您可以创建新的深色主题,或者您可以创建多个具有相同键但不同值的映射。 合并主题:将$theme$dark-theme合并

完成此步骤后,您可以创建一个包含更新值的新Sass映射。

重新将$theme重新分配给$theme-dark:这是您切换主题的地方。 切换主题。

然后立即将新颜色应用于主题和前端。

美化白色按键 #

白色按键的样式注重简约和优雅。使用$piano映射中的属性,我为每个白色按键定义了高度、宽度和背景颜色。

其他样式包括边框属性和微妙的阴影效果,以营造一种深度感。这些阴影对于实现让按键具有触感和互动性的3D效果尤为重要。 处理黑键需要采用不同的方法。它们较小且位置不同。在这里,我使用SASS映射中的数值来定义它们独特的尺寸和位置。

黑键的颜色和阴影效果经过调整,使其在白键上显眼。这涉及设置较暗的颜色,并调整阴影的不透明度和扩散,以增强3D效果。 在数字钢琴设计中的一个突出特点是按键被按下时的逼真响应。这种效果是通过在SCSS中仔细设计.is-pressed状态来实现的,无论是对黑键还是白键。

对于黑键,按下一个键会触发一个由perspective(1500px) rotateX(-6deg)定义的变换。这种效果创造了视觉深度,使按键看起来好像被按下。较大的透视值增强了深度错觉,而rotateX倾斜模拟了向下运动。 白键:更微妙的动作

相比之下,白色键展现出更微妙的动作,使用 perspective(330px) rotateX(-2deg)。这种差异反映了白色钢琴键的独特物理特性。变换效果不那么明显,但同样有效地传达了按键被按下的感觉。

两种键类型都使用 transition: transform 0.2s 来确保动画流畅自然。这种精心的定时使交互感觉灵敏和直观。

使用原生JavaScript引入互动性

当我接近教程的最后部分时,我深入探讨如何使用原生JavaScript添加互动性。 使用JavaScript实现数字钢琴的功能。这个阶段非常关键,因为它将数字钢琴从静态设计转变为交互式乐器。

设置JavaScript环境 #

首先,我讨论了JavaScript文件设置。鉴于我们使用Webpack,我解释了如何使用动态导入样式以及Webpack如何有效地编译它们。

为了保持一个清晰的代码库,我强调了分离关注点的重要性。因此,我创建了一个专门的JavaScript文件夹,与我们用于样式的结构相对应。

创建钢琴组件 #

编写功能的第一步是创建一个名为Piano.js的组件。这个组件被构建为构造函数,可以在应用的不同部分重复使用。

我确保使用导出运算符导出钢琴组件。 Piano 函数返回一个包含 playNoteplayNoteByKey 函数的对象。这个返回语句使这些函数在应用程序的其他部分中可访问,遵循模块模式的原则。

Piano.js 文件使用模块化模式,这是 JavaScript 中常见且有效的方法,用于封装功能。它首先从 keybinds 模块中导入 keyboardMap。这个映射非常重要,因为它将键盘键与音符对应起来,这是钢琴交互性的重要方面。

playNote 函数 audio.play() 方法随后被调用以播放音符。这简单而有效的一行代码是钢琴声音功能的核心。 #

这个函数的一个关键方面是使用 HTML 音频元素,这是一个强大的 Web API,用于动态操作音频文件。这个 API 允许播放和暂停音频,这对于像数字钢琴这样的 Web 应用程序非常重要。

index.js 导入 #

index.js 或我们的入口点中导入样式和组件。

import "./styles/main.scss";
导入主要的 SASS 样式表,确保所有样式都应用于钢琴界面。

import { Piano } from "./javascript/Piano";
导入 Piano 函数,封装了播放音符的核心功能。

import { keyboardMap } from "./javascript/keybinds";
导入将键盘键映射到钢琴音符的映射,这是至关重要的。 启用键盘交互的过程中。

初始化数字钢琴

const DigitalPiano = Piano();
通过调用Piano函数对数字钢琴进行初始化。这个实例DigitalPiano现在具有播放音符的方法。

创建UI音符键绑定映射

该函数创建了钢琴键的数据属性与UI元素之间的映射。 该映射用于在播放音符时有效地找到相应的DOM元素。

处理鼠标事件 #

handleMouseDownhandleMouseUp 是每个键的鼠标按下和松开事件的事件处理程序。当按下键时(鼠标按下),它会添加 .is-pressed 类以获得视觉反馈并播放相应音符。在鼠标松开时,它会移除 is-pressed 类。 handleDocumentMouseUp 从所有键中移除 .is-pressed 类,确保如果鼠标在键外释放,则释放任何卡住的键。 ### 处理键盘事件

findNoteAndNodeFromKeyPress 是一个实用函数,根据键盘事件找到音符和相应的 DOM 节点。

handleDocumentKeyDownhandleDocumentKeyUp 是键盘事件的事件处理程序。它们使用 findNoteAndNodeFromKeyPress 来播放相应的音符,并根据按下和松开事件切换 .is-pressed 类。

添加事件监听器 #

mouseupkeydownkeyup 添加文档级别的事件监听器。 处理全局操作,如在释放鼠标按钮时释放所有键,并根据键盘输入播放音符。每个钢琴键节点都有mousedownmouseup事件侦听器,用于处理单个键的交互。

结论 #

在这里,我们完成了数字钢琴创作交响乐中的最后一个和弦。通过这段旅程,我们从 Figma 中的概念草图到用 JavaScript 呈现的功能性交互键,导航了设计和开发的和谐融合。

这个项目不仅仅是关于构建一个乐器;它是关于协调不同技术,创造出美丽而实用的东西。希望这个项目能激励您探索设计和开发之间的无限可能性。 这段经历不仅让你深入了解了网页开发和设计,也启发你在未来的项目中融合艺术和技术。

感谢您加入我一起走过这段悦耳的编码之旅。继续尝试,持续学习,让您的创造力演奏下一首曲子!

如果您想观看视频,可以点击下方的YouTube视频:

所有代码都可以免费在GitHub (opens new window)上找到(您可以在视频描述中找到GitHub链接)。