我正在创建一个类似钢琴卷的界面,就像你可能在诸如ableton之类的DAW中找到的界面,看起来像这样http://www.abletonlife.com/wp-content/uploads/2010/04/midi-track-大.jpg 网格代表一个画布,用于绘制要播放的音符,红色方块是要播放的音符。您可以双击空白区域以创建新注释,并且可以拖动边缘以更改注释的长度。
我是 Web 开发的新手,所以我很难看到正确的架构可能是什么。以我有限的知识,以下是我能想到的架构。
1) 水平弹性盒的行。
display: box;
box-orient: horizontal;
box-flex: 1;
像这样的东西,http://jsfiddle.net/ZgzNw/。
优点:
调整浏览器窗口大小时,浏览器将自动
处理注释大小的调整,从而调整网格大小。调整 divs/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 开发经验的程度是我在过去 2 中完成的教程几个星期来自学。
我想我的问题是创建我所描述的这个钢琴卷界面的最佳架构是什么?特别是 UI 表示,而不是支持模型。