【发布时间】:2012-11-14 14:19:28
【问题描述】:
我正在创建一个类似钢琴卷的界面,就像您可能在 Ableton 这样的 DAW 中找到的界面,看起来像这样 http://www.abletonlife.com/wp-content/uploads/2010/04/midi-track-big.jpg 。网格代表一个画布,用于绘制要播放的音符,红色方块是要播放的音符。双击空白处创建新笔记,拖动边可以改变笔记的长度。
我是网络开发的新手,所以我在看什么是正确的架构时遇到了一些麻烦。以我有限的知识,以下是我能想到的架构。
1) 水平弹性盒的行。
display: box;
box-orient: horizontal;
box-flex: 1;
类似这样的东西,http://jsfiddle.net/ZgzNw/。
优点:
调整浏览器窗口大小时,浏览器会自动
处理笔记的大小调整,因此网格。调整 div/notes 的大小也很容易处理,以便放大和缩小以及更改量化值。-
所有位置的所有笔记都已经存在,当双击“创建”一个新笔记时,你所要做的就是改变那个笔记的css(变成红色)等等。
李>
缺点:
- 由于网格中的每个空间都有一个div,即使是没有音符要播放的空白空间,也会有很多div。浏览器可以处理数千个 div 吗?举个极端的例子,如果有一个 32 分音符量化,一首 200BPM 的歌曲每分钟有 50 个小节,如果一首 10 分钟的歌曲,那就是 500 个小节。回到上面的 jsfiddle 示例并设置 measure=500 和 quant=32,几秒钟后我在 Chrome 开发人员工具控制台中收到以下错误“未捕获 RangeError:超出最大调用堆栈大小”。这是在这段 javascript 中创建 div 时,如果我将数字降低到 300 左右,它可以创建 div,但是事情变得迟钝。
2) 使用宽度=1px 的 div 作为网格的垂直线创建网格。动态创建新的笔记 div,根据鼠标单击的位置手动定位它们(使用位置:浮动?)。
优点:
- 只有一个用于实际注释的 div,所以不要让方法 1) 的缺点成为问题
缺点:
- 必须手动计算所有内容,将新创建的笔记放在哪里,放大/缩小意味着重新定位网格的垂直标记,以及计算笔记 div 的新大小。这主要是在方法 1 中自动处理的。
我确信我描述的这两种方法有更多的架构和优缺点,但我从未创建过任何 Web 应用程序,我的 Web 开发经验的范围是我已经完成的教程最后两周自学。
我想我的问题是创建我所描述的这个钢琴卷界面的最佳架构是什么?特别是 UI 表示,而不是支持模型。
【问题讨论】:
-
这听起来像是你实际上最好使用canvas 的东西。即时计算是唯一可行的方法。 “浏览器可以处理数千个 div 吗?”是的,但它不会对此感到高兴,每个
<div>都存储了大量信息,在计算和渲染页面时会占用大量内存,然后占用 CPU。 -
就我个人而言,我不会使用第一个示例。由于经常使用音乐软件和钢琴卷(主要是 Ableton Live 和 Maschine),当我调整窗口大小时,我希望在视口中看到更长的部分。因此,假设我在 400 像素的浏览器宽度上看到四个条,我希望在 500 像素上看到 5 个条。所以我会把缩放功能(水平和垂直)分开而不是相对于视口大小。
-
@insertusernamehere,实际上在 Ableton Live 中,您在调整窗口大小时会看到固定数量的条/时间,您必须放大/缩小才能看到更多时间/条。无论如何,调整窗口大小时的任一功能都可以使用第一种方法实现,我对高级架构的优缺点更感兴趣。
-
其实我就是这么说的。 :)
标签: javascript html css web-applications